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

Serverless创建公共S3存储桶遇403错误,求解决方案

问题解决方案

核心问题分析

出现403错误的原因有两个:

  • Serverless部署角色的权限配置有误,s3:PutBucketPolicy操作的资源应该是桶本身的ARN,而非桶内对象路径
  • S3默认启用了公共访问阻止机制,不允许设置公开桶策略,必须显式关闭该机制

具体修改步骤

1. 修正Provider的IAM角色权限

将PutBucketPolicy对应的Resource改为桶的ARN(不带/*),因为该操作作用于桶本身,而非桶内对象:

provider:
  name: aws
  runtime: nodejs18.x
  timeout: 25
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - 's3:GetObject' # 若函数需要访问桶内对象则保留,否则可移除
            - 's3:PutBucketPolicy'
          Resource:
            - 'arn:aws:s3:::my-bucket-name' # 桶本身的ARN
            - 'arn:aws:s3:::my-bucket-name/*' # 桶内对象路径,对应GetObject操作

2. 关闭S3公共访问阻止机制

取消PublicAccessBlockConfiguration的注释,显式关闭所有公共访问阻止选项,这样公开桶策略才能生效:

WebImagesBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-bucket-name
    PublicAccessBlockConfiguration:
      BlockPublicAcls: false
      BlockPublicPolicy: false
      IgnorePublicAcls: false
      RestrictPublicBuckets: false

3. 保留正确的桶策略配置

你的PublicReadGetObject桶策略配置本身是正确的,无需修改,确保它依赖于WebImagesBucket资源即可。

修改后的完整配置

provider:
  name: aws
  runtime: nodejs18.x
  timeout: 25
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - 's3:GetObject'
            - 's3:PutBucketPolicy'
          Resource:
            - 'arn:aws:s3:::my-bucket-name'
            - 'arn:aws:s3:::my-bucket-name/*'

resources:
  Resources:
    WebImagesBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: my-bucket-name
        PublicAccessBlockConfiguration:
          BlockPublicAcls: false
          BlockPublicPolicy: false
          IgnorePublicAcls: false
          RestrictPublicBuckets: false

    PublicReadGetObject:
      Type: AWS::S3::BucketPolicy
      Properties: 
        Bucket:
          Ref: "WebImagesBucket"
        PolicyDocument:
          Statement:
            - Effect: Allow
              Sid: PublicReadGetObject
              Action:
                - 's3:GetObject'
              Resource:
                - 'arn:aws:s3:::my-bucket-name/*'
              Principal: "*"

额外说明

  • 若不需要函数访问桶内对象,可直接移除iam.role.statements中的s3:GetObject权限
  • 公开桶存在安全风险,建议仅对必要对象设置公开权限,或考虑通过CloudFront作为CDN层控制访问,而非直接开放桶的公共访问

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:05:14