

# DynamoDB 多账户全局表
<a name="globaltables-MultiAccount"></a>

多账户全局表可自动跨多个 AWS 区域和多个 AWS 账户复制 DynamoDB 表数据，从而提高韧性，在账户级别隔离工作负载，并应用不同的安全和治理控制措施。每个副本表驻留在不同的 AWS 账户中，来实现区域和账户级别的故障隔离。您还可以让副本与您的 AWS 组织结构保持一致。相比同账户全局表，多账户全局表提供了额外的隔离、治理和安全性优势。

多账户全局表具有以下优点：
+ 跨您选择的 AWS 账户和区域自动复制 DynamoDB 表数据
+ 通过在具有不同策略、护栏和合规边界的账户之间复制数据，增强安全性和治理措施
+ 通过将副本放在单独的 AWS 账户中，提高运营韧性和实现账户级别的故障隔离
+ 使用多账户策略时，按业务部门或所有权来匹配工作负载
+ 将每个副本的费用计入各自的 AWS 账户，简化了成本归因

有关更多信息，请参阅 [Benefits of using multiple AWS accounts](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/benefits-of-using-multiple-aws-accounts.html)。如果您的工作负载不需要多账户复制，或者您希望通过本地覆盖实现更简单的副本管理，则可以继续使用同账户全局表。

您可以配置具有[多区域最终一致性（MREC）](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrec)的多账户全局表。配置了[多区域强一致性（MRSC）](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrsc)的全局表不支持多账户模型。

**Topics**
+ [DynamoDB 全局表工作原理](V2globaltables_MA_HowItWorks.md)
+ [教程：创建多账户全局表](V2globaltables_MA.tutorial.md)
+ [DynamoDB 全局表安全性](globaltables_MA_security.md)

# DynamoDB 全局表工作原理
<a name="V2globaltables_MA_HowItWorks"></a>

多账户全局表将 DynamoDB 全局表扩展为完全托管式、无服务器、多区域且具备多活功能的表，可以跨多个 AWS 账户。多账户全局表跨 AWS 区域和账户复制数据，提供与同账户全局表相同的双活功能。在您写入任一副本时，DynamoDB 会将数据复制到所有其他副本。

与同账户全局表的主要区别包括：
+ 多区域最终一致性（MREC）全局表支持多账户复制。
+ 您只能从单区域表开始添加副本。不支持将现有的同账户全局表转换为多账户设置。要进行迁移，您必须先删除现有副本以返回到单区域表，然后再创建新的多账户全局表。
+ 每个副本必须位于一个单独的 AWS 账户中。对于具有 *N* 个副本的多账户全局表，您必须有 *N* 个账户。
+ 默认情况下，多账户全局表对所有副本使用统一的表设置。所有副本自动共享相同的配置（例如吞吐量模式和 TTL），与同账户全局表不同的是，不能覆盖各个副本的这些设置。
+ 客户必须在其资源策略中，向 DynamoDB 全局表服务主体提供复制权限。

多账户全局表使用与同账户全局表相同的底层复制技术。表设置会自动复制到所有区域副本，并且客户无法覆盖或自定义各个副本的设置。对于加入到同一个全局表的多个 AWS 账户，这样可以确保在各个账户之间保持一致的配置和可预测的行为。

DynamoDB 全局表中的设置定义了表的行为方式以及如何跨区域复制数据。这些设置是在创建表或添加新的区域副本时，通过 DynamoDB 控制面板 API 进行配置。

创建多账户全局表时，客户必须为每个区域副本设置 `GlobalTableSettingsReplicationMode = ENABLED`。这样可以确保在一个区域中所做的配置更改，会自动传播到加入了全局表的所有其他区域。

您可以在表创建之后启用设置复制。这样便能支持如下场景：表最初创建作为单个区域表，后来升级为多账户全局表。

**同步的设置**

对于多账户全局表，以下表设置始终在所有副本之间同步：

