

# 设置 S3 表类数据存储服务复制
<a name="s3-tables-replication-setting-up"></a>

您可以设置复制，以便自动从源表创建表副本并将其复制到最多五个目标表存储桶。可以在存储桶级别（应用于存储桶中的所有表）或表级别（针对特定表）配置复制。本主题介绍如何使用 Amazon S3 控制台或 AWS 命令行界面（AWS CLI）配置复制。

有关设置复制的更多信息，请参阅以下主题。

**Topics**
+ [设置复制的先决条件](#s3-tables-replication-prerequisites)
+ [了解复制配置](#s3-tables-replication-understanding-configurations)
+ [在存储桶级别的复制与表级别的复制之间做出选择](#s3-tables-replication-choosing-configuration)
+ [使用 Amazon S3 控制台设置复制](#s3-tables-replication-console)
+ [使用 AWS CLI 设置复制](#s3-tables-replication-cli)

## 设置复制的先决条件
<a name="s3-tables-replication-prerequisites"></a>

在配置复制之前，请确保您拥有：

### 所需的资源
<a name="s3-tables-replication-required-resources"></a>
+ **源表存储桶**：包含要复制的表的表存储桶
+ **目标表存储桶**：要将您的表复制到的一个或多个表存储桶（最多 5 个目标表存储桶）
+ **源表**：源表存储桶中要复制的现有表
+ **IAM 角色**：一个 IAM 角色，用于授予 Amazon S3 权限以代表您复制表

### 所需的权限
<a name="s3-tables-replication-required-permissions"></a>

您用于设置复制的 IAM 身份必须具有以下权限：

**对于存储桶级别的复制：**
+ 源表存储桶上的 `s3tables:PutTableBucketReplication`
+ 源表存储桶上的 `s3tables:GetTableBucketReplication`
+ 针对复制 IAM 角色的 `iam:PassRole`

**对于表级别的复制：**
+ 源表上的 `s3tables:PutTableReplication`
+ 源表上的 `s3tables:GetTableReplication`
+ 针对复制 IAM 角色的 `iam:PassRole`

**对于跨账户复制：**
+ 来自目标账户的存储桶策略的权限

### 对跨账户复制的额外要求
<a name="s3-tables-replication-cross-account-requirements"></a>

如果您的源表存储桶和目标表存储桶位于不同的 AWS 账户中，您还需要：
+ 目标表存储桶上的存储桶策略，该策略用于为源账户授予复制表的权限
+ 目标账户 ID 和表存储桶 Amazon 资源名称（ARN）

### 对加密表的额外要求
<a name="s3-tables-replication-encrypted-requirements"></a>

如果您要使用 AWS KMS 加密副本表，则需要：
+ 目标区域中的 KMS 密钥
+ 在您的 IAM 复制角色中使用该 KMS 密钥的权限
+ 允许复制角色加密数据的 KMS 密钥策略

## 了解复制配置
<a name="s3-tables-replication-understanding-configurations"></a>

复制配置定义了 Amazon S3 如何从您的源表存储桶复制表。可以在两个级别配置复制：

### 存储桶级别的复制
<a name="s3-tables-replication-bucket-level"></a>

存储桶级别的复制配置将应用于源表存储桶中的所有表。当您配置存储桶级别的复制时，Amazon S3 会自动复制存储桶中创建的所有现有表和新表。

在以下情况下使用存储桶级别的复制：
+ 您希望复制存储桶中的所有表
+ 您希望所有表的复制行为保持一致
+ 您希望通过单一配置来简化管理

### 表级别的复制
<a name="s3-tables-replication-table-level"></a>

表级别的复制配置将应用于特定表。表级别配置会覆盖该特定表的存储桶级别配置。

在以下情况下使用表级别的复制：
+ 您只希望复制特定表
+ 您需要为不同的表设置不同的复制目标
+ 您希望覆盖某些表的存储桶级别配置

### 复制配置元素
<a name="s3-tables-replication-configuration-elements"></a>

每个复制配置都包含：
+ **IAM 角色**：Amazon S3 代入的用于执行复制操作的角色
+ **规则**：一条或多条复制规则（启动时限制为 1 条规则）。每条规则都包含：
  + **目标**：目标表存储桶 ARN 的列表（最多 5 个目标）
  + **状态**：规则是已启用还是已禁用
+ **版本令牌**：用于在更新配置时防止写入冲突的令牌

## 在存储桶级别的复制与表级别的复制之间做出选择
<a name="s3-tables-replication-choosing-configuration"></a>

### 配置优先级
<a name="s3-tables-replication-configuration-precedence"></a>

当存储桶级别的配置和表级别的配置同时存在时：
+ 对于该特定表，表级别的配置优先。
+ 其他表遵循存储桶级别的配置。

## 使用 Amazon S3 控制台设置复制
<a name="s3-tables-replication-console"></a>

此过程说明如何使用 Amazon S3 控制台配置复制。

### 设置存储桶级别的复制
<a name="s3-tables-replication-bucket-level-console"></a>

此过程说明如何使用 Amazon S3 控制台创建表存储桶复制配置。表存储桶复制配置将应用于源表存储桶中的所有表。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在导航窗格中，选择**表存储桶**。

1. 在**表存储桶**列表中，选择要为其配置复制的表存储桶的名称。

1. 选择**管理**选项卡。

1. 在**表存储桶复制配置**部分，选择**创建表存储桶复制配置**。

1. 在**目标**部分，配置您的复制目标：

   1. 在**表存储桶 ARN** 字段中，输入目标表存储桶的 ARN。格式为：`arn:aws:s3tables:region:account-id:bucket/table-bucket-name`

      或者，也可以选择**浏览 S3** 以从您的账户中选择表存储桶。

   1. （可选）要添加其他目标，请选择**添加目标**。您可以再添加最多 4 个表存储桶，对应总共 5 个目标。

1. 在 **IAM 角色**部分中，配置复制角色：

   1. 对于 **IAM 角色选择方法**，选择以下选项之一：
      + **创建新的 IAM 角色**：Amazon S3 将创建一个具有所需复制权限的新角色。
      + **从现有 IAM 角色中选择**：选择具有所需复制权限的现有角色。
      + **输入 IAM 角色 ARN**：手动输入现有 IAM 角色的 ARN。

   1. 如果您选择了**从现有 IAM 角色中选择**，请从 **IAM 角色**下拉列表中选择一个角色。

   1. （可选）选择**查看**以在 IAM 控制台中查看所选角色的权限。

1. 选择**创建复制配置**。

   创建复制配置后，Amazon S3 会开始初始回填过程。您可以在**表复制状态**部分中监控复制状态，该部分显示了有关每个目标的信息，包括复制状态、目标表 ARN 和上次复制的元数据。

### 设置表级别的复制
<a name="s3-tables-replication-table-level-console"></a>

此过程说明如何使用 Amazon S3 控制台创建表级别的复制配置。表复制配置将应用于特定表，并覆盖该表的任何存储桶级别的复制配置。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在导航窗格中，选择**表存储桶**。

1. 在**表存储桶**列表中，选择包含要复制的表的表存储桶的名称。

1. 选择 **Tables (表)** 选项卡。

1. 在**表**列表中，选择要复制的表的名称。

1. 选择**管理**选项卡。

1. 在**表复制配置**部分，选择**创建表复制配置**。

1. 在**目标**部分，配置您的复制目标：

   1. 在**表存储桶 ARN** 字段中，输入目标表存储桶的 ARN。格式为：`arn:aws:s3tables:region:account-id:bucket/table-bucket-name`

      或者，也可以选择**浏览 S3** 以从您的账户中选择表存储桶。

   1. （可选）要添加其他目标，请选择**添加目标**。您可以再添加最多 4 个表存储桶，对应总共 5 个目标。

1. 在 **IAM 角色**部分中，配置复制角色：

   1. 对于 **IAM 角色选择方法**，选择以下选项之一：
      + **创建新的 IAM 角色**：Amazon S3 将创建一个具有所需复制权限的新角色。
      + **从现有 IAM 角色中选择**：选择具有所需复制权限的现有角色。
      + **输入 IAM 角色 ARN**：手动输入现有 IAM 角色的 ARN。

   1. 如果您选择了**从现有 IAM 角色中选择**，请从 **IAM 角色**列表中选择一个角色。

   1. （可选）选择**查看**以在 IAM 控制台中查看所选角色的权限。

1. 选择**创建复制配置**。

### 接下来会发生什么？
<a name="s3-tables-replication-what-happens-next"></a>

在您创建复制配置后：
+ Amazon S3 开始初始回填过程，在每个目标存储桶中创建副本表
+ 回填开始后，复制状态将更改为**正在复制**
+ 您可以在**管理**选项卡上监控复制进度
+ 初始复制时间取决于源表的大小

## 使用 AWS CLI 设置复制
<a name="s3-tables-replication-cli"></a>

此过程介绍如何使用 AWS CLI 配置复制。将账户 ID、区域和存储桶名称替换为实际值，并将所有目标存储桶添加到权限。

### 步骤 1：创建用于复制的 IAM 角色
<a name="s3-tables-replication-create-iam-role"></a>

首先，创建一个 Amazon S3 可以代入的 IAM 角色，用于复制您的表。

1. 创建一个信任策略文档，该文档允许 S3 表类数据存储服务代入该角色。将其另存为 `trust-policy.json`：

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

1. 创建 IAM 角色：

   ```
   aws iam create-role \
       --role-name S3TablesReplicationRole \
       --assume-role-policy-document file://trust-policy.json \
       --description "Role for S3 Tables replication"
   ```

1. 创建授予复制权限的权限策略。将其另存为 `replication-permissions.json`：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3tables:GetTable",
                   "s3tables:GetTableMetadataLocation",
                   "s3tables:GetTableMaintenanceConfiguration",
                   "s3tables:GetTableData"
               ],
               "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-source/table/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3tables:ListTables"
               ],
               "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-source"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3tables:CreateTable",
                   "s3tables:CreateNamespace"
               ],
               "Resource": "arn:aws:s3tables:us-east-2:444455556666:bucket/amzn-s3-demo-table-bucket-destination"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3tables:PutTableData",
                   "s3tables:GetTableData",
                   "s3tables:UpdateTableMetadataLocation",
                   "s3tables:PutTableMaintenanceConfiguration"
               ],
               "Resource": "arn:aws:s3tables:us-east-2:444455556666:bucket/amzn-s3-demo-table-bucket-destination/table/*"
           }
       ]
   }
   ```

1. 将权限策略附加到角色：

   ```
   aws iam put-role-policy \
       --role-name S3TablesReplicationRole \
       --policy-name S3TablesReplicationPermissions \
       --policy-document file://replication-permissions.json
   ```

1. （可选）如果使用了 KMS 加密，请将 KMS 权限添加到您的策略：

   ```
   {
     "Effect": "Allow",		 	 	 
     "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:Encrypt"
   
     ],
     "Resource": "arn:aws:kms:us-east-1:111122223333:key/SOURCE-KEY-ID"
   },
   {
     "Effect": "Allow",
     "Action": [
       "kms:Decrypt",
       "kms:GenerateDataKey"
     ],
     "Resource": [
       "arn:aws:kms:us-west-2:444455556666:key/DESTINATION-KEY-ID-1"
     ]
   }
   ```

### （仅限跨账户）步骤 2：配置目标存储桶策略
<a name="s3-tables-replication-cross-account-policy"></a>

如果要复制到其他 AWS 账户，则目标账户必须向源账户授予权限。

1. 在目标账户中，为目标表存储桶创建一个存储桶策略。将其另存为 `destination-bucket-policy.json`：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::444455556666:role/cross-account-test"
               },
               "Action": [
                   "s3tables:PutTableData",
                   "s3tables:GetTableData",
                   "s3tables:UpdateTableMetadataLocation",
                   "s3tables:PutTableMaintenanceConfiguration"
               ],
               "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-cross-account-destination/table/*"
           },
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::444455556666:role/cross-account-test"
               },
               "Action": [
                   "s3tables:CreateTable",
                   "s3tables:CreateNamespace"
               ],
               "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-cross-account-destination"
           }
       ]
   }
   ```

