PHP调用AWS S3创建Bucket遇InvalidBucketAclWithObjectOwnership错误求助
解决S3创建桶时的InvalidBucketAclWithObjectOwnership错误
问题原因
AWS S3在2023年更新了默认对象所有权设置,现在默认启用BucketOwnerEnforced模式。该模式下完全禁用ACL(访问控制列表),无论设置桶ACL还是对象ACL都会触发InvalidBucketAclWithObjectOwnership错误。你尝试添加的BucketOwnerForced是拼写错误,正确参数值应为BucketOwnerEnforced,但这个模式本身和ACL不兼容,所以无法解决问题。
两种可行解决方案
方案1:切换到支持ACL的对象所有权模式
如果想继续使用原有ACL逻辑,需将ObjectOwnership设置为BucketOwnerPreferred或ObjectWriter(二者均允许使用ACL),示例代码如下:
$s3 = new \Aws\S3\S3Client($awsConf); $s3->createBucket([ 'ACL' => $acl, 'Bucket' => $bucket_name, 'ObjectOwnership' => 'BucketOwnerPreferred' // 支持ACL的模式 ]);
BucketOwnerPreferred:上传对象未指定所有者时,默认归桶所有者所有ObjectWriter:对象所有者为上传者(旧版S3默认行为)
方案2:使用桶策略替代ACL(推荐)
如果遵循AWS当前最佳实践,保留BucketOwnerEnforced模式(默认),需移除ACL参数,改用桶策略实现公开访问控制。示例代码如下:
// 创建桶,无需设置ACL $s3 = new \Aws\S3\S3Client($awsConf); $s3->createBucket([ 'Bucket' => $bucket_name, 'ObjectOwnership' => 'BucketOwnerEnforced' // 可选,默认即为该值 ]); // 添加公开访问的桶策略 $publicPolicy = [ 'Version' => '2012-10-17', 'Statement' => [ [ 'Effect' => 'Allow', 'Principal' => '*', 'Action' => 's3:GetObject', 'Resource' => "arn:aws:s3:::$bucket_name/*" ] ] ]; $s3->putBucketPolicy([ 'Bucket' => $bucket_name, 'Policy' => json_encode($publicPolicy) ]);
注意事项
- 选择方案2后,后续上传对象时也不能设置
ACL参数,否则会触发类似错误 BucketOwnerEnforced是AWS推荐模式,可避免跨账户上传时的所有权纠纷,建议优先使用
内容的提问来源于stack exchange,提问作者Tim Bauer
相关产品推荐
相关产品推荐

