背景・目的
DynamoDB(以降、DDBという。)のバックアップを試したときのメモを残しておきます。
まとめ
バックアップとリストアでは、以下の3つが利用できます。
パターン | 特徴 | 仕組み | 用途 |
---|---|---|---|
PITR | 過去35日〜直近5分前までの間で任意の時間に復旧可能 | DDBの機能 | 分単位で任意の時間に戻したい場合 |
オンデマンドバックアップ | 任意のタイミングでバックアップを実行 | AWS Backupまたは、DDBの機能 | 35日より前のデータを使用してリストアしたい場合 |
S3エクスポート | 任意のタイミングでエクスポート JSONフォーマットで出力される。 |
DDBの機能 | 35日より前のデータを使用してリストアしたい場合、または他のAWSサービス(Athenaなど)で利用する場合 ※エクスポートは35日間で任意の時間。 |
内容
DDBのバックアップ
DDBでは、以下の方法でバックアップが取れます。
- PITR
- オンデマンドバックアップ
- S3へのエクスポート
PITR
PITRは、以下の特徴があります。
- 自動バックアップする。
- 誤った書き込みや削除オペレーションから保護ができる。
- 過去35日間の任意の時点にテーブルを復元できる。
- 増分バックアップが維持される。
PITRの仕組み
- 有効化には、CLI、マネコン、APIを使用する。
- 有効化後には、明示的に無効化するまで、連続バックアップを行う。
- EarliestRestorableDateTime、LatestRestorableDateTime内の任意の時点に復元が可能。
オンデマンドバックアップ
オンデマンドバックアップには、以下の特徴があります。
- S3に出力する。
- DynamoDB オンデマンドバックアップの作成と管理に使用できるオプションは2つ
- AWS Backup
- DynamoDB
- AWS Backupを使用するほうがより高度なバックアップの設定が可能になります。
- バックアップウィンドウをカスタマイズ
- 保持期間
S3エクスポート
S3エクスポートには、以下の特徴があります。
- JSONフォーマットとIonフォーマットの形式が選べます。
- DDB JSON(JSONLかと思われる)
- Amazon Ion
- PITRが前提(有効化する必要あり)
- クロスアカウントのS3バケットに出力
実践
事前準備
DDBのテーブル作成とデータ登録
-
以下の内容を設定し、テーブルを作成します。
S3エクスポート用のS3バケットを作成
PITR〜リストアまで確認
PITRを設定
-
設定されました。
-
時間を空けて確認する。LatestRestorableDateTimeが更新されています。
リストアする
リストアを確認したいので、データをもう一件登録してから戻します。
-
復元ポイントを確認します。
-
以下を設定して、復元ボタンをクリックします。
(オンデマンド)バックアップ〜リストアまで確認
バックアップの作成
-
以下を設定し、「バックアップの作成」をクリックします。
リストアの確認
-
以下を設定し、「復元」ボタンをクリックします。
S3へのエクスポート〜インポートを確認
エクスポート(DynamoDB JSON)
-
以下を指定して、「エクスポート」ボタンをクリックします。
-
S3に出力されているファイルを確認します。
-
ファイルを確認します。
$ aws s3 ls s3://XXXX/AWSDynamoDB/01666797594287-01966116/
PRE data/
2022-10-27 00:20:04 0 _started
2022-10-27 00:25:05 780 manifest-files.json
2022-10-27 00:25:05 24 manifest-files.md5
2022-10-27 00:25:05 595 manifest-summary.json
2022-10-27 00:25:05 24 manifest-summary.md5
$
# manifest-summary.json
# DDBのテーブルやS3バケット、エクスポートの時間などのメタ情報が含まれています。
$ aws s3 cp s3://XXXX/AWSDynamoDB/01666797594287-01966116/manifest-summary.json - | cat
{"version":"2020-06-30","exportArn":"arn:aws:dynamodb:eu-west-1:XXXXXXXX:table/PITR_TABLE/export/01666797594287-01966116","startTime":"2022-10-26T15:19:54.287Z","endTime":"2022-10-26T15:25:03.955Z","tableArn":"arn:aws:dynamodb:eu-west-1:XXXXXX:table/PITR_TABLE","tableId":"d9a39fca-e724-44e4-9189-7d5d45304728","exportTime":"2022-10-26T15:19:54.287Z","s3Bucket":"XXXXX","s3Prefix":null,"s3SseAlgorithm":"AES256","s3SseKmsKeyId":null,"manifestFilesS3Key":"AWSDynamoDB/01666797594287-01966116/manifest-files.json","billedSizeBytes":0,"itemCount":2,"outputFormat":"DYNAMODB_JSON"}%
$
# manifest-files.json
# 各ファイルのメタ情報が含まれています。
$ aws s3 cp s3://XXXX/AWSDynamoDB/01666797594287-01966116/manifest-files.json - | cat
{"itemCount":0,"md5Checksum":"OXDoJgXH0Qm7NI/JTp7swA==","etag":"67c8121a4701556ecf2fa9dda42c0269-1","dataFileS3Key":"AWSDynamoDB/01666797594287-01966116/data/fnblvdmmk4z3bl6gg7corchca4.json.gz"}
{"itemCount":1,"md5Checksum":"4Rx5LCkCrXtah9HKl8jZhA==","etag":"d7abf64e60031299a99a8089884c000d-1","dataFileS3Key":"AWSDynamoDB/01666797594287-01966116/data/p3aan7gpcy7fxlnqhcffk7btoy.json.gz"}
{"itemCount":0,"md5Checksum":"OXDoJgXH0Qm7NI/JTp7swA==","etag":"67c8121a4701556ecf2fa9dda42c0269-1","dataFileS3Key":"AWSDynamoDB/01666797594287-01966116/data/b7q7562gxy665cqqnwtsrtvlki.json.gz"}
{"itemCount":1,"md5Checksum":"yUhjsDPrDjVH5HcTrF8h4Q==","etag":"f435bb6c65036af0ea9544c21437aab1-1","dataFileS3Key":"AWSDynamoDB/01666797594287-01966116/data/fhuco7s7heyhjp3h7xutorfofe.json.gz"}
$
# ファイルの一覧を確認
$ aws s3 ls s3://XXXX/AWSDynamoDB/01666797594287-01966116/data/
2022-10-27 00:24:47 20 b7q7562gxy665cqqnwtsrtvlki.json.gz
2022-10-27 00:24:33 67 fhuco7s7heyhjp3h7xutorfofe.json.gz
2022-10-27 00:24:17 20 fnblvdmmk4z3bl6gg7corchca4.json.gz
2022-10-27 00:23:51 55 p3aan7gpcy7fxlnqhcffk7btoy.json.gz
$
# ファイルの中身を確認-1
$ aws s3 cp s3://XXXX/AWSDynamoDB/01666797594287-01966116/data/fhuco7s7heyhjp3h7xutorfofe.json.gz - | gunzip | cat
{"Item":{"id":{"N":"1"},"time":{"N":"20221026225400"}}}
$
# ファイルの中身を確認-2
$ aws s3 cp s3://XXXX/AWSDynamoDB/01666797594287-01966116/data/p3aan7gpcy7fxlnqhcffk7btoy.json.gz - | gunzip | cat
{"Item":{"id":{"N":"2"},"time":{"N":"2022"}}}
$
リストアの確認
-
以下を入力し、「次へ」をクリックします。
エクスポート(Ion)
Ion形式のファイルフォーマットを確認するのが狙いです。リストアはしません。
$ aws s3 ls s3://XXXX/ion/AWSDynamoDB/01666801666929-575fbad8/
PRE data/
2022-10-27 01:27:52 0 _started
2022-10-27 01:32:52 792 manifest-files.json
2022-10-27 01:32:52 24 manifest-files.md5
2022-10-27 01:32:52 590 manifest-summary.json
2022-10-27 01:32:52 24 manifest-summary.md5
$
$ aws s3 ls s3://XXXX/ion/AWSDynamoDB/01666801666929-575fbad8/data/
2022-10-27 01:32:15 64 22mgtokmku6jpjbgidajulhv5u.ion.gz
2022-10-27 01:32:28 55 5rhm7z5ewe3afabv2oame3mdea.ion.gz
2022-10-27 01:32:14 20 7dmjxzvbvuyh7dt6pv3kpn2lca.ion.gz
2022-10-27 01:32:34 20 gecqj3a36q42haohk4uf525lue.ion.gz
$
$ aws s3 cp s3://XXXX/ion/AWSDynamoDB/01666801666929-575fbad8/data/22mgtokmku6jpjbgidajulhv5u.ion.gz - | gunzip | cat
$ion_1_0 {Item:{id:1.,time:202210262254d2}}
$
$ aws s3 cp s3://XXXX/ion/AWSDynamoDB/01666801666929-575fbad8/data/5rhm7z5ewe3afabv2oame3mdea.ion.gz - | gunzip | cat
$ion_1_0 {Item:{id:2.,time:2022.}}
$
考察
- 今回は、バックアップとS3エクスポートを試しました。
- DDBの復旧には、PITRまたはオンデマンドバックが利用できます。
- 他システムで分析などに利用するには、S3エクスポートを利用します。
参考