[アップデート] Amazon DynamoDBグローバルテーブルがマルチアカウントのレプリケーションをサポートしました
Amazon DynamoDBグローバルテーブルがマルチアカウントで利用可能に!
おのやんです。
この度のアップデートにより、Amazon DynamoDB(以下、DynamoDB)グローバルテーブルがマルチアカウントのレプリケーションをサポートしました。
今までのDynamoDBグローバルテーブルは、ひとつのAWSアカウントの中で複数リージョンにテーブルをレプリケートし、ユーザーと位置情報的に近いテーブルに対してデータを読み書きしたり、DynamoDBテーブルをグローバル単位でレプリケートして可用性を高めたり、みたいなメリットがありました。
こちらに追加で、DynamoDBグローバルテーブルが複数のAWSアカウント間でもレプリケートできるようになりました。これにより、例えばDynamoDBグローバルテーブルを作成して、複数のAWSアカウントと複数のリージョンにまたがってデータを同期するような構成が可能になりましたDynamoDBテーブルのアカウント間データ同期って確か今まではできなかったはず(参考:DynamoDBのGlobal tablesを利用して異なるアカウントへデータを同期できますでしょうか | AWS re:Post)なので、潜在的な需要もありそうで、なかなかデカいアップデートですね。
ただし、後述しますが「同一リージョン」の「別アカウント」にグローバルテーブルを作成することはできません。ここは注意が必要ですね。
こちらの機能は全AWSリージョンで対応しています。
やってみた
ということで実際に検証してみます。今回はアカウント1(アカウントID: 111122223333)の東京リージョン(ap-northeast-1)と、アカウント2(アカウントID: 444455556666)の大阪リージョン(ap-northeast-3)で、グローバルテーブルを構成したいと思います。
AWSドキュメントに、マルチアカウントのDynamoDBグローバルテーブル作成手順が記載されていましたので、今回はこちらに沿って作業します。
AWS CLIは最新版にアップデートする必要がありますので、AWSドキュメントからダウンロード・インストールします。
まずは、東京リージョンに作成するアカウント1用のDynamoDB許可ポリシーを作成します。
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:ap-northeast-1:111122223333:table/MusicTable",
"Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
"Condition": {
"StringEquals": {
"aws:SourceAccount": ["444455556666","111122223333"],
"aws:SourceArn": [
"arn:aws:dynamodb:ap-northeast-3:444455556666:table/MusicTable",
"arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable"
]
}
}
},
{
"Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
"Effect": "Allow",
"Action": [
"dynamodb:AssociateTableReplica"
],
"Resource": "arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable",
"Principal": {"AWS": ["444455556666"]}
}
]
}
EOF
アカウント1のプロファイルに切り替えた上で、AWS CLIで東京リージョンのDynamoDBグローバルテーブルを作成します。
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 ap-northeast-1
AWSマネジメントコンソールの、アカウント1の東京リージョンで、作成したテーブルが確認できます。

アクセス許可のタブからも、先ほど作成した許可ポリシーが適用できていますね。

続いて、大阪リージョンに作成するアカウント2用のDynamoDB許可ポリシーを作成します
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:ap-northeast-3:444455556666:table/MusicTable",
"Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
"Condition": {
"StringEquals": {
"aws:SourceAccount": ["444455556666","111122223333"],
"aws:SourceArn": [
"arn:aws:dynamodb:ap-northeast-3:444455556666:table/MusicTable",
"arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable"
]
}
}
}
]
}
EOF
アカウント2のプロファイルに切り替えて、大阪リージョンでDynamoDBのレプリカを作成します。
aws dynamodb create-table \
--table-name MusicTable \
--global-table-source-arn "arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable" \
--resource-policy file:///tmp/dest-resource-policy.json \
--global-table-settings-replication-mode ENABLED \
--region ap-northeast-3
AWSマネジメントコンソールの、アカウント2の大阪リージョンで、作成したレプリカが確認できます。

先ほど作成した許可ポリシーも適用できていますね。

グローバルテーブルのタブからも確認してみます。セキュリティ上アカウントIDはともにマスクしていますが、下のアカウントIDはアカウント1の、上のアカウントIDはアカウント2のものになっています。

過去のブログを見てみると、AWSマネジメントコンソール上のグローバルテーブルの表示が変わっているのがわかります。「レプリケーションリージョン」が「リージョン」に、また「新しくアカウント」のカラムが追加されています。

(参考:[アップデート] マルチリージョン強整合性のAmazon DynamoDBグローバルテーブルがAWS FISに対応したのでやってみた | DevelopersIO)
東京リージョンのDynamoDBテーブルに、データを書き込んでみます。
aws dynamodb put-item \
--table-name MusicTable \
--item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
--region ap-northeast-1
アカウント1の東京リージョンのDynamoDBテーブルにデータが書き込まれました。

レプリケーションにより、アカウント2の大阪リージョンのDynamoDBテーブルにもデータが書き込まれていました。

「同一リージョン」の「別アカウント」にグローバルテーブルを作成することはできない
アカウント間でグローバルテーブルを作成できるという内容でしたが、グローバルテーブル本来の制約はそのままです。グローバルテーブルはもともと同一リージョンには作成できませんので、今回のケースだと、例えば東京リージョンのままで別アカウントにグローバルテーブルを作成することはできません。

試しに、アカウント2の東京リージョンに、アカウント1の東京リージョンのDynamoDBグローバルテーブルレプリカを作ろうとしても、エラーになります。
$ cat > /tmp/dest-resource-policy-cannot.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBActionsNeededForSteadyStateReplication",
"Effect": "Allow",
"Action": [
"dynamodb:ReadDataForReplication",
"dynamodb:WriteDataForReplication",
"dynamodb:ReplicateSettings"
],
"Resource": "arn:aws:dynamodb:ap-northeast-1:444455556666:table/MusicTable",
"Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
"Condition": {
"StringEquals": {
"aws:SourceAccount": ["444455556666","111122223333"],
"aws:SourceArn": [
"arn:aws:dynamodb:ap-northeast-1:444455556666:table/MusicTable",
"arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable"
]
}
}
}
]
}
EOF
$ aws dynamodb create-table \
--table-name MusicTable \
--global-table-source-arn "arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable" \
--resource-policy file:///tmp/dest-resource-policy-cannot.json \
--global-table-settings-replication-mode ENABLED \
--region ap-northeast-1
An error occurred (ValidationException) when calling the CreateTable operation: A replica cannot be created in region 'ap-northeast-1' for a global table with source 'arn:aws:dynamodb:ap-northeast-1:111122223333:table/MusicTable' because a global table cannot have more than one replica in the same region.
グローバルテーブルが、より広範囲にレプリケート可能に
複数のアカウントと異なるリージョンにまたがって、DynamoDBのデータを同期する設定が可能です。別アカウントにもレプリケーションの範囲を広げることで、より可用性に優れたDynamoDBテーブルが構成できるのではないでしょうか。






