|
@@ -16,56 +16,75 @@ locals {
|
|
|
|
|
|
resource "aws_s3_bucket" "this" {
|
|
|
bucket = local.bucket_name
|
|
|
- acl = "log-delivery-write"
|
|
|
tags = var.tags
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_s3_bucket_acl" "log_bucket_acl" {
|
|
|
+ bucket = aws_s3_bucket.this.id
|
|
|
+ acl = "log-delivery-write"
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_s3_bucket_logging" "this" {
|
|
|
+ bucket = aws_s3_bucket.this.id
|
|
|
+
|
|
|
+ # Conformance Pack for CIS requires access logs on all S3 buckets and is a best
|
|
|
+ # practice.
|
|
|
+ #
|
|
|
+ # Logging to the bucket itself is allowed, but if we ingest into splunk, make
|
|
|
+ # sure we don't set up a feedback loop (splunk accesses s3 bucket to get a log
|
|
|
+ # which creates a log which leads to splunk accessing the s3 bucket)
|
|
|
+ target_bucket = local.bucket_name
|
|
|
+ target_prefix = "${data.aws_caller_identity.current.account_id}-${data.aws_region.current.name}-${local.bucket_name}"
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+resource "aws_s3_bucket_versioning" "this" {
|
|
|
+ bucket = aws_s3_bucket.this.id
|
|
|
+
|
|
|
+ versioning_configuration {
|
|
|
+ status = var.versioning_enabled == true ? "Enabled" : "Suspended"
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+resource "aws_s3_bucket_server_side_encryption_configuration" "this" {
|
|
|
+ bucket = aws_s3_bucket.this.id
|
|
|
|
|
|
- dynamic "lifecycle_rule" {
|
|
|
- iterator = rule
|
|
|
+ rule {
|
|
|
+ apply_server_side_encryption_by_default {
|
|
|
+ sse_algorithm = "aws:kms"
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_s3_bucket_lifecycle_configuration" "this" {
|
|
|
+ bucket = aws_s3_bucket.this.id
|
|
|
+ count = length(var.lifecycle_rules) > 0 ? 1 : 0 # handle the case of no lifecycle rules
|
|
|
+
|
|
|
+ dynamic "rule" {
|
|
|
for_each = var.lifecycle_rules
|
|
|
|
|
|
content {
|
|
|
id = rule.value.id
|
|
|
- enabled = rule.value.enabled
|
|
|
- prefix = lookup(rule.value, "prefix", null)
|
|
|
- abort_incomplete_multipart_upload_days = lookup(rule.value, "abort_incomplete_multipart_upload_days", 0)
|
|
|
+ status = rule.value.enabled == true ? "Enabled" : "Disabled"
|
|
|
+
|
|
|
+ abort_incomplete_multipart_upload {
|
|
|
+ days_after_initiation = lookup(rule.value, "abort_incomplete_multipart_upload_days", 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ filter {
|
|
|
+ prefix = lookup(rule.value, "prefix", null)
|
|
|
+ }
|
|
|
|
|
|
expiration {
|
|
|
days = lookup(rule.value, "expiration", 2147483647)
|
|
|
}
|
|
|
|
|
|
noncurrent_version_expiration {
|
|
|
- days = lookup(rule.value, "noncurrent_version_expiration", 2147483647)
|
|
|
+ noncurrent_days = lookup(rule.value, "noncurrent_version_expiration", 2147483647)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- server_side_encryption_configuration {
|
|
|
- rule {
|
|
|
- apply_server_side_encryption_by_default {
|
|
|
- sse_algorithm = "aws:kms"
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- versioning {
|
|
|
- enabled = var.versioning_enabled
|
|
|
- }
|
|
|
-
|
|
|
- lifecycle {
|
|
|
- ignore_changes = [versioning[0].mfa_delete]
|
|
|
- }
|
|
|
-
|
|
|
- # Conformance Pack for CIS requires access logs on all S3 buckets and is a best
|
|
|
- # practice.
|
|
|
- #
|
|
|
- # Logging to the bucket itself is allowed, but if we ingest into splunk, make
|
|
|
- # sure we don't set up a feedback loop (splunk accesses s3 bucket to get a log
|
|
|
- # which creates a log which leads to splunk accessing the s3 bucket)
|
|
|
- logging {
|
|
|
- target_bucket = local.bucket_name
|
|
|
- target_prefix = "${data.aws_caller_identity.current.account_id}-${data.aws_region.current.name}-${local.bucket_name}"
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
resource "aws_s3_bucket_public_access_block" "this" {
|