如何修复 CloudFormation 中的“当 ObjectOwnership 设置为 BucketOwnerEnforced 时,存储桶无法设置 ACL”错误?

1 分钟阅读
0

当我尝试通过 Amazon CloudFormation 堆栈部署 Amazon Simple Storage Service (Amazon S3) 存储桶时出现错误。

简短描述

对于新创建的存储桶,Amazon S3 会启用 ObjectOwnership 并将其默认设置为 BucketOwnerEnforced。此设置会关闭访问控制列表 (ACL),而存储桶拥有者将自动拥有存储桶中的所有对象,同时拥有这些对象的完全控制权。因此,尝试使用此设置来调用 ACL 的部署会导致以下错误:

Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting (Service: Amazon S3; Status Code: 400; Error Code: InvalidBucketAclWithObjectOwnership; Request ID: VCC82DDB; S3 Extended Request ID: itIVupTUTYxdhtOqXHTRxiwthYK4I/AvFqgNCWSqs8=; Proxy: null)

例如,以下部署模板会导致此错误:

AWSTemplateFormatVersion: "2010-09-09"

Resources:
  PortalBucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: LogDeliveryWrite
      VersioningConfiguration:
        Status: Enabled
      WebsiteConfiguration:
        IndexDocument: 'index.html'
        ErrorDocument: 'error.html'
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256

要解决此问题,请更改该存储桶的 ObjectOwnership 值以允许 ACL。

**重要事项:**对 Amazon S3 使用 ACL 并非最佳实践。如果您的用例需要使用 ACL,则请参阅以下故障排除步骤以允许使用。

解决方法

  1. ObjectOwnership 的值设置为 ObjectWriterBucketOwnerPreferred
  2. 要部署您的 S3 存储桶,请使用以下模板:
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  PortalBucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: LogDeliveryWrite
      VersioningConfiguration:
        Status: Enabled
      WebsiteConfiguration:
        IndexDocument: 'index.html'
        ErrorDocument: 'error.html'
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      OwnershipControls:
        Rules:
          - ObjectOwnership: ObjectWriter

这允许您在存储桶上激活 ACL。

有关 Amazon S3 使用 ACL 时的默认行为的更多信息,请参阅提醒: Amazon S3 安全更改将于 2023 年 4 月发布

AWS 官方
AWS 官方已更新 10 个月前