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

上次更新时间:2019 年 6 月 21 日

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

简短描述

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

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

解决方法

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

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

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

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

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

aws s3api copy-object --bucket destination_awsexammplebucket --key source_awsexamplebucket/myobject --acl bucket-owner-full-control

或者

aws s3 cp s3://source_awsexamplebucket/myobject s3://destination_awsexamplebucket/ --acl bucket-owner-full-control

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

aws s3 cp s3://source_awsexamplebucket/ s3://destination_awsexamplebucket/ --acl bucket-owner-full-control --recursive

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

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

aws s3api put-object-acl --bucket destination_awsexamplebucket --key keyname --acl bucket-owner-full-control

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

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