Amazon DynamoDB Cross-region Replicationを試してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
今朝、DynamoDBの大規模アップデートがあり、DynamoDBのクロスリージョンレプリケーションがリリースされました。その名の通り、あるリージョンで動作するDynamoDBテーブルを別のリージョンのテーブルに非同期でレプリケーションする機能です。早速試してみた様子をレポートします。

設定手順

DynamoDBのソース(レプリケーション元)テーブルの作成

まずは、レプリケーション元となるDynamoDBのテーブルを作成します。今回はバージニア北部(us-east-1)リージョンで作成しました。クロスリージョンレプリケーションは、同時にGAが発表されたDynamoDB Streamsを利用するため、テーブル作成時の[ストリームの有効化]チェックを必ずオンにしておきます。

dynamodbcr01

作成したテーブルの[ストリーム]タブを確認し、ストリームARNが表示されることを確認しておきましょう。

dynamodbcr02

OKですね。

Cross Region Replicationスタックの作成

クロスリージョンレプリケーションは以下で構成され、これらの多くを一括作成するCloudFormationテンプレートが提供されています。

コンポーネント名 利用するAWSリソース 説明
Cross Region Replicationコンソール S3 Webコンソール
Replication Coodinator Elastic Beanstalk Worker Tier & Docker(Java) クロスリージョンレプリケーションの管理アプリケーションワーカーサーバー
DynamoDB Replication Connector ECS Service(Java) クロスリージョンレプリケーションのエンジンアプリケーションコンテナ
Metadata Table / KCL Checkpoint Table DynamoDB(後述のReplication Group作成時に一緒に作成) レプリケーション管理用テーブル
Replication Coordinatorイベントキュー SQS 管理アプリケーションのタスクキュー

DynamoDBのドキュメントからCloudFormationスタック作成のリンクをクリックします。

dynamodbcr03

スタック作成のウィザードは、いずれも既定のまま[Next]を数回クリックし進めましょう。(一部手順のスクリーンショットを割愛しています)

dynamodbcr05

IAMに関するチェックはオンにし、[Create]ボタンをクリックすると、スタック作成がスタートします。

dynamodbcr07

Elastic Beanstalkの部分は子スタックになっているようで、CloudFormationのスタック一覧には2つのスタックが表示されます。どちらもCREATE_COMPLETEになるまで待ちましょう。

dynamodbcr08

これで準備OKです。ちなみにアプリケーションサーバーが何をしているのかは、Beanstalkの下記アプリケーションバンドルで様子を見ることができます。単一のDockerコンテナ内でCoordinatorとDynamoDB Connectorの2つのJavaアプリケーションをsupervisordで実行する構成です。

Cross Region Replicationコンソールの表示とReplication Groupの作成

では、Cross Region Replicationを設定してみます。設定するWebコンソールのURLをCloudFormationスタックの[Outputs]タブで確認するのですが、今回試した時点ではスタックアップデートが定期的に実行されそれが失敗し、URLの更新がうまく動作していないようで、そのままのURLではReplication Group作成のタイミングで以下エラーが発生してしまいました。

dynamodbcr18

dynamodbcr13

そこで今回はURLを正しいものに修正し、対応しました。

awseb-から始まるBeanstalkスタックの[Outputs]タブからAWSEBWorkerQueueURLAWSEBWorkerDeadLetterQueueURLの値をコピーします。

dynamodbcr19

で、それらをDynamoDBReplicationCoodinatorスタックのReplicationConsoleURLDo not fill in. This field will be automatically populated.の部分にそれぞれ置換します。

置換前

https://dynamodb-cross-region-replication-console.s3.amazonaws.com/index.html#/?AccountId=XXXXXXXXXXXX&SQSUrl=Do not fill in. This field will be automatically populated.&SQSDeadLetterUrl=Do not fill in. This field will be automatically populated.&SQSRegion=us-east-1&MetadataTableName=DynamoDBReplicationCoordinatorMetadata&MetadataTableRegion=us-east-1

置換後

https://dynamodb-cross-region-replication-console.s3.amazonaws.com/index.html#/?AccountId=XXXXXXXXXXXX&SQSUrl=https://sqs.us-east-1.amazonaws.com/XXXXXXXXXXXX/awseb-e-irguw29a29-stack-AWSEBWorkerQueue-1DU0KY5RUVFZM&SQSDeadLetterUrl=https://sqs.us-east-1.amazonaws.com/XXXXXXXXXXXX/awseb-e-irguw29a29-stack-AWSEBWorkerDeadLetterQueue-Y58VZCILUJLI&SQSRegion=us-east-1&MetadataTableName=DynamoDBReplicationCoordinatorMetadata&MetadataTableRegion=us-east-1

このあたりはCloudFormationテンプレートの作りの話なので、じきに修正されると思います。

さて、作成したURLにWebブラウザからアクセスすると以下のAPIキー入力が促されますので、入力します *1。通常のManagement Consoleと認証は連携しないようで、またトークンの入力欄がないので、STSの一時キーに対応していないようです。ひとまず、一時キーのサポートに期待したいところです。

dynamodbcr09

Replication Group一覧の画面が表示されたら、[Create]をクリックし作成画面を表示します。

dynamodbcr10

[Select a master table]の欄で1で作成したSourceTableのリージョンとテーブルを選択します。

dynamodbcr11

[Select a Replica Table]の欄では既存のテーブルをレプリケーション先として選択できるようですが、今回は東京(ap-northeast-1)リージョンに新規でReplicaTableテーブルを作成してみます。

dynamodbcr12

[Next] - [Confirm and Create]とクリックすると、Replication Groupの作成が始まります。

dynamodbcr14

[Status]列がACTIVEになったら作成完了です。DynamoDBのテーブル一覧を見てみると、管理用のテーブルが追加されていることが確認できます。

dynamodbcr17

これで準備OKです!

動作確認

バージニア北部リージョンのSourceTableにアイテムを追加してみます。

dynamodbcr15

東京リージョンのReplicaTableのアイテムをスキャンしてみると。。。

dynamodbcr16

きちんとアイテムの追加が反映されていますね!

まとめ

DynamoDB Cross-region Replicationを試してみました。兼ねてからマルチリージョンでの展開にはデータ同期がネックになると言われていましたので、それを解決する強力なツールになること間違いなしですね。レプリケーションの実装自体はEC2ですので、より頻繁に更新されるテーブルを扱う要件やレプリケーション遅延を短くする要件の場合はインスタンス数やインスタンスタイプでチューニングすることになると思います。

参考URL

脚注

  1. S3の静的ページでホストされているため、APIキーはサーバーサイドでは保管されない作りのようです。ページをリロードすると毎回入力を求められます(笑)