**注意**  
与同账户全局表不同，多账户全局表不允许在各个区域中覆盖这些设置。唯一的例外是，允许对读取自动扩缩策略（表和 GSI）进行覆盖，因为这些是独立的外部资源。
+ 容量模式（预置容量或按需）
+ 表的预调配读取和写入容量
+ 表的读取和写入自动扩缩
+ 本地二级索引（LSI）定义
+ 全局二级索引（GSI）定义
+ GSI 的预调配读取和写入容量
+ GSI 的读取和写入自动扩缩
+ MREC 模式下的流定义
+ 生存时间（TTL）
+ 热吞吐量
+ 按需最大读取和写入吞吐量

**不同步的设置**

以下设置不在副本之间同步，必须为每个区域中的每个副本表单独配置。
+ 表类
+ 服务器端加密（SSE）类型
+ 时间点故障恢复
+ 服务器端加密（SSE）KMS 密钥 ID
+ 删除保护
+ Kinesis Data Streams（KDSD）
+ 标签
+ 资源策略
+ 表 Cloudwatch-Contributor Insights（CCI）
+ GSI Cloudwatch-Contributor Insights（CCI）

## 监控
<a name="V2globaltables_MA_HowItWorks.monitoring"></a>

配置为多区域最终一致性（MREC）的全局表会将 [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) 指标发布到 CloudWatch。此指标跟踪从一个项目写入到副本表到该项目出现在全局表的另一个副本中之间经过的时间。`ReplicationLatency` 以毫秒表示，并针对全局表中的每个源区域和目标区域对发出。

典型的 `ReplicationLatency` 值取决于所选 AWS 区域之间的距离以及工作负载类型和吞吐量等其它变量。例如，与非洲（开普敦）（af-south-1）区域相比，美国西部（北加利福尼亚）（us-west-1）区域的源副本到美国西部（俄勒冈州）（us-west-2）区域的 `ReplicationLatency` 更低。

`ReplicationLatency` 值不断增加可能表明来自一个副本的更新没有及时传播到其它副本表。在这种情况下，可以临时将应用程序的读取和写入活动重定向到不同的 AWS 区域。

**处理多账户全局表中的复制延迟问题**

如果由于副本表上客户引发的问题导致 `ReplicationLatency` 超过 3 小时，DynamoDB 会发送通知，要求客户解决潜在问题。客户引发的可能会阻碍复制的常见问题包括：
+ 从副本表的资源策略中移除了所需的权限
+ 选择退出托管多账户全局表副本的 AWS 区域
+ 拒绝解密数据所需的表的 AWS KMS 密钥权限

DynamoDB 会在 3 小时的延长复制延迟时间内发送初始通知，如果问题仍未解决，则会在 20 小时后发送第二份通知。如果问题未在要求的时间窗口内得到纠正，DynamoDB 将自动取消副本与全局表的关联。然后，受影响的副本将转换为区域表。

# 教程：创建多账户全局表
<a name="V2globaltables_MA.tutorial"></a>

本节提供分步说明，指导您创建跨多个 AWS 账户的 DynamoDB 全局表。

## 使用 DynamoDB 控制台创建多账户全局表
<a name="create-ma-gt-console"></a>

按照以下步骤，使用 AWS 管理控制台创建多账户全局表。以下示例创建了一个全局表，并在美国创建了副本表。

1. 对于第一个账户（假设为 *111122223333*），登录 AWS 管理控制台并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 对于本示例，从导航栏的区域选择器中选择**美国东部（俄亥俄州）**。

1. 在控制台左侧的导航窗格中，选择**表**。

1. 选择**创建表**。

1. 在**创建表**页面上：

   1. 对于**表名称**，输入 **MusicTable**。

   1. 对于**分区键**，输入 **Artist**。

   1. 对于**排序键**，输入 **SongTitle**。

   1. 保留其它默认设置，然后选择**创建表**。

1. 将以下资源策略添加到表中