1. 使用 S3 表类数据存储服务 API 应用策略：

   ```
   aws s3tables put-table-bucket-policy \
       --table-bucket-arn arn:aws:s3tables:us-west-2:444455556666:bucket/amzn-s3-demo-table-bucket-cross-account-destination \
       --policy file://destination-bucket-policy.json \
       --profile destination-account
   ```

1. 修改您的源 KMS 密钥以允许 S3 表类数据存储服务复制和维护：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Id": "key-consolepolicy-3",
     "Statement": [
           {
               "Sid": "allow replication to decrypt",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "replication_role_arn"
               },
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/SOURCE-KEY-ID"
           },
           {
               "Sid": "allow maintenance",
               "Effect": "Allow",
               "Principal": {
                   "Service": "maintenance.s3tables.amazonaws.com"
               },
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/SOURCE-KEY-ID"
           }
     ]
   }
   ```

1. 同样，在目标 KMS 密钥策略中添加权限

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Id": "key-policy-3",
       "Statement": [
           {
               "Sid": "allow maintenance",
               "Effect": "Allow",
               "Principal": {
                   "Service": "maintenance.s3tables.amazonaws.com"
               },
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-west-2:444455556666:key/DESTINATION-KEY-ID-1"
           },
           {
               "Sid": "allow replication to encrypt/decrypt",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "replication_role_arn"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-west-2:444455556666:key/DESTINATION-KEY-ID-1"
           }
       ]
   ```

