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

3 分钟阅读
0

我在 Amazon Simple Storage Service(Amazon S3)桶之间设置了跨区域复制(CRR)或同区域复制(SRR)。但是,对象无法复制到目标桶。

解决方法

要解决 S3 对象不复制到目标桶的问题,请检查桶的各种不同类型的权限。此外,请检查公共访问权限设置和桶所有权设置。

**提示:**每次配置更改后,请将对象上传到源桶,以测试复制。最佳做法是每次更改一个配置,以确定存在的复制设置问题。

解决了导致复制失败的问题后,源桶中可能存在未复制的对象。默认情况下,S3 复制不复制现有对象或复制状态FAILEDREPLICA 的对象。要检查未复制的对象的复制状态,请参阅检索复制失败的 S3 对象列表。使用 S3 批量复制来复制这些对象。

Amazon S3 的最低权限

确认您在复制规则中使用的 AWS Identity and Access Management(AWS IAM)角色具有正确的权限。如果源桶和目标桶位于不同的账户,请确认目标账户的桶策略向复制角色授予了足够的权限

以下示例为一个具有复制所需最低权限的 IAM 策略。根据复制规则选项(例如:使用 SSE-KMS 加密),您可能需要授予额外的权限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetReplicationConfiguration",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::SourceBucket"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectVersionForReplication",
        "s3:GetObjectVersionAcl",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::SourceBucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateDelete",
        "s3:ReplicateTags"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

注意: 请将 SourceBucketDestinationBucket 替换为 S3 桶的名称。

IAM 角色必须具有允许 Amazon S3 代入该角色来复制对象的信任策略。

示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

如果目标桶位于其他账户中,则目标桶策略必须授予以下权限:

