From ece54bbb62ff0645b597eebdf8591ac925c0cba4 Mon Sep 17 00:00:00 2001 From: Karol Czeryna Date: Tue, 8 Jun 2021 16:32:36 +0100 Subject: [PATCH] NLB Log Delivery Support --- README.md | 18 ++++++++++++++++++ main.tf | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++- variables.tf | 6 ++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 97bae96e..a2438d32 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ These features of S3 bucket configurations are supported: - object locking - Cross-Region Replication (CRR) - ELB log delivery bucket policy +- NLB log delivery bucket policy ## Usage @@ -48,6 +49,22 @@ module "s3_bucket_for_logs" { } ``` +### Bucket with NLB access log delivery policy attached + +```hcl +module "s3_bucket_for_logs" { + source = "terraform-aws-modules/s3-bucket/aws" + + bucket = "my-s3-bucket-for-logs" + acl = "log-delivery-write" + + # Allow deletion of non-empty bucket + force_destroy = true + + attach_nlb_log_delivery_policy = true +} +``` + ## Conditional creation Sometimes you need to have a way to create S3 resources conditionally but Terraform does not allow to use `count` inside `module` block, so the solution is to specify argument `create_bucket`. @@ -122,6 +139,7 @@ No modules. | [acl](#input\_acl) | (Optional) The canned ACL to apply. Defaults to 'private'. Conflicts with `grant` | `string` | `"private"` | no | | [attach\_deny\_insecure\_transport\_policy](#input\_attach\_deny\_insecure\_transport\_policy) | Controls if S3 bucket should have deny non-SSL transport policy attached | `bool` | `false` | no | | [attach\_elb\_log\_delivery\_policy](#input\_attach\_elb\_log\_delivery\_policy) | Controls if S3 bucket should have ELB log delivery policy attached | `bool` | `false` | no | +| [attach\_nlb\_log\_delivery\_policy](#input\_attach\_elb\_log\_delivery\_policy) | Controls if S3 bucket should have NLB log delivery policy attached | `bool` | `false` | no | | [attach\_policy](#input\_attach\_policy) | Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy) | `bool` | `false` | no | | [attach\_public\_policy](#input\_attach\_public\_policy) | Controls if a user defined public bucket policy will be attached (set to `false` to allow upstream to apply defaults to the bucket) | `bool` | `true` | no | | [block\_public\_acls](#input\_block\_public\_acls) | Whether Amazon S3 should block public ACLs for this bucket. | `bool` | `false` | no | diff --git a/main.tf b/main.tf index 77a4c94a..786adcc3 100644 --- a/main.tf +++ b/main.tf @@ -1,5 +1,5 @@ locals { - attach_policy = var.attach_elb_log_delivery_policy || var.attach_deny_insecure_transport_policy || var.attach_policy + attach_policy = var.attach_elb_log_delivery_policy || var.attach_nlb_log_delivery_policy || var.attach_deny_insecure_transport_policy || var.attach_policy } resource "aws_s3_bucket" "this" { @@ -247,6 +247,7 @@ data "aws_iam_policy_document" "combined" { source_policy_documents = compact([ var.attach_elb_log_delivery_policy ? data.aws_iam_policy_document.elb_log_delivery[0].json : "", + var.attach_nlb_log_delivery_policy ? data.aws_iam_policy_document.nlb_log_delivery[0].json : "", var.attach_deny_insecure_transport_policy ? data.aws_iam_policy_document.deny_insecure_transport[0].json : "", var.attach_policy ? var.policy : "" ]) @@ -280,6 +281,57 @@ data "aws_iam_policy_document" "elb_log_delivery" { } } +# NLB + +data "aws_iam_policy_document" "nlb_log_delivery" { + count = var.create_bucket && var.attach_nlb_log_delivery_policy ? 1 : 0 + + statement { + sid = "AWSLogDeliveryWrite" + + principals { + type = "Service" + identifiers = ["delivery.logs.amazonaws.com"] + } + + effect = "Allow" + + actions = [ + "s3:PutObject", + ] + + resources = [ + "${aws_s3_bucket.this[0].arn}/*", + ] + + condition { + test = "StringEquals" + variable = "s3:x-amz-acl" + values = ["bucket-owner-full-control"] + } + } + + statement { + sid = "AWSLogDeliveryAclCheck" + + effect = "Allow" + + principals { + type = "Service" + identifiers = ["delivery.logs.amazonaws.com"] + } + + actions = [ + "s3:GetBucketAcl", + ] + + resources = [ + "${aws_s3_bucket.this[0].arn}", + ] + + } +} + data "aws_iam_policy_document" "deny_insecure_transport" { count = var.create_bucket && var.attach_deny_insecure_transport_policy ? 1 : 0 diff --git a/variables.tf b/variables.tf index f07d4169..ba1f8bbf 100644 --- a/variables.tf +++ b/variables.tf @@ -10,6 +10,12 @@ variable "attach_elb_log_delivery_policy" { default = false } +variable "attach_nlb_log_delivery_policy" { + description = "Controls if S3 bucket should have NLB log delivery policy attached" + type = bool + default = false +} + variable "attach_deny_insecure_transport_policy" { description = "Controls if S3 bucket should have deny non-SSL transport policy attached" type = bool