### 步骤 3：创建复制配置
<a name="s3-tabales-replication-cli"></a>

您可以使用 AWS CLI 在表存储桶级别或表级别创建复制配置。有关更多信息，请参阅以下流程。

#### 创建存储桶级别的复制配置
<a name="s3-tables-replication-bucket-level-cli"></a>

使用此方法可复制存储桶中的所有表。

1. 创建复制配置文件。将其另存为 `bucket-replication-config.json`：  
**Example ：同一个账户中的单个目标**  

   ```
   {
     "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole",
     "rules": [
       {
         "destinations": [
           {
             "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-dr"
           }
         ]
       }
     ]
   }
   ```  
**Example ：跨区域的多个目标**  

   ```
   {
     "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole",
     "rules": [
       {
         "destinations": [
           {
             "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-dr"
           },
           {
             "destinationTableBucketARN": "arn:aws:s3tables:eu-west-1:111122223333:bucket/amzn-s3-demo-table-bucket-eu"
           },
           {
             "destinationTableBucketARN": "arn:aws:s3tables:ap-south-1:111122223333:bucket/amzn-s3-demo-table-bucket-apac"
           }
         ]
       }
     ]
   }
   ```  
**Example ：跨账户复制**  

   ```
   {
     "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole",
     "rules": [
       {
         "destinations": [
           {
             "destinationTableBucketARN": "arn:aws:s3tables:us-east-1:444455556666:bucket/amzn-s3-demo-table-bucket-partner"
           }
         ]
       }
     ]
   }
   ```

