如何修改AWS JS SDK代码以兼容最新变更创建公读S3存储桶
解决方案
AWS近期默认启用了BucketOwnerEnforced对象所有权模式,该模式下S3禁止设置桶ACL,这是你收到报错的原因。以下是两种可行的修改方式:
方式一:修改对象所有权模式以兼容ACL设置
在创建桶时指定ObjectOwnership参数为允许使用ACL的模式(ObjectWriter或BucketOwnerPreferred),同时保留原ACL配置:
const command = new CreateBucketCommand({ Bucket: bucket, ObjectOwnership: 'ObjectWriter', // 可选值:'ObjectWriter' / 'BucketOwnerPreferred' ACL: 'public-read' }) await this.S3Client.send(command)
注意:此方式仅为兼容旧代码,不符合AWS最新的安全最佳实践。
方式二:使用桶策略实现公读(AWS推荐)
采用AWS默认的BucketOwnerEnforced安全模式,通过桶策略开放公读权限,这是当前推荐的做法:
- 创建桶(不设置ACL):
const createCmd = new CreateBucketCommand({ Bucket: bucket }) await this.S3Client.send(createCmd)
- 添加公读桶策略:
const publicReadPolicy = { Version: "2012-10-17", Statement: [ { Effect: "Allow", Principal: "*", Action: "s3:GetObject", Resource: `arn:aws:s3:::${bucket}/*` } ] } const policyCmd = new PutBucketPolicyCommand({ Bucket: bucket, Policy: JSON.stringify(publicReadPolicy) }) await this.S3Client.send(policyCmd)
内容的提问来源于stack exchange,提问作者thr
相关产品推荐
相关产品推荐

