Amazon DynamoDB Cross-region Replicationを試してみた
ども、大瀧です。
今朝、DynamoDBの大規模アップデートがあり、DynamoDBのクロスリージョンレプリケーションがリリースされました。その名の通り、あるリージョンで動作するDynamoDBテーブルを別のリージョンのテーブルに非同期でレプリケーションする機能です。早速試してみた様子をレポートします。
設定手順
DynamoDBのソース(レプリケーション元)テーブルの作成
まずは、レプリケーション元となるDynamoDBのテーブルを作成します。今回はバージニア北部(us-east-1)リージョンで作成しました。クロスリージョンレプリケーションは、同時にGAが発表されたDynamoDB Streamsを利用するため、テーブル作成時の[ストリームの有効化]チェックを必ずオンにしておきます。
作成したテーブルの[ストリーム]タブを確認し、ストリームARNが表示されることを確認しておきましょう。
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スタック作成のリンクをクリックします。
スタック作成のウィザードは、いずれも既定のまま[Next]を数回クリックし進めましょう。(一部手順のスクリーンショットを割愛しています)
IAMに関するチェックはオンにし、[Create]ボタンをクリックすると、スタック作成がスタートします。
Elastic Beanstalkの部分は子スタックになっているようで、CloudFormationのスタック一覧には2つのスタックが表示されます。どちらもCREATE_COMPLETE
になるまで待ちましょう。
これで準備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作成のタイミングで以下エラーが発生してしまいました。
そこで今回はURLを正しいものに修正し、対応しました。
awseb-
から始まるBeanstalkスタックの[Outputs]タブからAWSEBWorkerQueueURL
とAWSEBWorkerDeadLetterQueueURL
の値をコピーします。
で、それらをDynamoDBReplicationCoodinatorスタックのReplicationConsoleURL
のDo 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の一時キーに対応していないようです。ひとまず、一時キーのサポートに期待したいところです。
Replication Group一覧の画面が表示されたら、[Create]をクリックし作成画面を表示します。
[Select a master table]の欄で1で作成したSourceTable
のリージョンとテーブルを選択します。
[Select a Replica Table]の欄では既存のテーブルをレプリケーション先として選択できるようですが、今回は東京(ap-northeast-1)リージョンに新規でReplicaTable
テーブルを作成してみます。
[Next] - [Confirm and Create]とクリックすると、Replication Groupの作成が始まります。
[Status]列がACTIVE
になったら作成完了です。DynamoDBのテーブル一覧を見てみると、管理用のテーブルが追加されていることが確認できます。
これで準備OKです!
動作確認
バージニア北部リージョンのSourceTable
にアイテムを追加してみます。
東京リージョンのReplicaTable
のアイテムをスキャンしてみると。。。
きちんとアイテムの追加が反映されていますね!
まとめ
DynamoDB Cross-region Replicationを試してみました。兼ねてからマルチリージョンでの展開にはデータ同期がネックになると言われていましたので、それを解決する強力なツールになること間違いなしですね。レプリケーションの実装自体はEC2ですので、より頻繁に更新されるテーブルを扱う要件やレプリケーション遅延を短くする要件の場合はインスタンス数やインスタンスタイプでチューニングすることになると思います。
参考URL
- Embrace event-driven computing: Amazon expands DynamoDB with streams, cross-region replication, and database triggers - All Things Distributed
- Cross-Region Replication Using DynamoDB Streams - Amazon DynamoDB
脚注
- S3の静的ページでホストされているため、APIキーはサーバーサイドでは保管されない作りのようです。ページをリロードすると毎回入力を求められます(笑) ↩