------
#### [ JSON ]

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
           "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
           "Effect": "Allow",
           "Action": [
               "dynamodb:ReadDataForReplication",
               "dynamodb:WriteDataForReplication",
               "dynamodb:ReplicateSettings"
           ],
           "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
           "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
           "Condition": {
               "StringEquals": {
                   "aws:SourceAccount": ["444455556666","111122223333"],
                   "aws:SourceArn": [
                       "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
                       "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable"
                   ]
               }
           }
       },
       {
           "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
           "Effect": "Allow",
           "Action": [
               "dynamodb:AssociateTableReplica"
           ],
           "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
           "Principal": {"AWS": ["444455556666"]}
       }
   ]
   }
   ```

------

1. 此新表在新的全局表中用作第一个副本表。这是您稍后添加的其他副本表的原型。

1. 等待表的状态变为**活动**。对于新创建的表，从**全局表**选项卡中导航到**设置复制**，然后单击**启用**。

1. 从此账户（此处为 *111122223333*）退出。

1. 对于第二个账户（假设为 *444455556666*），登录 AWS 管理控制台并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 对于本示例，从导航栏的区域选择器中选择**美国东部（弗吉尼亚州北部）**。

1. 控制台将确保所选区域中不存在同名的表。如果有同名的表，则必须删除现有表，然后才能在该区域创建新的副本表。

1. 在**创建表**旁边的下拉列表中，选择**从另一个账户创建**

1. 在**从另一个账户创建表**页面上：

   1. 添加 **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable** 作为源表的表 ARN。

   1. 在**副本表 ARN** 中，再次添加源表的 ARN **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable**。如果多账户全局表中已经存在多个副本，则必须将每个现有副本添加到 ReplicaTableARN。

   1. 保留其他默认设置，然后选择**提交**。

1. 音乐表（以及任何其他副本表）的**全局表**选项卡将显示该表已在多个区域中复制。

1. 测试复制：

   1. 您可以使用任何存在此表副本的区域

   1. 选择**浏览表项目**。

   1. 选择**创建项目**。

   1. 对于**艺术家**，输入 **item\$11**；而对于**歌名**，则输入 **Song Value 1**。

   1. 选择**创建项目**。

   1. 通过切换到其它区域来验证复制：

   1. 验证 Music 表中是否包含您创建的项目。

## 使用 AWS CLI 创建多账户全局表
<a name="ma-gt-cli"></a>

以下示例说明如何使用 AWS CLI 创建多账户全局表。这些示例演示了设置跨账户复制的完整工作流。

------
#### [ CLI ]

使用以下 AWS CLI 命令创建具有跨账户复制功能的多账户全局表。

```
# STEP 1: Setting resource policy for the table in account 111122223333

cat > /tmp/source-resource-policy.json << 'EOF'
{
    "Version": "2012-10-17", 		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": ["444455556666","111122223333"],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
                        "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
            "Principal": {"AWS": ["444455556666"]}
        }
    ]
}
EOF

# Step 2: Create a new table (MusicTable) in US East (Ohio), 
#   with DynamoDB Streams enabled (NEW_AND_OLD_IMAGES),
#   and Settings Replication ENABLED on the account 111122223333

aws dynamodb create-table \
    --table-name MusicTable \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
    --global-table-settings-replication-mode ENABLED \
    --resource-policy file:///tmp/source-resource-policy.json \
    --region us-east-2 


# Step 3: Creating replica table in account 444455556666

# Resource policy for account 444455556666
cat > /tmp/dest-resource-policy.json << 'EOF'
{
    "Version": "2012-10-17", 		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": ["444455556666","111122223333"],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
                        "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable"
                    ]
                }
            }
        }
    ]
}
EOF

# Execute the replica table creation
aws dynamodb create-table \
    --table-name MusicTable \
    --global-table-source-arn "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable" \
    --resource-policy file:///tmp/dest-resource-policy.json \
    --global-table-settings-replication-mode ENABLED \
    --region us-east-1

