问题排查
当您为S3对象所有权应用桶所有者强制设置时,访问控制列表(ACL)将被禁用,作为桶拥有者的您将自动拥有桶中的所有对象。ACL 不再影响桶中对象的权限。您可使用策略授予权限。所有 S3 PUT
请求都必须指定 bucket-owner-full-control
标准 ACL 或不指定 ACL,否则这些请求将失败。有关更多信息,请参阅为您的桶控制对象所有权和禁用 ACL。。
如果指定了无效的 ACL 或存储桶 ACL 权限授予 Amazon Web Services 账户 外部的访问权限,您可能会看到以下错误响应。
AccessControlListNotSupported
为对象所有权应用强制桶拥有者设置之后,将禁用 ACL。设置 ACL 或更新 ACL 的请求失败,并显示 400
错误,并返回 AccessControlListNotSupported
错误代码。仍然支持读取 ACL 的请求。读取 ACL 的请求始终返回一个响应,显示对桶拥有者的完全控制权。在 PUT
操作中,您必须指定桶拥有者完全控制 ACL 或不指定 ACL。否则,您的 PUT
操作将失败。
以下示例 put-object
Amazon CLI 命令包括 public-read
标准 ACL。
aws s3api put-object --bucket
DOC-EXAMPLE-BUCKET
--keyobject-key-name
--bodydoc-example-body
--acl public-read
如果桶使用强制桶拥有者设置来禁用 ACL,则此操作将失败,上传者会收到以下错误消息:
调用 PutObject 操作时发生错误 (AccessControlListNotSupported):存储桶不允许 ACL
InvalidBucketAclWithObjectOwnership
如果您想应用强制桶拥有者设置来禁用 ACL,则桶 ACL 必须仅向桶拥有者提供完全控制权。您的桶 ACL 无法访问外部 Amazon Web Services 账户 或任何其他团体。例如,如果您的 CreateBucket
请求设置“强制桶拥有者”并指定一个桶 ACL,用于提供对外部 Amazon Web Services 账户的访问权限,您的请求会失败并显示 400
错误,并且返回 InvalidBucketAclWithObjectOwnership
错误代码。同样,如果您的 PutBucketOwnershipControls
请求对于具有桶 ACL(可向其他人授予权限)的桶设置“强制桶拥有者”,请求将失败。
例 :授予桶 ACL 公有读取访问权限。
例如,如果现有桶 ACL 授予公共读取访问权限,则在将这些 ACL 权限迁移到桶策略并将桶 ACL 重置为原定设置私有 ACL 之前,您无法对于对象所有权应用强制桶拥有者设置。有关更多信息,请参阅禁用 ACL 的先决条件。
此示例桶 ACL 授予公共读取访问权限:
{ "Owner": { "ID": "
852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
" }, "Grants": [ { "Grantee": { "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/global/AllUsers" }, "Permission": "READ" } ] }
以下示例 put-bucket-ownership-controls
Amazon CLI 命令对于对象所有权应用“强制桶拥有者”设置:
aws s3api put-bucket-ownership-controls --bucket
DOC-EXAMPLE-BUCKET
--ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]
由于桶 ACL 授予公共读取访问权限,因此请求失败并返回以下错误代码:
调用 PutBucketOwnershipControls 操作时发生错误(InvalidBucketAclWithObjectOwnership):桶不能含有带有 ObjectOwnership's BucketOwnerEnforced 设置的 ACL