如何对跨账户 Amazon S3 复制问题进行故障排除?
一个 AWS 账户中的源 Amazon Simple Storage Service (Amazon S3) 存储桶中的对象无法在另一个 AWS 账户的目标存储桶中复制。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
检查与复制 IAM 角色关联的 IAM 策略
要解决 Amazon S3 复制失败问题,请确保授予正确的权限。
如果您的源存储桶对象包含标签,请确保用于复制 AWS Identity and Access Management 角色和目标存储桶的策略允许 s3:ReplicateTags 操作。
如果将复制规则设置为将对象所有权更改为目标存储桶所有者,则 IAM 角色必须具有 s3:ObjectOwnerOverrideToBucketOwner 权限。
S3 复制规则会自动创建具有所需权限的复制 IAM 角色。
用于复制 IAM 角色的 IAM 策略示例:
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::amzn-s3-demo-source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Resource":[ "arn:aws:s3:::amzn-s3-demo-source-bucket/" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/" } ] }
如果您手动创建 IAM 角色,请创建信任策略,以允许 Amazon S3 代入该角色。然后,使用 IAM 控制台或 AWS CLI 附加此策略。
信任策略示例:
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
向目标存储桶策略添加必要的权限
确保目标存储桶策略允许源账户的复制 IAM 角色复制对象。
向存储桶策略添加以下权限:
- s3:ReplicateDelete
- s3:ReplicateObject
- s3:ReplicateTags
- s3:ObjectOwnerOverrideToBucketOwner
目标存储桶策略示例:
{ "Version":"2012-10-17", "Id":"PolicyForDestinationBucket", "Statement":[ { "Sid":"Permissions on objects", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::source-bucket-account-ID:role/service-role/source-account-IAM-role" }, "Action":[ "s3:ReplicateDelete", "s3:ReplicateObject", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/" } ] }
指定 AWS KMS 密钥权限
要将服务器端加密与 AWS Key Management Service (AWS KMS) 密钥结合使用 (SSE-KMS),必须在复制规则中指定目标账户的 AWS KMS 密钥。此外,AWS KMS 密钥策略必须允许复制 IAM 角色使用密钥进行加密和解密。有关详细信息,请参阅 Add a key policy statement in the local account。
用于 SSE-KMS 的复制 IAM 角色策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "SourceKmsKeyArn" ] }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": [ "DestinationKmsKeyArn" ] } ] }
用于 SSE-KMS 的目标存储桶策略示例:
{ "Sid": "Allow an external account to use this KMS key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/ReplicationIAMRole" }, "Action": [ "kms:Encrypt" ], "Resource": "*" }
如果源或目标 AWS KMS 密钥策略根据加密上下文授予权限,请检查您是否使用的是 Amazon S3 存储桶密钥。
如果您使用的是 Amazon S3 存储桶密钥,则加密上下文必须针对存储桶级资源。
策略示例:
"kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::amzn-s3-demo-source-bucket" ] "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::amzn-s3-demo-destination-bucket" ]
如果您没有使用 Amazon S3 存储桶密钥,则加密上下文必须针对对象级资源。
策略示例:
"kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::amzn-s3-demo-source-bucket/*" ] "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::amzn-s3-demo-destination-bucket/*" ]
**注意:**在前面的示例策略中,请将 amzn-s3-demo-source-bucket 和 amzn-s3-demo-destination-bucket 替换为您的源存储桶名称和目标存储桶名称。
检查源账户和目标账户的 SCP
确保源账户和目标账户中的服务控制策略 (SCP) 不包含拒绝语句。
相关信息
Monitoring replication with metrics, event notifications, and statuses
Replicating encrypted objects (SSE-S3, SSE-KMS, DSSE-KMS, SSE-C)
