以前、大量のデータがあるDynamoDBのリストア方法を考える機会がありました。
DynamoDBのリストア自体はDynamoDBの機能(オンデマンドバックアップ、ポイントインタイムリカバリ)やAWS Backupを利用すれば実現できます。
しかし、テーブル名はAWS アカウントとリージョンで一意という制約があるため、リストア元のテーブルが存在する場合、リストアされたテーブルの名前は別名である必要があります。 そのため、単純にリストアしただけでは、別名となったテーブルで運用する事となるため、アプリケーション側に大きな影響を与えます。
当記事では、アプリケーション側の影響が少ないDynamoDBのリストア方法を中心に紹介し、運用観点から見たそれぞれのパターンのメリット・デメリットをまとめてみます。
最初に断っておきますが、当記事執筆時点(2022年11月)でスマートな解決方法はありません。
アプリケーション側で工夫するか、クラウド側で工夫するか、そのどちらかになります。
DynamoDBのリストア方法を検討中の方。
リストア方法をご紹介する前に、DynamoDBには以下の仕様と制約があります。
・既存のテーブルにリストアされない
(テーブルが新規作成され、そのテーブルにリストアされる)
・テーブル名はAWS アカウントとリージョンで一意
・テーブル名の編集が出来ない
したがって、既存のテーブル、もしくは既存のテーブル名を利用し続ける場合、一工夫が必要となります。
これから挙げさせていただく方法はどれもメリット・デメリットがあり、ベストな方法はありません。
テーブルがどのくらいのデータ量か、システムのRPO・RTOがどのように定義されているのかを考慮して、DynamoDBのリストア方法を検討してください。
今回は下記の5つの方法をご紹介します。
①別名でリストアされたテーブルを運用する
②ツール利用して、リストアされたテーブルからデータをエクスポートし、リストア元のテーブルにデータをインポートする
③S3へのエクスポート機能、S3からのインポート機能を利用する
④リストア元のテーブルを削除した後、バックアップからリストア元のテーブル名でリストアする
⑤リストアを2回実施する
冒頭で紹介しました一番シンプルな方法です。
DynamoDBの機能(オンデマンドバックアップ、ポイントインタイムリカバリ)、AWS Backupを利用して、テーブルをリストアします。別名で作成されたテーブルを運用していきます。
・シンプル
・アプリケーション側の影響が非常に大きい
・(リストア元のテーブルをCloudFormationで作成していた場合)
テーブル名が別名になったことによりCloudFormationの管理から外れる
→CloudFormationのインポート機能を利用すればこの問題は解決
・リストアによって外れる設定を手動で設定し直す必要がある。
リストアによって外れる設定は以下の通り。
・Auto Scaling ポリシー ・AWS Identity and Access Management (IAM) ポリシー ・Amazon CloudWatch メトリクスおよびアラーム ・タグ ・ストリーム設定 ・有効期限 (TTL) 設定 ・ポイントインタイムリカバリ設定 |
引用:ポイントインタイムリカバリ: 仕組み - Amazon DynamoDB
EC2上でPythonなどで作成したツールを利用して、リストアされたテーブルからデータをエクスポートします。その後、エクスポートしたデータをリストア元のテーブルにインポートし、リストア元のテーブルを引き続き利用していく方法です。
・既存のテーブルを利用できるため、アプリケーション側の影響が少ない
・CloudFormationの管理から外れない
・リストア地点より以降に書き込みがされたデータは残り続けるため、厳密なリストアとは言えない
・エクスポートするデータ量に合わせて、一時的にデータを格納するEC2のストレージも拡張しなければならない。
・データ量に比例してエクスポート、インポートにかかる時間が増える
S3へのエクスポート機能でデータをエクスポートします。既存テーブルを削除後、S3からのインポート機能で同名のテーブルを作成する方法です。
・既存のテーブル名を利用できるため、アプリケーション側の影響が少ない
・CloudFormationの管理から外れない
・②の方法より安価
・35日以内の特定地点のデータをエクスポートすることができる
・既存のテーブルを削除するため、ダウンタイムが発生する
・S3からのインポート機能に1TBの制限がある
・データ量に比例してエクスポート、インポートにかかる時間が増える
オンデマンドバックアップかAWS Backupによるバックアップを取得した後、
バックアップからリストア元のテーブル名でリストアする方法です。
・データ量による制限がない
・既存のテーブル名を利用できるため、アプリケーション側の影響が少ない
・テーブル名が変わらないため、リストアによって外れる設定を手動によって設定しなおせば、CloudFormationによる管理を維持できる。
・ポイントインタイムリカバリが利用できない
・既存のテーブルを削除するため、ダウンタイムが発生する
・リストアによって外れる設定を手動によって設定し直す必要がある
ポイントインタイムリカバリでリストアした後、リストア元のテーブルを削除。リストアされたテーブルから元のテーブル名で再度リストアする方法です。
・シンプル
・データ量による制限がない
・既存のテーブル名を利用できるため、アプリケーション側の影響が少ない
・テーブル名が変わらないため、リストアによって外れる設定を手動によって設定しなおせば、CloudFormationによる管理を維持できる
・35日以内の特定地点のデータをリストアすることができる
・既存のテーブルを削除するため、ダウンタイムが発生する
・2回テーブルを作成する事となるため、非常にコストがかかる
・リストアによって外れる設定を手動によって設定し直す必要がある
・1回目のリストア地点より前の地点でリストアすることができない
今回はDynamoDBのリストア方法を5つご紹介しました。
この記事が少しでもお役に立てたのなら幸いです。