问题排查 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

问题排查

当您为S3对象所有权应用桶所有者强制设置时,访问控制列表 (ACL) 将被禁用,作为存储桶拥有者的您将自动拥有存储桶中的所有对象。ACL 不再影响存储桶中对象的权限。您可使用策略授予权限。所有 S3 PUT 请求都必须指定存储桶拥有者完全控制 ACL 或不指定 ACL,否则它们会失败。有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。

如果指定了无效的 ACL 或存储桶 ACL 权限授予 Amazon Web Services 账户 外部的访问权限,您可能会看到以下错误响应。

AccessControlListNotSupported

为对象所有权应用存储桶所有者强制设置之后,ACL 将遭禁用。设置 ACL 或更新 ACL 的请求失败,并显示 400 错误,并返回 AccessControlListNotSupported 错误代码。仍然支持读取 ACL 的请求。读取 ACL 的请求始终返回一个响应,显示对存储桶拥有者的完全控制权。在 PUT 操作中,您必须指定存储桶拥有者完全控制 ACL 或不指定 ACL,否则 PUT 操作失败。

使用 Amazon CLI 的以下示例 put-object 操作包含 public-read 标准 ACL。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key object-key-name --body doc-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 之前,您无法应用存储桶拥有者强制执行的 Object Ownership 设置。有关更多信息,请参阅禁用 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 操作应用存储桶拥有者强制执行的 Object Ownership 设置:

aws s3api put-bucket-ownership-controls --bucket DOC-EXAMPLE-BUCKET --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]

由于存储桶 ACL 授予公共读取访问权限,因此请求失败并返回以下错误代码:

调用 PutBucketOwnershipControls 操作时发生错误 (InvalidBucketAclWithObjectOwnership) :存储桶不能含有带有 ObjectOwnership's BucketOwnerEnforced 设置的 ACL