跳至内容

如何对跨账户 Amazon S3 复制问题进行故障排除?

2 分钟阅读
0

一个 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-bucketamzn-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)

在存储桶之间设置复制时,为什么我的 Amazon S3 对象不复制?

AWS 官方已更新 1 年前