使用CloudFormation创建私有S3桶报错InvalidBucketAclWithObjectOwnership
问题分析与解决方案
问题根源
AWS在2023年4月调整了S3桶的默认行为:新创建的桶默认启用BucketOwnerEnforced对象所有权模式。这个模式下,桶拥有者自动拥有所有写入的对象,同时禁止使用任何ACL配置(包括桶级ACL)。你的模板中指定了AccessControl: LogDeliveryWrite,这会尝试设置桶级ACL,和默认的BucketOwnerEnforced模式冲突,导致报错。
解决方案
需要做以下修改:
- 删除
AccessControl: LogDeliveryWrite配置,因为BucketOwnerEnforced模式不支持ACL。 - 添加桶策略,授予ALB日志交付服务写入桶的权限(替代原来的ACL方式)。
- (可选)显式指定
ObjectOwnership: BucketOwnerEnforced,让配置更清晰(当前已是默认值)。
修改后的完整模板
AWSTemplateFormatVersion: '2010-09-09' Description: S3 bucket to store ALB logs Resources: ALBLogsBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain UpdateReplacePolicy: Retain Properties: BucketName: !Sub "pierre-alb-logs-${AWS::AccountId}" ObjectOwnership: BucketOwnerEnforced # 可选,显式指定默认值 LifecycleConfiguration: Rules: - Id: ExpireLogs ExpirationInDays: 365 Status: Enabled PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true ALBLogsBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref ALBLogsBucket PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: logging.s3.amazonaws.com Action: - s3:PutObject Resource: !Sub "${ALBLogsBucket.Arn}/*" Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control
修改说明
- 移除AccessControl字段:避免与BucketOwnerEnforced模式冲突,这是解决报错的核心。
- 添加BucketPolicy资源:通过桶策略授予ALB日志服务
PutObject权限,同时通过s3:x-amz-acl: bucket-owner-full-control条件确保桶拥有者能完全控制写入的日志对象,符合BucketOwnerEnforced的要求。 - 保留原有安全配置:公共访问块和生命周期配置保持不变,确保桶的私有性和日志自动过期的策略。
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