1. 应用存储桶级别的复制配置：

   ```
   aws s3tables put-table-bucket-replication \
       --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket \
       --configuration file://bucket-replication-config.json
   ```

   预期输出：

   ```
   {
     "versionToken": "3HL4kqtJl40Nr8X8gdRQBpUMLUo",
     "status": "Success"
   }
   ```

#### 创建表级别的复制配置
<a name="s3-tables-replication-table-level-cli"></a>

使用此方法可复制特定表或覆盖存储桶级别的复制。

1. 创建复制配置文件。将其另存为 `table-replication-config.json`：  
**Example ：单个表复制**  

   ```
   {
     "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole",
     "rules": [
       {
         "destinations": [
           {
             "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-analytics-bucket"
           }
         ]
       }
     ]
   }
   ```  
**Example ：包含多个目标的表**  

   ```
   {
     "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole",
     "rules": [
       {
         "destinations": [
           {
             "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-dr"
           },
           {
             "destinationTableBucketARN": "arn:aws:s3tables:eu-west-1:111122223333:bucket/amzn-s3-demo-table-bucket-eu"
           }
         ]
       }
     ]
   }
   ```

1. 应用表级别的复制配置：

   ```
   aws s3tables put-table-replication \
       --table-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket/table/amzn-s3-demo-table-bucket-sales-data \
       --configuration file://table-replication-config.json
   ```

   预期输出：

   ```
   {
     "versionToken": "xT2LZkFZ0UuTC2h8XqtGLx2Ak6M",
     "status": "Success"
   }
   ```