当我尝试通过 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,则请参阅以下故障排除步骤以允许使用。
解决方法
- 将 ObjectOwnership 的值设置为 ObjectWriter 或 BucketOwnerPreferred。
- 要部署您的 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 月发布。