首页 > 解决方案 > Terraform - 更新 S3 访问控制:关于用授权替换 acl 的问题

问题描述

我有一个 S3 存储桶,用作访问日志存储桶。

这是我当前的模块和资源 TF 代码:

module "access_logging_bucket" {
    source = "../../resources/s3_bucket"
    environment = "${var.environment}"
    region = "${var.region}"
    acl = "log-delivery-write"

    encryption_key_alias = "alias/ab-data-key"

    name = "access-logging"
    name_tag = "Access logging bucket"
}

resource "aws_s3_bucket" "default" {
    bucket = "ab-${var.environment}-${var.name}-${random_id.bucket_suffix.hex}"
    acl = "${var.acl}"

    depends_on = [data.template_file.dependencies]

    tags = {
        name = "${var.name_tag}"
        . . .
    }

    lifecycle {
        ignore_changes = [ "server_side_encryption_configuration" ]
    }
}

就我而言,变量acl的默认值是variable "acl" { default = "private" }。并且还如Terraform S3 存储桶属性参考文档中所述。

对于此存储桶,它设置为log-delivery-write.

我想更新它以添加以下授权并删除acl,因为它们相互冲突:

grant {
    permissions = ["READ_ACP", "WRITE"]
    type = "Group"
    uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
}
grant {
    id = data.aws_canonical_user_id.current.id
    permissions = ["FULL_CONTROL"]
    type = "CanonicalUser"
}

我的问题是:

  1. 删除acl属性并添加上述内容grants仍然保持对存储桶的正确访问控制。即,授权配置仍然可以作为访问日志存储桶使用。
  2. 如果我从资源配置中删除 acl,它将使其成为private默认值。这是正确的做法还是应该将其设为空或其他?

在检查一些文档时Log Delivery group发现了这一点,这让我认为我可以继续用我提到的授权替换acl :

日志交付组 – 由 http://acs.amazonaws.com/groups/s3/LogDelivery表示。存储桶的 WRITE 权限使该组能够将服务器访问日志(请参阅 Amazon S3 服务器访问日志)写入存储桶。使用 ACL 时,被授权者可以是 AWS 账户或预定义的 Amazon S3 组之一。

标签: amazon-web-servicesamazon-s3terraformaclterraform-provider-aws

解决方案


根据grant-log-delivery-permissions-general文档,我继续运行terraform apply

在第一次运行时,它正确设置了Bucket owner权限,但删除了S3 log delivery group. 所以,我terraform plan再次运行它,它显示了以下 acl 授权差异。我认为它很可能首先更新了acl删除授权的值log delivery group

因此,我重新运行了terraform apply它,它工作正常并更正了日志传递组

  # module.buckets.module.access_logging_bucket.aws_s3_bucket.default will be updated in-place
  ~ resource "aws_s3_bucket" "default" {
        acl                         = "private"
        bucket                      = "ml-mxs-stage-access-logging-9d8e94ff"
        force_destroy               = false
        . . .
        tags                        = {
            "name"                                = "Access logging bucket"
            . . .
        }

      + grant {
          + permissions = [
              + "READ_ACP",
              + "WRITE",
            ]
          + type        = "Group"
          + uri         = "http://acs.amazonaws.com/groups/s3/LogDelivery"
        }
      + grant {
          + id          = "ID_VALUE"
          + permissions = [
              + "FULL_CONTROL",
            ]
          + type        = "CanonicalUser"
        }
        . . .
    }

Plan: 0 to add, 1 to change, 0 to destroy.

推荐阅读