如何向另一个 AWS 账户中的用户授予将对象上传到我的 Amazon S3 存储桶的权限?
我想授予另一个 AWS 账户中的 AWS Identity and Access Management (IAM) 用户访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶的权限。另外,我还想授予跨账户访问权限,以便该用户将对象上传到我的 Amazon S3 存储桶。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
要向另一个账户中的用户授予将对象上传到 S3 存储桶的访问权限,请更新该用户或其账户的 IAM 策略。最佳做法是通过账户控制访问权限,同时使用存储桶所有者强制执行的对象所有权。
如果您的存储桶使用访问控制列表 (ACL) 而非存储桶所有者强制执行的所有权,请考虑使用 Amazon S3 配置 BucketOwnerEnforced,该配置会关闭 ACL。使用以下 get-bucket-ownership-controls 命令,检查您的存储桶是否使用 ACL:
aws s3api get-bucket-ownership-controls --bucket DOC-EXAMPLE-BUCKET
**注意:**将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。
如果输出显示 BucketOwnerPreferred 或 ObjectWriter 而非 BucketOwnerEnforced,则表示您的存储桶使用 ACL。跨账户上传的对象归上传者所有,而非存储桶所有者。
存储桶所有者强制执行的对象所有权
要在账户级别授予对存储桶的访问权限,请使用存储桶所有者强制执行的对象所有权。请按照以下步骤,向账户 A 中的 IAM 用户授予向账户 B 中的 S3 存储桶上传对象的权限:
-
在账户 A 中,为需要访问账户 B 的存储桶的用户创建 IAM 策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }**注意:**将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。
-
从账户 A 中获取 IAM 用户的 Amazon 资源名称 (ARN)。
-
从账户 B 中创建存储桶策略,向跨账户用户授予上传对象的权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountUploadAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/UploadData" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" }, { "Sid": "CrossAccountListAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/UploadData" }, "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" } ] }**注意:**对于 Principal(主体)的值,请务必在账户 A 中输入 IAM 用户的 ARN。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。
ACL 强制执行的对象所有权
要为使用 ACL 强制执行的对象所有权的存储桶授予访问权限,请在存储桶策略和 IAM 用户策略中授予 PutObjectAcl 权限。
-
从账户 A 中,向 IAM 用户附加策略。该策略必须允许用户在账户 B 中的存储桶上运行 PutObject 和 PutObjectAcl 操作:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }**注意:**在为上传指定 ACL 之前,您必须拥有 s3:PutObjectAcl 权限。否则,当您上传带有 ACL 的对象(例如bucket-owner-full control ACL)时,您会收到访问遭拒错误。
-
从账户 B 中,附加存储桶策略,向账户 A 中的 IAM 用户授予运行 s3:PutObject and s3:PutObjectAcl 操作的权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3ObjectAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::999999999999:user/UploadData" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" }, { "Sid": "DelegateS3BucketAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/UploadData" }, "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" } ] }

