2023年4月ACL限制后,如何通过CloudFormation配置公开S3桶的BucketPolicy?
解决S3 BucketPolicy部署时Access Denied问题并配置公开访问
问题根源
2023年4月AWS S3默认启用BucketOwnerEnforced对象所有权模式,该模式下ACL被禁用。如果你的桶默认开启了Block public policies或Restrict public buckets限制,即使拥有管理员权限,也无法设置公开访问的桶策略,从而触发s3:PutBucketPolicy Access Denied错误。
解决方案
需要在S3桶的配置中明确修改两个关键设置:
- 禁用
Block public policies和Restrict public buckets,允许设置公开桶策略 - 显式配置
ObjectOwnership(可选,但能避免默认值带来的歧义)
修改后的serverless.yml配置
# serverless.yml service: tasks-ui frameworkVersion: "3" useDotenv: true provider: name: aws region: ${opt:region, 'us-east-2'} stage: ${opt:stage, 'development'} plugins: - serverless-s3-sync custom: stage: ${opt:stage, self:provider.stage} bucketName: ${self:custom.stage}-tasks-api-mp s3Sync: # 静态资源同步配置 - bucketName: ${self:custom.bucketName} localDir: dist # BucketOwnerEnforced模式下无需配置ACL,插件自动处理所有权 # acl: public-read # 注释此行避免冲突 resources: Resources: TasksAPIBucket: Type: AWS::S3::Bucket Properties: BucketName: ${self:custom.bucketName} # AccessControl: PublicRead # 保持注释,BucketOwnerEnforced模式不支持 # 显式配置对象所有权模式 ObjectOwnership: BucketOwnerEnforced # 配置公开访问权限,允许设置公开桶策略 PublicAccessBlockConfiguration: BlockPublicAcls: true IgnorePublicAcls: true BlockPublicPolicy: false # 必须设为false,否则无法创建公开策略 RestrictPublicBuckets: false # 必须设为false,否则公开策略不生效 WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html TasksAPIBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref TasksAPIBucket PolicyDocument: Version: "2012-10-17" Statement: - Sid: "PublicReadGetObject" Effect: "Allow" Principal: "*" Action: "s3:GetObject" Resource: Fn::Join: - "" - - "arn:aws:s3:::" - !Ref TasksAPIBucket - "/*" Outputs: TasksAPIBucketName: Value: !Ref TasksAPIBucket Export: Name: s3-${self:custom.bucketName}-name TasksAPIBucketArn: Value: !GetAtt TasksAPIBucket.Arn Export: Name: s3-${self:custom.bucketName}-arn
关键修改说明
- ObjectOwnership: 显式设置为
BucketOwnerEnforced,确保ACL被禁用,符合AWS最新规则 - PublicAccessBlockConfiguration:
BlockPublicPolicy: false: 允许创建公开的桶策略RestrictPublicBuckets: false: 允许桶被公开访问BlockPublicAcls和IgnorePublicAcls保持true,契合BucketOwnerEnforced模式的安全要求
- serverless-s3-sync配置: 注释掉
acl配置,因为BucketOwnerEnforced模式下不支持自定义ACL,插件会自动将对象所有权赋予桶所有者
验证步骤
部署完成后:
- 进入AWS S3控制台,查看桶的权限标签
- 确认Block public access设置与配置一致
- 查看桶策略是否成功应用
- 通过桶的静态网站域名访问Vue前端文件,验证公开访问是否生效
内容的提问来源于stack exchange,提问作者Micah Pearce
相关产品推荐
相关产品推荐

