为何我无法访问由其他 AWS 账户上传到我的 Amazon S3 存储桶的对象?

上次更新时间:2021 年 9 月 8 日

来自其他 AWS 账户的 AWS Identity and Access Management (IAM) 用户将一个对象上传到我的 Amazon Simple Storage Service (Amazon S3) 存储桶。当我尝试访问该对象时,我收到 403 访问被拒绝错误。如何修复此问题?

简短描述

默认情况下,S3 对象归上传此对象的 AWS 账户所有。即使存储桶由另一个账户拥有,也是如此。为了能够访问该对象,对象拥有者必须明确地授予您(存储桶拥有者)访问权限。

对象拥有者可通过更新对象的访问控制列表 (ACL),向存储桶拥有者授予该对象的完全控制权。对象拥有者可放置或复制操作期间或将该对象添加到存储桶之后更新 ACL。

注意:请避免在对象升级到 S3 存储桶之后使用 COPY 请求更改对象 ACL。相反,最好是使用 put-object-acl 命令更新对象 ACL。

解决方法

放置或复制操作期间授予访问权限

在放置或复制操作期间,对象拥有者可以指定对象的 ACL 向存储桶拥有者授予完全控制权。

对于放置操作,对象拥有者可以运行以下命令:

aws s3api put-object --bucket destination_DOC-EXAMPLE-BUCKET --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --acl bucket-owner-full-control

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

对于单个对象的复制操作,对象拥有者可以运行以下命令之一:

aws s3api copy-object --bucket destination_DOC-EXAMPLE-BUCKET --key source_DOC-EXAMPLE-BUCKET/myobject --acl bucket-owner-full-control

-或者-

aws s3 cp s3://source_DOC-EXAMPLE-BUCKET/myobject s3://destination_DOC-EXAMPLE-BUCKET/ --acl bucket-owner-full-control

对于多个对象的复制操作,对象拥有者可以运行以下命令:

aws s3 cp s3://source_DOC-EXAMPLE-BUCKET/ s3://destination_DOC-EXAMPLE-BUCKET/ --acl bucket-owner-full-control --recursive

对象添加到存储桶之后授予访问权限

如果另一个账户的存储桶中已存在的对象,则对象拥有者可以通过 put-object-acl 命令授予存储桶拥有者访问权限:

aws s3api put-object-acl --bucket destination_DOC-EXAMPLE-BUCKET --key keyname --acl bucket-owner-full-control

要求对象授予存储桶拥有者完全控制权

您可以使用存储桶策略要求由另一个账户上传到存储桶的所有对象都必须将 ACL 设置为“bucket-owner-full-control”。如需查看示例,请参阅当其他 AWS 账户向我的 S3 存储桶上传对象时,如何要求他们向我授予对象的所有权?