An Audit Store Whose Retention You Chose
A CloudTrail Lake event data store with the retention decided rather than inherited. The aws provider defaults retention to 2555 days; on the default pricing option AWS includes 366 and bills the rest, so the provider default quietly buys 2,189 days of storage. This module defaults to 366, prints the billed days, and keeps termination protection on.
Verification
Static-verifiedPassed: validated and lint-clean (provider-schema-validated for AWS/Azure/GCP; Terraform-language lint elsewhere).
Conformance
- Static validation (fmt · validate · tflint)
- Security scan clean (Checkov)
- Plan tests (mocked: validation rules · outputs)
Provenance
- SHA-256 checksum
- Signature (pending)
Functional
- Live test pending (no cloud run yet)
Last verified 2026-09-17 · how we verify
Use it from the registry
terraform · opentofumodule "cloudtrail_lake" {
source = "www.iac-bazaar.com/iac-bazaar/aws-cloudtrail-lake/aws"
version = "1.0.0"
}Needs a registry token from /account/tokens. The module itself is free; the account is what identifies you. Full setup: registry docs.
Inputs & outputs
Create a free account to read this module's contract
The declared contract - every input name, type, default and description, plus every output - is shown to signed-in accounts, not to anonymous visitors.
A free account sees the contract of every module in the catalogue. There is no subscription and nothing to buy - the modules are free to download, and they run under Vizier.
Documentation
aws-cloudtrail-lake
A CloudTrail Lake event data store: the management and data events you choose,
queryable with SQL, kept for a period you chose. Works with Terraform and
OpenTofu (>= 1.6), aws provider >= 6.0, < 7.0.
Retention is the bill. The aws provider defaults retention_period to 2555
days. On the default pricing option, one-year extendable, AWS includes storage
for 366 days and charges per GB per month after that - so the provider default
quietly buys 2,189 days of billed storage. This module defaults to 366 days and
names the difference in an output, billed_storage_days.
The provider's ceiling is not AWS's. It validates retention_period between
7 and 2555, while extendable pricing allows 3,653 days and seven-year pricing
allows 2,557. Ten-year retention cannot be expressed through this resource at
all; the module refuses the value rather than letting the provider do it with a
less useful message.
Pricing option changes go one way. Seven-year can be changed to one-year extendable in place. Going the other way means stopping ingestion and creating a new store, so pick with the 25 TB a month threshold in mind, not by trying it.
Deletion is meant to be awkward. Termination protection is on, so
terraform destroy fails until you set termination_protection_enabled = false
and apply. Deletion then starts a seven-day wait, and the store can be restored
within it.
The KMS key is a one-way door twice over. AWS refuses to change or remove
the key once the store is associated with one, and the provider marks it
ForceNew, so editing that line plans a replacement - of the thing holding your
audit history. Set it at creation or not at all, and make sure the key policy
lets cloudtrail.amazonaws.com use the key. With no key the store is still
encrypted, with one CloudTrail manages; a scanner that looks for kms_key_id in
the configuration cannot tell you which of the two you ended up with.
Volume is a choice, not a fact. Management events with
management_event_types = "WriteOnly" keep every change and drop the reads;
excluded_event_sources drops kms.amazonaws.com and rdsdata.amazonaws.com,
which AWS names first when a Lake bill surprises someone. Data events are
per-resource-type, and CloudTrail takes five selectors in total.
Verification
Static validation runs tofu fmt, init, validate, tflint and checkov.
This module has not yet had a live test, so it is published as statically
validated with its live test pending and does not carry the live-tested mark.
Usage code & full reference need an account
The complete copy-paste usage, the full input/output reference, and operational notes are free with an account - shown here and bundled in the download. Sign in and this section fills in.
- Usage
Related modules
aws-config
Recorder, delivery channel, service role and managed rules. Starting the recorder is a separate resource people leave out, so a stopped recorder looks identical to a running one until an investigation finds an empty timeline.
aws-grafana
account_access_type ORGANIZATION lets a workspace query observability data in accounts whose owners never approved it, and SERVICE_MANAGED means AWS wrote those data-source policies. Current account, a role you wrote, and an endpoint narrowed to a prefix list rather than the whole internet.
aws-prometheus
Alerting needs BOTH an alert manager definition and a rule group namespace; with either missing the workspace stores metrics and raises nothing while every dashboard reports it healthy. Without logging_configuration a throttled remote_write likewise produces no metrics, no error and no alert.
aws-cloudtrail
Multi-region trail with log file validation always on, a bucket that blocks public access, versions, encrypts and denies non-TLS, a policy pinned to this trail, optional CloudWatch delivery and opt-in data events.
aws-cloudwatch
A self-contained CloudWatch observability bundle - an encrypted log group with retention, a metric alarm, and a dashboard - that stands up from just a name and points at any real metric.
aws-vpc-flow-logs
Flow logs for an existing VPC in the extended format an investigation needs (flow direction, TCP flags, packet addresses through NAT), at one minute rather than ten, all traffic rather than rejects, to a CloudWatch log group created with retention and your KMS key, or to S3 as Hive-partitioned Parquet when a bucket is given. Partial traffic and the AWS-managed key are accepted by name.