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
相关产品推荐
相关产品推荐

