如何通过boto3正确创建禁用ACLs的S3存储桶
问题根因
你写的代码没法关闭存储桶ACL,核心是两个错误:
- 调用
create_bucket时显式传了ACL='private'参数:这个参数的作用就是给存储桶绑定传统ACL规则,只要传了任何ACL相关参数,S3都会默认开启ACL功能,和你要禁用ACL的目标完全相悖。 - S3的ACL开关不通过
ACL参数控制:禁用ACL是S3对象所有权(Object Ownership)的子功能,只有把对象所有权设置为BucketOwnerEnforced模式,才会彻底关闭存储桶和桶内所有对象的ACL,权限完全由IAM策略、存储桶策略统一管控。
正确实现步骤
- 先升级boto3到支持该配置的版本(要求≥1.20.0),执行命令:
pip install --upgrade boto3 - 创建存储桶时去掉所有ACL相关传参,添加
ObjectOwnership配置,代码如下:
s3.create_bucket( Bucket=BUCKET_NAME, CreateBucketConfiguration={ 'LocationConstraint': REGION_NAME }, ObjectOwnership='BucketOwnerEnforced' )
对应运行效果参考:
存量桶关闭ACL方法
如果是已经创建好的存储桶要关闭ACL,不需要重建,直接调用专属配置接口即可:
s3.put_bucket_ownership_controls( Bucket=BUCKET_NAME, OwnershipControls={ 'Rules': [ { 'ObjectOwnership': 'BucketOwnerEnforced' } ] } )
注意:开启
BucketOwnerEnforced模式后,所有之前通过ACL配置的权限都会失效,所有访问权限仅遵循IAM策略、存储桶策略、访问点策略的规则,配置前请确认业务权限逻辑没有依赖ACL。
内容的提问来源于stack exchange,提问作者ambb
相关产品推荐
相关产品推荐

