

# DynamoDB マルチアカウントグローバルテーブル
<a name="globaltables-MultiAccount"></a>

マルチアカウントグローバルテーブルは、DynamoDB テーブルデータを複数の AWS リージョンと複数の AWS アカウントに自動的にレプリケートし、耐障害性を向上させ、アカウントレベルでワークロードを分離し、個別のセキュリティとガバナンスのコントロールを適用します。各レプリカテーブルは個別の AWS アカウントに存在するため、リージョンレベルとアカウントレベルの両方で障害分離できます。レプリカを AWS 組織構造に合わせて配置することもできます。マルチアカウントグローバルテーブルでは、同一アカウントグローバルテーブルと比較して、分離性、ガバナンス、およびセキュリティ上の利点がさらに高まります。

マルチアカウントグローバルテーブルには以下の利点があります。
+ 選択した AWS アカウントとリージョン間で DynamoDB テーブルデータを自動的にレプリケートします
+ 異なるポリシー、ガードレール、コンプライアンスの境界を持つアカウント間でデータをレプリケートすることで、セキュリティとガバナンスを強化します
+ レプリカを別々の AWS アカウントに配置することで、運用の耐障害性とアカウントレベルの障害分離を改善します
+ マルチアカウント戦略を使用する場合、ビジネスユニットまたは所有権ごとにワークロードを調整します
+ 各レプリカをそれぞれの AWS アカウントに請求することで、コスト帰属を簡素化します

