

# 教程：创建多账户全局表
<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
```

------