如何使用对象锁定在我的 Amazon S3 桶之间设置跨账户复制?

3 分钟阅读
0

我希望在已启用对象锁定的 Amazon Simple Storage Service(Amazon S3)桶上设置跨账户复制。

解决方法

要使用对象锁定在 Amazon S3 桶上设置跨账户复制,请完成以下先决条件:

  • 确保目标桶已启用对象锁定。如果目标桶的对象锁定未启用,请联系 AWS Support 提出您的请求。
  • 确保您可以访问 AWS 命令行界面(AWS CLI)或 AWS CloudShell。
  • 在开始复制之前,请确保您拥有对象锁定令牌。

步骤 1: 创建具有必要权限的 IAM 角色以进行复制

1.    在 AWS Identity and Access Management(IAM)控制台中为具有 Amazon S3 信任关系的源账户创建复制角色。

信任关系如下所示:

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

2.    确保为 IAM 角色附加以下权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SourceBucketPermissions",
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectRetention",
        "s3:GetObjectVersionTagging",
        "s3:GetObjectVersionAcl",
        "s3:ListBucket",
        "s3:GetObjectVersionForReplication",
        "s3:GetObjectLegalHold",
        "s3:GetReplicationConfiguration"
      ],
      "Resource": [
        "arn:aws:s3:::SourceBucketName/*",
        "arn:aws:s3:::SourceBucketName"
      ]
    },
    {
      "Sid": "DestinationBucketPermissions",
      "Effect": "Allow",
      "Action": [
        "s3:ReplicateObject",
        "s3:ObjectOwnerOverrideToBucketOwner",
        "s3:GetObjectVersionTagging",
        "s3:ReplicateTags",
        "s3:ReplicateDelete"
      ],
      "Resource": [
        "arn:aws:s3:::DestBucketName/*"
      ]
    }
  ]
}

3.    如果您使用的是 AWS Key Management Service(AWS KMS)密钥,还应确保附加以下权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SourceBucketPermissions",
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectRetention",
        "s3:GetObjectVersionTagging",
        "s3:GetObjectVersionAcl",
        "s3:ListBucket",
        "s3:GetObjectVersionForReplication",
        "s3:GetObjectLegalHold",
        "s3:GetReplicationConfiguration"
      ],
      "Resource": [
        "arn:aws:s3:::SourceBucketName/*",
        "arn:aws:s3:::SourceBucketName"
      ]
    },
    {
      "Sid": "DestinationBucketPermissions",
      "Effect": "Allow",
      "Action": [
        "s3:ReplicateObject",
        "s3:ObjectOwnerOverrideToBucketOwner",
        "s3:GetObjectVersionTagging",
        "s3:ReplicateTags",
        "s3:ReplicateDelete"
      ],
      "Resource": [
        "arn:aws:s3:::DestBucketName/*"
      ]
    },
    {
      "Sid": "SourceBucketKMSKey",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Effect": "Allow",
      "Resource": "SourceBucketKMSKeyARN"
    },
    {
      "Sid": "DestinationBucketKMSKey",
      "Action": [
        "kms:Encrypt",
        "kms:GenerateDataKey"
      ],
      "Effect": "Allow",
      "Resource": "DestinationBucketKMSKeyARN"
    }
  ]
}

步骤 2: 更新 AWS KMS 密钥权限

确保目标账户的 AWS KMS 密钥允许访问源账户中的复制 IAM 角色。

示例:

{
  "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
  },
  "Action": [
    "kms:GenerateDataKey",
    "kms:Encrypt"
  ],
  "Resource": "*"
}

注意: 您不能使用托管 AWS KMS 密钥 aws/S3 进行跨账户复制。但是,可以使用 SSE-S3 加密。

注意:如果您在密钥策略中使用星号 (*) 作为资源,则该策略仅向复制角色授予密钥权限。该策略不允许复制角色提升其权限。

步骤 3: 将以下桶策略添加到目标账户

Principal(主体)部分中,确保添加您在步骤 1 中创建的复制 IAM 角色的 ARN。

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

步骤 4: 创建 replication.json 文件

在源账户中创建名为 replication.json 的文件,该文件与以下内容类似:

{
  "Role": "arn:aws:iam::123456789012:role/s3-replication-role",
  "Rules": [
    {
      "Status": "Enabled",
      "Priority": 10,
      "DeleteMarkerReplication": {
        "Status": "Disabled"
      },
      "Filter": {
        "Prefix": ""
      },
      "Destination": {
        "Bucket": "arn:aws:s3:::destination_bucket"
      }
    }
  ]
}

此文件包含用于设置复制的 JSON 格式的参数。这些参数与使用 Amazon S3 控制台设置复制时可能使用的参数相同。您必须使用 AWS CLI 来设置复制,因为您还无法使用 Amazon S3 控制台进行设置。

确保将 s3-replication-role 替换为步骤 1 中的 IAM 角色。此外,根据需要包括目标桶的 ARN、前缀规范和删除标记首选项。

步骤 5: 设置复制

保存上述配置后,使用以下 AWS CLI 命令传递文件:

aws s3api put-bucket-replication --bucket <SOURCE BUCKET> --replication-configuration file://Replication.json --token <TOKEN>

要获取用于此命令的对象锁定令牌值,请联系 AWS Support。该 <TOKEN> 值是源桶的对象锁定令牌。

步骤 6: 验证

当您运行上述命令时,复制规则将添加到源桶。此规则允许将新添加的对象复制到目标桶。您可以通过向源添加新对象并检查目标来测试规则。

注意: 设置复制后,您可以使用 Amazon S3 控制台更新复制配置。要复制已使用 AWS KMS 加密的对象,请通过在 Encryption(加密)下选择 Replicate objects encrypted with AWS KMS(复制已使用 AWS KMS 加密的对象)来修改复制配置。

相关信息

使用控制台配置 S3 对象锁定

启用 S3 对象锁定

复制已使用服务器端加密(SSE-C、SSE-S3、SSE-KMS)创建的对象

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