詳細については、「[複数の AWS アカウントを使用するベネフィット](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` を設定する必要があります。これにより、1 つのリージョンで行われた設定変更は、グローバルテーブルに参加する他のすべてのリージョンに自動的に伝播されます。

テーブルの作成後に設定のレプリケーションを有効にできます。これは、テーブルがもともとリージョンテーブルとして作成され、後でマルチアカウントグローバルテーブルにアップグレードされるシナリオをサポートします。

**同期される設定**

次のテーブル設定は、マルチアカウントグローバルテーブル内のすべてのレプリカ間で常に同期されます。

**注記**  
同一アカウントグローバルテーブルとは異なり、マルチアカウントグローバルテーブルでは、これらの設定をリージョンごとに上書きすることはできません。唯一の例外は、読み取り自動スケーリングポリシー (テーブルと GSI) は個別の外部リソースであるため、上書きが許可されることです。
+ キャパシティモード (プロビジョンドキャパシティまたはオンデマンド)
+ テーブルのプロビジョニングされた読み込みおよび書き込みキャパシティ
+ テーブルの読み込みおよび書き込みの自動スケーリング
+ ローカルセカンダリインデックス (LSI) 定義
+ グローバルセカンダリインデックス (GSI) 定義
+ GSI プロビジョニングされた読み込みおよび書き込みキャパシティ
+ GSI の読み込みおよび書き込みの自動スケーリング
+ MREC モードでの Streams 定義
+ 有効期限 (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 リージョン間の距離と、ワークロードタイプやスループットなどの他の変数によって異なります。例えば、米国西部 (北カリフォルニア) (us-west-1) リージョンのソースレプリカは、アフリカ (ケープタウン) (af-south-1) リージョンと比較して、米国西部 (オレゴン) (us-west-2) リージョンへの `ReplicationLatency` が低くなります。

`ReplicationLatency` の値が上昇している場合、1 つのレプリカからの更新が他のレプリカテーブルにタイムリーに伝播されていないことを示している可能性があります。この場合、アプリケーションの読み込みおよび書き込みアクティビティを別の AWS リージョンに一時的にリダイレクトすることができます。

**マルチアカウントグローバルテーブルでのレプリケーションレイテンシーの問題の処理**

レプリカテーブルで顧客に起因する問題が原因で `ReplicationLatency` が 3 時間を超える場合、DynamoDB は顧客に根本的な問題に対処するように求める通知を送信します。レプリケーションを妨げる可能性がある一般的な顧客に起因する問題には、次のようなものがあります。
+ レプリカテーブルのリソースポリシーから必要なアクセス許可を削除する
+ マルチアカウントグローバルテーブルのレプリカをホストする AWS リージョンをオプトアウトする
+ データの復号に必要なテーブルの AWS KMS キーアクセス許可を拒否する

DynamoDB は、レプリケーションレイテンシーが増加してから 3 時間以内に最初の通知を送信し、問題が解決されない場合は 20 時間後に 2 回目の通知を送信します。必要な時間枠内に問題が修正されない場合、DynamoDB はグローバルテーブルからレプリカの関連付けを自動的に解除します。その後、影響を受けるレプリカはリージョンテーブルに変換されます。

# チュートリアル: マルチアカウントグローバルテーブルの作成
<a name="V2globaltables_MA.tutorial"></a>

このセクションでは、複数の AWS アカウントにまたがる DynamoDB グローバルテーブルを作成するための段階的な手順について説明します。

## DynamoDB コンソールを使用してマルチアカウントグローバルテーブルを作成する
<a name="create-ma-gt-console"></a>

AWS マネジメントコンソール を使用してマルチアカウントグローバルテーブルを作成するには、次の手順に従います。以下の例では、レプリカテーブルを持つグローバルテーブルを米国に作成します。

1. AWS マネジメントコンソール にサインインして、最初のアカウント (例: *111122223333*) の DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

1. この例では、ナビゲーションバーのリージョンセレクターから **[米国東部 (オハイオ)]** を選択します。

1. コンソールの左側のナビゲーションペインで、**[テーブル]** を選択します。

1. **[Create Table]** (テーブルの作成) を選択します。

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. AWS マネジメントコンソール にサインインし、2 番目のアカウント (例: *444455556666*) の DynamoDB コンソール [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) を開きます。

1. この例では、ナビゲーションバーのリージョンセレクターから **[米国東部 (バージニア北部)]** を選択します。

1. コンソールは、選択したリージョンに同一名のテーブルが存在しないことを確認します。同一名のテーブルが存在する場合は、そのリージョンで新しいレプリカテーブルを作成する前に既存のテーブルを削除する必要があります。

1. **[テーブルの作成]** の近くのドロップダウンで、**[別のアカウントから作成]** を選択します。

1. **[別のアカウントからテーブルを作成する]** ページで次の操作を行います。

   1. ソーステーブルのテーブル ARN として **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable** を追加します。

   1. **[レプリカテーブル ARN]** で、ソーステーブルの ARN を再度追加します (**arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable**)。マルチアカウントグローバルテーブルの一部として複数のレプリカが既に存在する場合は、既存のすべてのレプリカを ReplicaTableARN に追加する必要があります。

   1. 他のデフォルトの設定はそのままにして、**[送信]** を選択します。

1. Music テーブル (およびその他すべてのレプリカテーブル) の **[グローバルテーブル]** タブに、テーブルが複数のリージョンでレプリケートされたことが示されます。

1. レプリケーションをテストするには、次の操作を行います。

   1. このテーブルのレプリカが存在する任意のリージョンを使用できます。

   1. **[テーブルアイテムの探索]** を選択します。

   1. **[項目を作成]** を選択します。

   1. **[アーティスト]** に「**item\$11**」、**[曲名]** に「**Song Value 1**」と入力します。

   1. **[項目を作成]** を選択します。

   1. 他のリージョンに切り替えてレプリケーションを確認します。

   1. [ミュージック] テーブルに、作成した項目が含まれていることを確認します。

## 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) ID ポリシーやリソースベースのポリシーなど、単一リージョンテーブルに対して行うレプリカへのアクセスを制御するのと同じ方法を使用します。このトピックでは、IAM アクセス許可と AWS Key Management Service (AWS KMS) 暗号化を使用して DynamoDB マルチアカウントグローバルテーブルを保護する方法について説明します。クロスリージョンクロスアカウントレプリケーションと自動スケーリングを許可するリソースベースのポリシーとサービスリンクロール (SLR) について、また、マルチリージョンの結果整合性 (MREC) テーブルに対して、グローバルテーブルの作成、更新、削除に必要な 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` は、レプリケーション目的でデータを読み取る機能を付与します。このアクセス許可により、1 つのレプリカの変更を読み取って他のレプリカに伝播できます。
+ `dynamodb:WriteDataForReplication` は、レプリケート先テーブルへのレプリケートデータの書き込みを許可します。このアクセス許可により、グローバルテーブル内のすべてのレプリカ間で変更を同期できます。
+ `dynamodb:ReplicateSettings` を使用すると、レプリカ間でテーブル設定を同期できるため、すべての参加テーブルで一貫した設定が可能になります。

各レプリカは、上記のアクセス許可を他のすべてのレプリカとそれ自体に付与する必要があります。つまり、ソースコンテキスト条件には、グローバルテーブルを構成するレプリカの完全なセットが含まれている必要があります。これらのアクセス許可は、新しいレプリカがマルチアカウントグローバルテーブルに追加されるたびに検証されます。これにより、レプリケーションオペレーションが承認された DynamoDB サービスによってのみ実行され、目的のテーブル間でのみ実行されることが検証されます。

## マルチアカウントグローバルテーブルのサービスリンクロール
<a name="globaltables_MA_service_linked_roles"></a>

DynamoDB マルチアカウントグローバルテーブルは、すべてのレプリカ間で設定をレプリケートするため、各レプリカは一貫したスループットで同じようにセットアップされ、シームレスなフェイルオーバーエクスペリエンスを提供します。設定のレプリケーションは、サービスプリンシパルに対する `ReplicateSettings` アクセス許可によって制御されますが、特定のクロスアカウントクロスリージョンレプリケーションと自動スケーリング機能の管理には、サービスにリンクされたロール (SLR) も利用します。これらのロールは、AWS アカウントごとに 1 回だけ設定されます。作成後、同じロールがアカウント内のすべてのグローバルテーブルに機能します。サービスリンクロールの詳細については、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`」に変わります。マルチアカウントグローバルテーブルについて、レプリカが 20 時間以上「`REPLICATION_NOT_AUTHORIZED`」ステータスのままである場合、レプリカは 1 つのリージョンの 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 Service を使用して、グローバルテーブルレプリカのプロビジョニングされたスループットキャパシティを動的に調整します。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>

##### 2 つのレプリカ設定の IAM ポリシーの例
<a name="globaltables_MA_2replica_example"></a>

マルチアカウントグローバルテーブルのセットアップは、安全なレプリケーションを提供する特定の認可フローに従います。顧客が 2 つのレプリカを持つグローバルテーブルを確立するという実践的なシナリオを順に見ていくことで、これが実際にどのように機能するかを確認してみましょう。最初のレプリカ (ReplicaA) は ap-east-1 リージョンのアカウント A に存在し、2 番目のレプリカ (ReplicaB) は eu-south-1 リージョンのアカウント B にあります。
+ ソースアカウント (アカウント A) では、プロセスはプライマリレプリカテーブルの作成から始まります。アカウント管理者は、関連付けを実行するために必要なアクセス許可を送信先アカウント (アカウント B) に明示的に付与するリソースベースのポリシーをこのテーブルにアタッチする必要があります。このポリシーは、DynamoDB レプリケーションサービスが重要なレプリケーションアクションを実行することも許可します。
+ 送信先アカウント (アカウント B) は、レプリカの作成時に対応するリソースベースのポリシーをアタッチし、レプリカの作成に使用するソーステーブル ARN を参照することで、同様のプロセスに従います。このポリシーは、アカウント A によって付与されたアクセス許可をミラーリングし、信頼された双方向の関係を作成します。レプリケーションを確立する前に、DynamoDB はこれらのクロスアカウントアクセス許可を検証して、適切な承認が設定されていることを確認します。

このセットアップを確立するには。
+ アカウント A の管理者は、まずリソースベースのポリシーを ReplicaA にアタッチする必要があります。このポリシーは、アカウント B と DynamoDB レプリケーションサービスに必要なアクセス許可を明示的に付与します。
+ 同様に、アカウント B の管理者は、一致するポリシーを ReplicaB にアタッチする必要があります。アカウント参照を逆にして、レプリカ A をソーステーブルとして参照するレプリカ B を作成するためのテーブル作成呼び出しで、対応するアクセス許可をアカウント 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"
                    ]
                }
            }
        }
    ]
}
```

------

##### 3 つのレプリカ設定の IAM ポリシーの例
<a name="globaltables_MA_3replica_example"></a>

この設定では、アカウント A、アカウント B、アカウント C に、それぞれ 3 つのレプリカ ReplicaA、ReplicaB、および ReplicaC があります。ReplicaA は最初のレプリカであり、リージョンテーブルとして開始され、その後に ReplicaB と ReplicaC が追加されます。
+ アカウント A の管理者は、まず、すべてのメンバーとのレプリケーションを許可し、アカウント B とアカウント C の IAM プリンシパルがレプリカを追加できるように、リソースベースのポリシーを ReplicaA にアタッチする必要があります。

------
#### [ 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 では、レプリカを削除するには、レプリカの暗号化キーにアクセスする必要があります。レプリカを削除するため、レプリカの暗号化に使用されるカスタマーマネージドキーを無効化または削除する場合、まずレプリカを削除し、残りのレプリカの 1 つで記述を呼び出してレプリケーショングループからテーブルが削除されるまで待機してから、キーを無効化または削除する必要があります。

レプリカの暗号化に使用されるカスタマーマネージドキーへの DynamoDB のアクセスを無効化または取り消すと、レプリカとの間のレプリケーションは停止し、レプリカのステータスは「`INACCESSIBLE_ENCRYPTION_CREDENTIALS`」に変わります。レプリカが 20 時間以上「`INACCESSIBLE_ENCRYPTION_CREDENTIALS`」ステータスのままである場合、レプリカは単一リージョンの DynamoDB テーブルに変換され、元に戻せなくなります。

### AWS KMS ポリシーの例
<a name="globaltables_MA_kms_example"></a>

この AWS KMS ポリシーにより、DynamoDB はレプリカ A と B 間のレプリケーションのために両方の AWS KMS キーにアクセスできます。各アカウントの 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"
                ]
            }
        }
      }
   ]
 }
```

------