# Step 4: View the list of replicas created using describe-table
aws dynamodb describe-table \
    --table-name MusicTable \
    --region us-east-2 \
    --query 'Table.{TableName:TableName,TableStatus:TableStatus,MultiRegionConsistency:MultiRegionConsistency,Replicas:Replicas[*].{Region:RegionName,Status:ReplicaStatus}}'

# Step 5: To verify that replication is working, add a new item to the Music table in US East (Ohio)
aws dynamodb put-item \
    --table-name MusicTable \
    --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-2

# Step 6: Wait for a few seconds, and then check to see whether the item has been 
# successfully replicated to US East (N. Virginia) and Europe (Ireland)
aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-1

aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-2

# Step 7: Delete the replica table in US East (N. Virginia) Region
aws dynamodb delete-table \
    --table-name MusicTable \
    --region us-east-1

# Clean up: Delete the primary table
aws dynamodb delete-table \
    --table-name MusicTable \
    --region us-east-2
```

------

# DynamoDB 全局表安全性
<a name="globaltables_MA_security"></a>

全局表副本是 DynamoDB 表，因此，您可以使用与控制单区域表的访问权限相同的方法，来控制副本的访问权限，包括使用 AWS Identity and Access Management（IAM）身份策略和基于资源的策略。本主题介绍如何使用 IAM 权限和 AWS Key Management Service（AWS KMS）加密来保护 DynamoDB 多账户全局表。您将了解对于多区域最终一致性（MREC）表，用于实现跨区域、跨账户复制和自动扩缩的基于资源的策略与服务相关角色（SLR），以及创建、更新和删除全局表所需的 IAM 权限。您还将学习用于安全地管理跨区域复制的 AWS KMS 加密密钥。

其中提供了详细信息，介绍建立跨账户和跨区域表复制所需的基于资源的策略和权限。对于需要实施安全的跨账户数据复制解决方案的客户来说，了解这种安全模型至关重要。

## 复制的服务主体授权
<a name="globaltables_MA_service_principal"></a>

DynamoDB 的多账户全局表使用不同的授权方法，因为复制是跨账户边界执行的。此过程使用 DynamoDB 的复制服务主体完成：`replication.dynamodb.amazonaws.com`。每个参与账户都必须在副本表的资源策略中明确允许该主体，向其授予权限，这些权限可以根据键（例如 `aws:SourceAccount`、`aws:SourceArn` 等）的源上下文条件限制到特定副本，有关更多详细信息，请参阅 [AWS 全局条件键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。权限是双向的，这意味着所有副本都必须明确地相互授予权限，然后才能在任何特定的副本对之间建立复制关系。

对于跨账户复制，以下服务主体权限至关重要：
+ `dynamodb:ReadDataForReplication` 授予读取数据用于复制用途的能力。通过此权限可以读取一个副本中的更改，并将更改传播到其他副本。
+ `dynamodb:WriteDataForReplication` 允许将复制的数据写入目标表。通过此权限可以在全局表中的所有副本之间同步更改。
+ `dynamodb:ReplicateSettings` 实现了跨副本的表设置同步，从而为所有加入的表提供一致的配置。

每个副本都必须向所有其他副本及其自身授予上述权限，也就是说，源上下文条件必须包括构成全局表的完整副本集。在将每个新副本添加到多账户全局表时，都会对其验证这些权限。这可以确保只有获得授权的 DynamoDB 服务才能执行复制操作，并且只能在所需的表之间执行。

## 多账户全局表的服务相关角色
<a name="globaltables_MA_service_linked_roles"></a>

DynamoDB 多账户全局表跨所有副本复制设置，因此每个副本的设置完全相同，吞吐量一致，并提供无缝的失效转移体验。这些设置的复制通过服务主体上的 `ReplicateSettings` 权限进行控制，不过也可以依靠服务相关角色（SLR）来管理某些跨账户跨区域复制和自动扩缩功能。每个 AWS 账户只需设置一次这些角色。创建后，同一个角色将用于您的账户中的所有全局表。有关服务相关角色的更多信息，请参见《IAM 用户指南》中的[使用服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html)。

### 设置管理服务相关角色
<a name="globaltables_MA_settings_management_slr"></a>

当您在账户中创建第一个多账户全局表副本时，Amazon DynamoDB 会自动创建 AWSServiceRoleForDynamoDBGlobalTableSettingsManagement 服务相关角色（SLR）。此角色管理您的跨账户跨区域复制设置。

在将基于资源的策略应用于副本时，请确认您没有拒绝在 `AWSServiceRoleForDynamoDBGlobalTableSettingsManagement` 中定义的向 SLR 主体授予的任何权限，因为这可能会影响到设置管理，并且如果副本或 GSI 的吞吐量不匹配，则可能会损害复制。如果您拒绝所需的 SLR 权限，则与受影响副本之间的复制将停止，副本表的状态将更改为 `REPLICATION_NOT_AUTHORIZED`。对于多账户全局表，如果副本保持在 `REPLICATION_NOT_AUTHORIZED` 状态的时间超过 20 小时，则该副本将不可逆地转换为单区域 DynamoDB 表。SLR 具有以下权限：
+ `application-autoscaling:DeleteScalingPolicy`
+ `application-autoscaling:DescribeScalableTargets`
+ `application-autoscaling:DescribeScalingPolicies`
+ `application-autoscaling:DeregisterScalableTarget`
+ `application-autoscaling:PutScalingPolicy`
+ `application-autoscaling:RegisterScalableTarget`

### 自动扩缩服务相关角色
<a name="globaltables_MA_autoscaling_slr"></a>

在将全局表配置为调配容量模式时，必须为全局表配置自动扩缩。DynamoDB 自动扩缩功能使用 AWS Application Auto Scaling 服务来动态调整全局表副本上的预调配吞吐能力。Application Auto Scaling 服务创建名为 [AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html) 的服务相关角色（SLR）。当您首次为 DynamoDB 表配置自动扩缩时，将在您的 AWS 账户中自动创建此服务相关角色。此角色允许 Application Auto Scaling 管理预调配的表容量并创建 CloudWatch 警报。

在将基于资源的策略应用于副本时，请确保不要拒绝在 [AWSApplicationAutoscalingDynamoDBTablePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html) 中定义的向 Application Auto Scaling SLR 主体授予的任何权限，因为这将中断自动扩缩功能。

## 全局表如何使用 AWS IAM
<a name="globaltables_MA_iam"></a>

以下各节介绍不同全局表操作所需的权限，并提供了策略示例，以帮助您为用户和应用程序配置适当的访问权限。

**注意**  
描述的所有权限都必须应用于受影响区域中的特定表资源 ARN。表资源 ARN 采用格式 `arn:aws:dynamodb:region:account-id:table/table-name`，您需要指定实际区域、账户 ID 和表名值。

以下是我们在接下来的各节中分步骤介绍的主题：
+ 创建多账户全局表和添加副本
+ 更新多账户全局表
+ 删除全局表和移除副本

### 创建全局表和添加副本
<a name="globaltables_MA_creating"></a>

#### 创建全局表的权限
<a name="globaltables_MA_creating_permissions"></a>

将新副本添加到区域表来构成多账户全局表或者添加到现有的多账户全局表时，执行操作的 IAM 主体必须获得所有现有成员的授权。要想成功添加副本，所有现有成员都需要在其表策略中授予以下权限：
+ `dynamodb:AssociateTableReplica`：此权限允许将表加入到全局表设置中。这是基础权限，用于建立初始复制关系。

这种精确的控制只允许授权账户加入全局表设置。

#### 用于创建全局表的 IAM 策略示例
<a name="globaltables_MA_creating_examples"></a>

##### 适用于双副本设置的 IAM 策略示例
<a name="globaltables_MA_2replica_example"></a>

多账户全局表的设置遵循用于提供安全复制的特定授权流程。接下来我们将了解它在实践中是如何运作的，在这个场景中，客户想要建立一个包含两个副本的全局表。第一个副本（ReplicaA）位于 ap-east-1 区域的账户 A 中，而第二个副本（ReplicaB）位于 eu-south-1 区域的账户 B 中。
+ 在源账户（账户 A）中，流程首先创建主副本表。账户管理员必须将基于资源的策略附加到此表，向目标账户（账户 B）明确授予执行关联所需的权限。此策略还授权 DynamoDB 复制服务执行基本的复制操作。
+ 目标账户（账户 B）遵循类似的流程，即在创建副本时附加相应的基于资源的策略，并引用用于创建副本的源表 ARN。此策略体现了账户 A 授予的权限，用于创建可信的双向关系。在建立复制之前，DynamoDB 会验证这些跨账户权限，以确保正确进行了授权。

要建立此设置，请执行以下操作：
+ 账户 A 的管理员必须首先将基于资源的策略附加到 ReplicaA。此策略向账户 B 和 DynamoDB 复制服务明确授予必要的权限。
+ 同样，在用于创建副本 B（引用副本 A 作为源表）的创建表调用中，账户 B 的管理员必须将匹配的策略附加到 ReplicaB，进行反向的账户引用以向账户 A 授予相应的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": {"AWS": ["444455556666"]}
        }
    ]
}
```

