如何赋予目标存储桶日志传递组 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 权限?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 terraform 语句中启用 s3 复制存储桶权限
[AWS][安全] S3存储桶策略-Bucket Policy
如何将日志从 Amazon S3 存储桶导入到 cloudwatch