我希望在已启用对象锁定的 Amazon Simple Storage Service(Amazon S3)桶上设置跨账户复制。
## 解决方法
要使用对象锁定在 Amazon S3 桶上设置跨账户复制,请完成以下先决条件:
* 确保目标桶已启用对象锁定。如果目标桶的对象锁定未启用,[请联系 Amazon Support](https://console.aws.amazon.com/support/home#/case/create?issueType=technical?trk=cndc-detail) 提出您的请求。
* 确保您可以访问亚马逊云科技命令行界面(Amazon CLI)或 Amazon CloudShell。
* 在开始复制之前,请确保您拥有对象锁定令牌。
### 步骤 1: 创建具有必要权限的 IAM 角色以进行复制
1. 在 Amazon Identity and Access Management(IAM)控制台中为具有 Amazon S3 信任关系的源账户创建复制角色。
信任关系如下所示:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonamazon.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:amazon:s3:::SourceBucketName/*",
"arn:amazon:s3:::SourceBucketName"
]
},
{
"Sid": "DestinationBucketPermissions",
"Effect": "Allow",
"Action": [
"s3:ReplicateObject",
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:GetObjectVersionTagging",
"s3:ReplicateTags",
"s3:ReplicateDelete"
],
"Resource": [
"arn:amazon:s3:::DestBucketName/*"
]
}
]
}
```
3. 如果您使用的是 Amazon Key Management Service(Amazon 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:amazon:s3:::SourceBucketName/*",
"arn:amazon:s3:::SourceBucketName"
]
},
{
"Sid": "DestinationBucketPermissions",
"Effect": "Allow",
"Action": [
"s3:ReplicateObject",
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:GetObjectVersionTagging",
"s3:ReplicateTags",
"s3:ReplicateDelete"
],
"Resource": [
"arn:amazon: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: 更新 Amazon KMS 密钥权限
确保目标账户的 Amazon KMS 密钥允许访问源账户中的复制 IAM 角色。
示例:
```
{
"Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
"Effect": "Allow",
"Principal": {
"Amazon": "arn:amazon:iam::123456789101:role/s3-replication-role"
},
"Action": [
"kms:GenerateDataKey",
"kms:Encrypt"
],
"Resource": "*"
}
```
**注意**: 您不能使用托管 Amaozn KMS 密钥 **aws/S3** 进行跨账户复制。但是,可以使用 SSE-S3 加密。
**注意:**如果您在密钥策略中使用星号 (\*) 作为**资源**,则该策略仅向复制角色授予密钥权限。该策略不允许复制角色提升其权限。
### 步骤 3: 将以下桶策略添加到目标账户
在 **Principal**(主体)部分中,确保添加您在步骤 1 中创建的复制 IAM 角色的 ARN。
```
{
"Version": "2012-10-17",
"Id": "PolicyForDestinationBucket",
"Statement": [
{
"Sid": "ReplicationPermissions",
"Effect": "Allow",
"Principal": {
"Amazon": "arn:amazon:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
},
"Action": [
"s3:ReplicateDelete",
"s3:ReplicateObject",
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:GetBucketVersioning",
"s3:PutBucketVersioning"
],
"Resource": [
"arn:amazon:s3:::DestBucketName/*",
"arn:amazon:s3:::DestBucketName"
]
}
]
}
```
### 步骤 4: 创建 replication.json 文件
在源账户中创建名为 replication.json 的文件,该文件与以下内容类似:
```
{
"Role": "arn:amazon:iam::123456789012:role/s3-replication-role",
"Rules": [
{
"Status": "Enabled",
"Priority": 10,
"DeleteMarkerReplication": {
"Status": "Disabled"
},
"Filter": {
"Prefix": ""
},
"Destination": {
"Bucket": "arn:amazon:s3:::destination_bucket"
}
}
]
}
```
此文件包含用于设置复制的 JSON 格式的参数。这些参数与使用 Amazon S3 控制台设置复制时可能使用的参数相同。您必须使用 Amazon CLI 来设置复制,因为您还无法使用 Amazon S3 控制台进行设置。
确保将 **s3-replication-role** 替换为**步骤 1** 中的 IAM 角色。此外,根据需要包括目标桶的 ARN、前缀规范和删除标记首选项。
### 步骤 5: 设置复制
保存上述配置后,使用以下 Amazon CLI 命令传递文件:
```
amazon s3api put-bucket-replication --bucket <SOURCE BUCKET> --replication-configuration file://Replication.json --token <TOKEN>
```
要获取用于此命令的对象锁定令牌值,[请联系 Amazon Support](https://console.aws.amazon.com/support/home#/case/create?issueType=technical?trk=cndc-detail)。该 **\<TOKEN>** 值是源桶的对象锁定令牌。
### 步骤 6: 验证
当您运行上述命令时,复制规则将添加到源桶。此规则允许将新添加的对象复制到目标桶。您可以通过向源添加新对象并检查目标来测试规则。
**注意**: 设置复制后,您可以使用 Amazon S3 控制台更新复制配置。要复制已使用 Amazon KMS 加密的对象,请通过在 **Encryption**(加密)下选择 **Replicate objects encrypted with Amazon KMS**(复制已使用 Amazon KMS 加密的对象)来修改复制配置。
## 相关信息
[使用控制台配置 S3 对象锁定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-console.html?trk=cndc-detail)
[启用 S3 对象锁定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-overview.html#object-lock-bucket-config-enable?trk=cndc-detail)
[复制已使用服务器端加密(SSE-C、SSE-S3、SSE-KMS)创建的对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-config-for-kms-objects.html?trk=cndc-detail)