{
  "Version": "2012-10-17",
  "Id": "PolicyForDestinationBucket",
  "Statement": [
    {
      "Sid": "Permissions on objects",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
      },
      "Action": [
        "s3:ReplicateTags",
        "s3:ReplicateDelete",
        "s3:ReplicateObject"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

注意: 请将 arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role 替换为您的复制角色的 ARN

其他 Amazon S3 权限

如果将复制规则设置为将对象所有权更改为目标桶拥有者,则 IAM 角色必须具有 s3:ObjectOwnerOverrideToBucketOwner 权限。此权限放置在 S3 对象资源上。

示例:

{
    "Effect":"Allow",
         "Action":[
       "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

目标账户还必须通过桶策略授予 s3:ObjectOwnerOverrideToBucketOwner 权限:

{
    "Sid":"1",
    "Effect":"Allow",
    "Principal":{"AWS":"arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"},
    "Action":["s3:ObjectOwnerOverrideToBucketOwner"],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

注意:如果目标桶的对象所有权设置包括桶拥有者强制,则在复制规则中无需设置将对象所有权更改为目标桶拥有者。默认情况下,会发生此更改。

如果复制规则已激活删除标记复制,则 IAM 角色必须具有 s3:ReplicateDelete 权限。如果目标桶位于其他账户中,则目标桶拥有者还必须通过桶策略授予此权限。例如:

{
    "Effect":"Allow",
    "Action":["s3:ReplicateDelete"],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

注意: 请将 DestinationBucket 替换为 S3 桶的名称。

向 IAM 角色添加额外的 S3 权限后,必须通过目标桶的桶策略授予相同的权限:

{
  "Version": "2012-10-17",
  "Id": "PolicyForDestinationBucket",
  "Statement": [
    {
      "Sid": "Stmt1644945277847",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
      },
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateTags",
        "s3:ObjectOwnerOverrideToBucketOwner",
        "s3:ReplicateDelete"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

AWS KMS 权限

如果桶的源对象是使用 AWS KMS 密钥加密的,则必须将复制规则配置为包含 AWS KMS 加密的对象。

要包含使用 AWS KMS 加密的对象,请执行以下操作:

1.    打开 Amazon S3 控制台

2.    选择包含源对象的 S3 桶。

3.    在管理选项卡上,选择复制规则。

5.    选择编辑

6.    在加密下,选择复制使用 AWS KMS 加密的对象

7.    在用于加密目标对象的 AWS KMS 密钥下,选择 AWS KMS 密钥。默认选项是使用 AWS KMS 密钥(aws/S3)。

示例: 策略示例 – 使用 SSE-S3 和 SSE-KMS 进行复制

重要事项: 如果目标桶位于其他 AWS 账户中,请指定目标账户拥有的 AWS KMS 客户托管密钥。请勿使用默认的 aws/S3 密钥。这样会导致使用源账户拥有的 AWS 托管式密钥加密对象,并且无法与其他账户共享。结果就是,目标账户无法访问目标桶中的对象。

AWS KMS 针对跨账户场景的额外权限

要使用属于目标账户的 AWS KMS 密钥加密目标对象,目标账户必须在 AWS KMS 密钥策略中授予复制角色:

{
    "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
    "Effect": "Allow",
    "Principal": {"AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"},
    "Action": ["kms:GenerateDataKey", "kms:Encrypt"],
    "Resource": "*"
}

注意:假设您在 AWS KMS 密钥策略中为资源使用星号(*)。在这种情况下,该策略仅向复制角色授予 AWS KMS 密钥的权限。该策略不允许复制角色提升其权限。

此外,源账户必须向复制角色的 IAM 策略添加以下最低权限:

{
    "Effect": "Allow",
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": [
        "SourceKmsKeyArn"
    ]
},
{
    "Effect": "Allow",
    "Action": [
        "kms:GenerateDataKey",
        "kms:Encrypt"
    ],
    "Resource": [
        "DestinationKmsKeyArn"
    ]
}

默认情况下,AWS KMS 密钥策略向根用户授予对密钥的完全权限。您可以将这些权限委托给同一账户中的其他用户。您可以使用 IAM 策略向复制角色授予源 KMS 密钥的权限。除非源 KMS 密钥策略中有拒绝语句,否则这就足够了。

显式拒绝和有条件允许语句

如果在验证权限后,您的对象仍无法复制,请检查是否存在任何显式拒绝语句:

  • 目标桶策略或 AWS KMS 密钥策略中限制对以下内容访问的拒绝语句可能会导致复制失败。
    • 特定的 CIDR 范围
    • 虚拟私有云(VPC)端点
    • S3 接入点
  • 附加到 IAM 角色的拒绝语句或权限边界可能会导致复制失败。
  • 附加到源账户或目标账户的 AWS Organizations 服务控制策略(SCP)中的拒绝语句可能会导致复制失败。

**提示:**在删除任何显式拒绝语句之前,请确认使用拒绝的原因,并确定该语句是否对数据安全有影响。

Amazon S3 桶密钥和复制注意事项

如果源或目标 KMS 密钥根据加密上下文授予权限,请确认已为桶启用 S3 桶密钥。如果桶已启用桶密钥,则加密上下文必须针对桶级资源:

"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::SOURCE_BUCKET_NAME"
     ]
"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::DESTINATION_BUCKET_NAME"
     ]

注意: 请将 SOURCE_BUCKET_NAMEDESTINATION_BUCKET_NAME 替换为源桶和目标桶的名称。

如果没有为源桶或目标桶启用桶密钥,则加密上下文必须针对对象级资源:

"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::SOURCE_BUCKET_NAME/*"
     ]
"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::DESTINATION_BUCKET_NAME/*"
     ]

注意: 请将 SOURCE_BUCKET_NAMEDESTINATION_BUCKET_NAME 替换为源桶和目标桶的名称。

对象 ACL 和屏蔽公共访问权限

检查源桶和目标桶是否在使用访问控制列表(ACL)。如果对象包含允许公共访问的 ACL,但目标桶使用的是屏蔽公共访问权限,则复制将失败。

源对象所有权

如果源桶中的对象是由其他 AWS 账户上传的,则源账户可能没有访问这些对象的权限。检查源桶,以查看 ACL 是否已停用。如果源桶已停用 ACL,则源账户是该桶中所有对象的拥有者。如果源桶未停用 ACL,请检查对象所有权是设置为首选对象拥有者还是首选桶拥有者。如果将桶设置为首选桶拥有者,则源桶对象必须具有 bucket-owner-full-control ACL,才能使桶拥有者成为对象拥有者。

源账户可以通过停用 ACL 获得其桶中所有对象的所有权。大多数用例不需要使用 ACL 来管理访问权限。最佳做法是使用 IAM 和桶策略来管理对 S3 资源的访问。要停用 S3 桶上的 ACL,请参阅控制对象的所有权和禁用桶的 ACL。请务必评估桶和对象上的 ACL 的当前使用情况。您当前的桶和 IAM 策略必须授予足够的权限,以便您可以在不影响 Amazon S3 访问的情况下停用 ACL。

复制规则筛选器

确保您正确指定了复制规则筛选器

如果您指定的规则筛选器是密钥前缀和对象标签的组合,则 S3 会执行逻辑 AND 操作来合并这些筛选器。换句话说,该规则适用于具有特定密钥前缀和特定标签的对象子集。

相关信息

演练: 配置复制的示例

AWS 官方
AWS 官方已更新 1 年前