------

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                    ]
                }
            }
        }
    ]
}
```

------

##### 适用于三副本设置的 IAM 策略示例
<a name="globaltables_MA_3replica_example"></a>

在此环境中，账户 A、账户 B 和账户 C 中分别有 3 个副本 ReplicaA、ReplicaB 和 ReplicaC。ReplicaA 是第一个副本，首先作为区域表创建，然后将 ReplicaB 和 ReplicaC 添加到其中。
+ 账户 A 的管理员必须先将基于资源的策略附加到 ReplicaA，允许所有成员进行复制，并允许账户 B 和账户 C 的 IAM 主体添加副本。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666", "123456789012" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
                        "arn:aws:dynamodb:us-east-1:123456789012:table/ReplicaC"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": { "AWS": [ "444455556666", "123456789012" ] }
        }
    ]
}
```

------
+ 账户 B 的管理员必须添加一个指向 ReplicaA（源）的副本，即 ReplicaB。ReplicaB 具有以下策略，允许在所有成员之间进行复制，并允许账户 C 添加副本：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666", "123456789012" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
                        "arn:aws:dynamodb:us-east-1:123456789012:table/ReplicaC"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
            "Principal": { "AWS": [ "123456789012" ] }
        }
    ]
}
```

------
+ 最后，账户 C 的管理员创建具有以下策略的副本，允许所有成员之间的复制权限。该策略不允许再添加任何副本。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/ReplicaC",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                    ]
                }
            }
        }
    ]
}
```

