11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DynamoDBのバックアップとS3エクスポートを試してみた

Last updated at Posted at 2022-10-26

背景・目的

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のテーブル作成とデータ登録

  1. 以下の内容を設定し、テーブルを作成します。

    • テーブル名:PITR_TEST
    • パーティションキー:id (数値)
    • ソートキー:time(文字列)
    • テーブルクラス:DynamoDB標準
    • 保管時の暗号化:Amazon DynamoDBが所有
      image.png
      image.png
  2. データを登録します。アクションから「項目を作成」をクリックします。
    image.png

  3. idとtimeに値を入力し、「項目を作成」をクリックします。
    image.png

S3エクスポート用のS3バケットを作成

  1. バックアップ用のS3バケットを作成しておきます。
    image.png

PITR〜リストアまで確認

PITRを設定

  1. テーブルのバックアップタブで「編集」をクリックします。
    image.png

  2. 「ポイントタイムリカバリの有効化」にチェックを入れて、「変更を保存」をクリックします。
    image.png

  3. 設定されました。

    • EarliestRestorableDateTime(最も早い復元ポイント):2022/10/26 22:59:23
    • LatestRestorableDateTime(最も遅い復元ポイント):2022/10/26 22:59:23
      image.png
  4. 時間を空けて確認する。LatestRestorableDateTimeが更新されています。

    • EarliestRestorableDateTime(最も早い復元ポイント):2022/10/26 22:59:23
    • LatestRestorableDateTime(最も遅い復元ポイント):2022/10/26 23:01:46
      image.png

リストアする

リストアを確認したいので、データをもう一件登録してから戻します。

  1. データを登録します。
    image.png

  2. 復元ポイントを確認します。

    • EarliestRestorableDateTime(最も早い復元ポイント):2022/10/26 22:59:23
    • LatestRestorableDateTime(最も遅い復元ポイント):2022/10/26 23:41:20
      image.png
  3. 「復元」ボタンをクリックします。
    image.png

  4. 以下を設定して、復元ボタンをクリックします。

    • 復元されたテーブル名:PITR_TABLE2
    • ポイントタイムリカバリ
      • 日時の指定:2022/10/26 23:00:00 **※最も早い復元ポイントに近い時間。(想定では、データが一件しかない状態) **
    • セカンダリーインデックス
      • なし
    • リージョン
      • 同一リージョン
    • 暗号化設定
      • DDB所有の暗号化キー
        image.png
  5. しばらくするとアクティブになりました。(時間にして5分程度?)
    image.png
    image.png

  6. データを確認します。一件だけ登録されているので想定どおりです。
    image.png
    ※なお、元テーブルは二件登録されています。
    image.png

(オンデマンド)バックアップ〜リストアまで確認

バックアップの作成

  1. 「バックアップの作成」をクリックします。
    image.png

  2. 以下を設定し、「バックアップの作成」をクリックします。

    • バックアップ設定:設定をカスタマイズを選択
    • バックアップの管理:DDBを使用してバックアップ
    • バックアップ名:PITR_TABLE2を指定
      image.png
  3. すぐにバックアップが完了しました。
    image.png

リストアの確認

  1. 該当のバックアップを選択し、「復元」ボタンをクリックします。
    image.png

  2. 以下を設定し、「復元」ボタンをクリックします。

    • 復元されたテーブルの名前:PITR_TABLE3
    • セカンダリインデックス:セカンダリインデックスなしでテーブルの復元
    • 復元先リージョン:AWSリージョン
    • 保管中の暗号化の設定:DDBが所有
      image.png
  3. しばらくするとアクティブになります。
    image.png
    image.png

  4. データを確認します。PITR_TABLE2から復元したのでデータは一件です。
    image.png

S3へのエクスポート〜インポートを確認

エクスポート(DynamoDB JSON)

  1. 該当テーブルで、「エクスポートおよびストリーム」タブで「S3へのエクスポート」ボタンをクリックします。
    image.png

  2. 以下を指定して、「エクスポート」ボタンをクリックします。

    • 送信先S3バケット:作成したS3バケットを指定
    • S3バケット所有者:このAWSアカウントを指定
    • 特定の時点からのエクスポート:現在の時刻
    • エクスポートされたファイル形式:DynamoDB JSONを指定
    • 暗号化キータイプ:SSE-S3を指定
      image.png
  3. しばらくすると、エクスポート中から、完了になります。
    image.png
    image.png

  4. S3に出力されているファイルを確認します。

    • AWSDynamoDB/タイムスタンプ?の下に以下のファイル、フォルダが作成されています。
      image.png
  5. ファイルを確認します。

$ 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"}}}
$

リストアの確認

  1. S3からのインポート画面で「S3からインポート」をクリックします。
    image.png

  2. 以下を入力し、「次へ」をクリックします。

    • ソースS3パス:エクスポートしたファイルを指定
    • S3バケット所有者:このAWSアカウント
    • ファイル圧縮をインポート:「GZIP」
      image.png
  3. 以下を入力し「次へ」をクリックします。
    image.png

  4. 「インポート」をクリックします。
    image.png

  5. しばらくするとアクティブになります。
    image.png
    image.png

  6. データを確認します。
    image.png

エクスポート(Ion)

Ion形式のファイルフォーマットを確認するのが狙いです。リストアはしません。

  1. Ion形式を選択して「エクスポート」をクリックします。
    image.png

  2. ファイルを確認します。

$ 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エクスポートを利用します。

参考

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?