AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何向另一个 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" } ] }