------

### 更新多账户全局表
<a name="globaltables_MA_updating"></a>

要使用 UpdateTable API 修改现有全局表的副本设置，对于进行 API 调用的区域中的表资源，您需要具有以下权限：`dynamodb:UpdateTable`

此外，您还可以更新其他全局表配置，例如自动扩缩策略和生存时间设置。这些额外的更新操作需要以下权限：

要使用 `UpdateTimeToLive` API 更新生存时间设置，对于包含副本的所有区域中的表资源，您必须具有以下权限：`dynamodb:UpdateTimeToLive`

要通过 `UpdateTableReplicaAutoScaling` API 更新副本自动扩缩策略，对于包含副本的所有区域中的表资源，您必须具有以下权限：
+ `application-autoscaling:DeleteScalingPolicy`
+ `application-autoscaling:DeleteScheduledAction`
+ `application-autoscaling:DeregisterScalableTarget`
+ `application-autoscaling:DescribeScalableTargets`
+ `application-autoscaling:DescribeScalingActivities`
+ `application-autoscaling:DescribeScalingPolicies`
+ `application-autoscaling:DescribeScheduledActions`
+ `application-autoscaling:PutScalingPolicy`
+ `application-autoscaling:PutScheduledAction`
+ `application-autoscaling:RegisterScalableTarget`

