为CloudFront日志启用S3 ACL访问

18

我尝试通过AWS控制台(如下图所示)启用CloudFront分发的标准日志记录:

AWS Console

我已经设置了以下S3存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::931426637260:user/relu"
            },
            "Action": [
                "s3:GetBucketAcl",
                "s3:PutBucketAcl"
            ],
            "Resource": "arn:aws:s3:::[...]"
        }
    ]
}

"拦截所有公共访问"已关闭。

尽管如此,我仍然收到以下错误:

您为CloudFront日志指定的S3存储桶未启用ACL访问:[...].s3.amazonaws.com

即使作为根用户尝试启用日志记录,我仍然会遇到此错误。

有人有任何想法是可能出了什么问题吗?

6个回答

30

看起来我需要在这里启用 ACL:

在此输入图片描述


21

从2023年4月开始,您需要为用于CloudFront标准日志的新S3存储桶启用S3访问控制列表(ACLs)

(截图) aws上的消息

(尽管同时AWS告诉您不建议启用ACLs )

大多数现代S3用例不再需要使用ACLs,并且我们建议您保持ACLs禁用

据我所了解,无法同时遵循第二条消息/建议(禁用ACLs)并在存储桶中获取CloudFront日志。

如果您正在使用UI,请参阅user3429660的答案

如果有人想知道如何在CloudFormation中执行此操作:

  Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      OwnershipControls:
        Rules:
          - ObjectOwnership: BucketOwnerPreferred
      [....]

(或者使用ObjectOwnership: ObjectWriter
这就是所需的全部内容;即使在使用CloudFormation时,CloudFront Logger也会自动将自己添加到ACL(只要启用了ACL)。

感谢您发布这个更新的答案。 - undefined

4

原因是S3对象所有权会阻止CloudFront将日志文件传递到桶中,导致无法正常工作。接受的答案是正确的,但我花了一些时间才找到这个设置。

要进入该设置:

S3 -> Buckets -> Your_bucket_name -> Permissions -> Object Ownership

对象所有权设置将会在页面下方稍微向下一点。希望这能帮助到某些人!如果需要更多细节,我很乐意提供。

3

2

请确认您没有尝试将CloudFront日志发送到不支持的S3存储桶区域。

没错 - CloudFront并不支持将日志写入所有区域的S3存储桶。这可能是一个较少见的问题,但它卡住了我。

参考 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#access-logs-choosing-s3-bucket

Important

Don't choose an Amazon S3 bucket in any of the following Regions, because CloudFront doesn't deliver standard logs to buckets in these Regions:

- Africa (Cape Town)
- Asia Pacific (Hong Kong)
- Asia Pacific (Hyderabad)
- Asia Pacific (Jakarta)
- Asia Pacific (Melbourne)
- Europe (Milan)
- Europe (Spain)
- Europe (Zurich)
- Middle East (Bahrain)
- Middle East (UAE)

记录一下,我从CloudFormation得到的错误信息是:

资源处理程序返回消息:“操作 'AWS::CloudFront::Distribution' 的访问被拒绝:您没有权限访问CloudFront日志的S3存储桶:xxxxx.s3.ap-southeast-4.amazonaws.com。如果您正在使用IAM,则需要s3:GetBucketAcl和s3:PutBucketAcl权限来创建分发或更新现有分发的日志设置。此外,存储桶的S3 ACL必须授予您FULL_CONTROL。(服务:CloudFront,状态码:403,请求ID:82xex74x-x184-472h-aekl-944276356rfe)。”(RequestToken:aekd4b6e-45ha-489a-013e-6203kl194c21,HandlerErrorCode:AccessDenied)


这也让我感到意外。谢谢你的帖子,非常有帮助。 - undefined

1
对于Terraform用户:
resource "aws_s3_bucket_ownership_controls" "example" {
  bucket = aws_s3_bucket.example.id

  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接