如何赋予目标存储桶日志传递组 WRITE 和 READ_ACP 权限?

Posted

技术标签:

【中文标题】如何赋予目标存储桶日志传递组 WRITE 和 READ_ACP 权限?【英文标题】:How to give the target bucket log-delivery group WRITE and READ_ACP permissions? 【发布时间】:2019-08-30 06:52:03 【问题描述】:

我正在尝试使用 terraform 设置 cloudfront dist 和 s3 存储桶。当我运行terraform apply 时,它返回以下错误:

aws_s3_bucket.app:放置 S3 日志记录时出错:InvalidTargetBucketForLogging:您必须向目标存储桶授予日志传递组 WRITE 和 READ_ACP 权限

我的 S3.tf 文件:

data "aws_iam_policy_document" "s3_policy" 
  policy_id = "PolicyForCloudFrontPrivateContent"

  statement 
    sid       = "1"
    actions   = ["s3:GetObject"]
    resources = ["arn:aws:s3:::$local.name_env/*"]

    principals 
      type        = "AWS"
      identifiers = ["$aws_cloudfront_origin_access_identity.origin_access_identity.iam_arn"]
    
  


resource "aws_s3_bucket" "app" 
  bucket = "$local.name_env"
  policy = "$data.aws_iam_policy_document.s3_policy.json"

  logging 
    target_bucket = "$local.logs_bucket"
    target_prefix = "app-$var.environment"
  

  versioning 
    enabled = true
  

  tags = "$local.tags"

【问题讨论】:

forums.aws.amazon.com/thread.jspa?threadID=21227 docs.aws.amazon.com/AmazonS3/latest/dev/… @BMW 感谢您的回复。我也遇到了这两个资源。在第一个链接中,我不确定最终答案指的是哪个“属性字段”,而在第二个链接中,我正在谈论使用 java sdk 或 .net 管理它,所以我不确定它如何应用于我当前的 terraform /cloudformation 已实现,此功能未在 terraform 中准备好,PR 未合并:github.com/terraform-providers/terraform-provider-aws/pull/3757 是的,我的问题@ydaetskcoR 是如何添加必要的权限以允许日志记录。 【参考方案1】:

您需要将 acl 属性添加到您的 aws_s3_bucket,其值为“log-delivery-write”。

resource "aws_s3_bucket" "app" 
  bucket = "$local.name_env"
  acl = "log-delivery-write"
  ...

【讨论】:

您可能想要收紧这一点。 OP 显示 local.logs_bucket 的日志记录目标,但未定义该资源。将 acl 添加到 app bucket 并不能解决 OPs 问题。【参考方案2】:

更新:terraform 现在原生支持自定义存储桶 acl。以下是针对预定义 acl 不够用的旧版本的解决方法。

以下是如何使用 null 资源和 AWS CLI 通过 terraform 实现此目的。

resource "aws_s3_bucket" "files_bucket" 
  # ...

  logging 
    target_bucket = "$aws_s3_bucket.logs_bucket.bucket"
  

  depends_on = [
    "null_resource.logs_bucket_acl_workaround"
  ]



resource "aws_s3_bucket" "logs_bucket" 
  # ...
  acl    = "private"



locals 
  put_bucket_acl_cmd = "s3api put-bucket-acl --bucket $aws_s3_bucket.logs_bucket.bucket --grant-write 'uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\"' --grant-read-acp 'uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\"'"


resource "null_resource" "logs_bucket_acl_workaround" 
  # cannot set bucket ACLs via terraform yet
  # https://github.com/terraform-providers/terraform-provider-aws/issues/989
  depends_on = [
    "aws_s3_bucket.logs_bucket",
  ]

  triggers = 
    bucket = "$aws_s3_bucket.logs_bucket.bucket"
    command = "$local.put_bucket_acl_cmd"
  

  provisioner "local-exec" 
    command = "aws $local.put_bucket_acl_cmd"
  


注意,这种方式的 ACL 只会被添加,不会被移除。

【讨论】:

AWS 有预定义的授权,可以在 aws_s3_bucket 资源中使用。这是 Terraform documentation 显示它在行动中的使用,这是 AWS documentation 解释预定义的授权 有时预定义的授权是不够的。例如,如果您有从 S3 和云端传送的日志。无论如何,如果没有解决方法,最新的 terraform 应该支持这一点

以上是关于如何赋予目标存储桶日志传递组 WRITE 和 READ_ACP 权限?的主要内容,如果未能解决你的问题,请参考以下文章

当唯一的区别是标签时,如何在两个s3桶之间同步对象

如何在 terraform 语句中启用 s3 复制存储桶权限

[AWS][安全] S3存储桶策略-Bucket Policy

如何将日志从 Amazon S3 存储桶导入到 cloudwatch

如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件

如何计算给定会话日志的峰值并发用户