**注意**  
要成功更新表，您必须向所有副本区域和账户提供 `dynamodb:ReplicateSettings` 权限。如果多账户全局表中的任意副本未提供权限，导致无法将设置复制到任意其他副本，则在权限得到修复之前，所有副本的所有更新操作都将失败并出现 `AccessDeniedException`。

### 删除全局表和移除副本
<a name="globaltables_MA_deleting"></a>

要删除全局表，您必须移除所有副本。与同账户全局表不同，您不能使用 `UpdateTable` 删除远程区域中的副本表，您必须从控制副本表的账户中，通过 `DeleteTable` API 删除各个副本。

#### 删除全局表和移除副本的权限
<a name="globaltables_MA_deleting_permissions"></a>

删除单个副本和完全删除全局表均需要以下权限。删除全局表配置只会移除不同区域中表之间的复制关系。它不会删除剩下的最后一个区域中的基础 DynamoDB 表。最后一个区域中的表会作为标准 DynamoDB 表继续存在，具有相同的数据和设置。

在要移除副本的每个区域，您需要具有对表资源的以下权限：
+ `dynamodb:DeleteTable`
+ `dynamodb:DeleteTableReplica`

## 全局表如何使用 AWS KMS
<a name="globaltables_MA_kms"></a>

与所有 DynamoDB 表一样，全局表副本始终使用存储在 AWS Key Management Service（AWS KMS）中的加密密钥对静态数据进行加密。

**注意**  
与同账户全局表不同，多账户全局表中的不同副本可以配置为使用不同类型的 AWS KMS 密钥（AWS 拥有的密钥，或客户自主管理型密钥）。多账户全局表不支持 AWS 托管式密钥。

使用 CMK 的多账户全局表要求每个副本的密钥策略向 DynamoDB 复制服务主体 (`replication.dynamodb.amazonaws.com`) 授予权限，以便访问密钥用于复制和设置管理。需要以下权限：
+ `kms:Decrypt`
+ `kms:ReEncrypt*`
+ `kms:GenerateDataKey*`
+ `kms:DescribeKey`

**重要提示**

DynamoDB 需要访问副本的加密密钥才能删除副本。如果您因删除副本而想要禁用或删除加密该副本所用的客户自主管理型密钥，则应先删除该副本，等待表从复制组中删除（通过在任一其他副本中调用 describe），然后再禁用或删除该密钥。

对于加密副本所用的客户自主管理型密钥，如果您禁用或撤销 DynamoDB 对密钥的访问权限，则复制到副本以及从副本进行复制的过程将停止，而副本状态将更改为 `INACCESSIBLE_ENCRYPTION_CREDENTIALS`。如果副本保持 `INACCESSIBLE_ENCRYPTION_CREDENTIALS` 状态的时间超过 20 小时，则该副本将不可逆地转换为单区域 DynamoDB 表。

### AWS KMS 策略示例
<a name="globaltables_MA_kms_example"></a>

AWS KMS 策略允许 DynamoDB 访问两个 AWS KMS 密钥，以便在副本 A 和 B 之间进行复制。每个账户中附加到 DynamoDB 副本的 AWS KMS 密钥需要使用以下策略进行更新：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": { "Service": "replication.dynamodb.amazonaws.com" },
        "Action": [
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:SourceAccount": [ "111122223333", "444455556666" ],
                "aws:SourceArn": [
                    "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                    "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                ]
            }
        }
      }
   ]
 }
```

------