You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. ObjectOwnership: 显式设置为BucketOwnerEnforced,确保ACL被禁用,符合AWS最新规则
  2. PublicAccessBlockConfiguration:
    • BlockPublicPolicy: false: 允许创建公开的桶策略
    • RestrictPublicBuckets: false: 允许桶被公开访问
    • BlockPublicAcls和IgnorePublicAcls保持true,契合BucketOwnerEnforced模式的安全要求
  3. serverless-s3-sync配置: 注释掉acl配置,因为BucketOwnerEnforced模式下不支持自定义ACL,插件会自动将对象所有权赋予桶所有者

验证步骤

部署完成后:

  1. 进入AWS S3控制台,查看桶的权限标签
  2. 确认Block public access设置与配置一致
  3. 查看桶策略是否成功应用
  4. 通过桶的静态网站域名访问Vue前端文件,验证公开访问是否生效

内容的提问来源于stack exchange,提问作者Micah Pearce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:43:26