【DynamoDB】ポイントインタイムリカバリを使ってみた - サーバーワークスエンジニアブログ

【DynamoDB】ポイントインタイムリカバリを使ってみた

記事タイトルとURLをコピーする

こんにちは。 ディベロップメントサービス1課の山本です。

今回は、Amazon DynamoDB(以下、DynamoDB)のポイントインタイムリカバリ機能を使ってみようと思います。
こちらもAWS Certified Solutions Architect - Associateの問題集でよく出ていましたので、受けようと思っている方は必見です!

AWS Certified Solutions Architect – Associate 認定

ポイントインタイムリカバリ機能とは

有効にすることで、35日前~5分前の時点のテーブル内容を復元できる機能となります。
利用を想定するケースとしては、下記のような誤った操作後に復元を行うケースです。

  • 誤ってDynamoDB内のデータを上書きしてしまった。。。
  • 誤ってDynamoDB内のデータを削除してしまった。。。

この機能を利用することで、上書き/削除前のデータへと復元することができます。

ただ注意点として別テーブルとして復元されてしまうため、元のテーブルに復元する際にはひと工夫が必要になります。

ポイントインタイムリカバリによる復元

docs.aws.amazon.com

設定方法

マネジメントコンソール上の、テーブルのバックアップタブを選択することで設定が可能です。

テーブルのバックアップタブ画面
ポイントインタイムリカバリ設定画面

データの投入

今回は下記のプログラムを作成して、10秒おきにDynamoDBにデータをPUTしました。
PUTデータにタイムスタンプをセットすることで、実際どのタイミングのデータまで復元されるのか確認します。

import boto3
import time
from datetime import datetime, timezone

session = boto3.Session(profile_name='*********')
dynamodb_client =session.client('dynamodb',
                        region_name='ap-northeast-1',
                        )
sample_id = 0
while True:
    dt_now = datetime.now()
    response = dynamodb_client.put_item(
        TableName = 'sample-table',
        Item = {
            'sample-id': {
                'S': str(sample_id)
            },
            'timestamp':{
                'S': dt_now.isoformat()
            }
        }
    )
    sample_id += 1
    time.sleep(10)

復元方法

同じくマネジメントコンソール上の、テーブルのバックアップタブを選択することで復元が可能です。
その際、復元先のテーブルは新規作成となり、元テーブルとは異なるものになります。

テーブルのバックアップタブ画面(復元)
復元の設定画面

今回、500レコード程度のデータの復元だったのですが5分程度時間がかかりました。 作成されたテーブルの中身を確認すると、問題なく復元できておりました。

復元したテーブル内容

復元の設定画面:13時56分6秒、復元したテーブル内容:13時56分28秒

おそらく設定画面で、20秒くらいモジモジしてたことの時間差によるものだと考えられます。大きなズレなく、特定タイミングで復元できていることがわかります。

元テーブルへの復元方法

元テーブルへ復元したデータを戻さないことには、他サービスからは何も変わらないため戻す方法を考えます。

下記に考えられる方法をパターン分けしました。

  1. 復元テーブルをそのまま使う
  2. 復元テーブルから元テーブルと同名のテーブルを作成する
  3. 復元テーブルのデータに合わせて、元テーブルのデータを加工する

それぞれの方法でメリット・デメリットを記載します。
構築している環境や構築方法によっても、最適な方法は異なるので参考にして頂ければと思います。

1. 復元テーブルをそのまま使う

復元テーブルをそのまま使う
メリット

  • DynamoDBに対しては、新規の作業がない

デメリット

  • 他サービスからの参照先テーブル名を全て変更する必要がある
  • CloudFormationで構築している場合、管理から外れる

2. 復元テーブルから元テーブルと同名のテーブルを作成する

復元テーブルから元テーブルと同名のテーブルを作成する
メリット

  • AWS上の機能を利用することで、低い作業量で移行可能
  • 他サービスからの参照先テーブル名を変更する必要がない

デメリット

  • CloudFormationで構築している場合、管理から外れる

3. 復元テーブルのデータに合わせて、元テーブルのデータを加工する

復元テーブルのデータに合わせて、元テーブルのデータを加工する
メリット

  • CloudFormationで構築している場合、管理から外れない
  • 他サービスからの参照先テーブル名を変更する必要がない

デメリット

  • 移行プログラムを自作する必要がある
  • データ量に応じて、EC2等の処理するハードのスペックを検討する必要がある
  • 大量のRead/Write処理が発生する

元テーブルへの復元実施

今回は2. 復元テーブルから元テーブルと同名のテーブルを作成する
DynamoDBのバックアップ機能を利用して、復元してみようと思います。

こちらのやり方はAWSのドキュメントにも記載されてますので、参考に頂ければと思います。

docs.aws.amazon.com

まず、元テーブルを削除します。

元テーブル削除

次にバックアップタブから、バックアップの作成を選択します。 デフォルト設定だと1時間後にバックアップを作成するので、カスタマイズ設定で今すぐ作成に変更してます。

バックアップタブ(バックアップ作成)

バックアップ作成画面

バックアップの詳細画面から復元を選択して、元テーブルと同名で作成します。

バックアップ詳細画面

バックアップからテーブル復元画面

無事、同じテーブル名でデータを復元させることができました。
(500レコードで3分くらいかかりました。)

復元後のテーブル

コスト

東京リージョンでのポイントインタイムリカバリでのバックアップ料金は下記となってます。 (オンデマンド/プロビジョンドキャパシティ共に)
サイズが小さいテーブルの場合は、問題にならない料金だと思われます。

継続的バックアップ (PITR): 0.228USD/GB-月

aws.amazon.com

さいごに

備えあれば憂いなしなので、ぜひ設定しましょう。

本ブログがどなかたのお役に立てれば幸いです。

山本 真大(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2023年8月入社。カピバラさんが好き。