michimani.net

DynamoDB でバックアップから別リージョンへのリストアができるようになったみたいなので試してみた

2020-02-19

DynamoDB のバックアップからテーブルをリストアする際に、他のリージョンにもリストアできるようになったみたいなので、実際に試してみました。

目次

概要

DynamoDB テーブルのバックアップからリストア (復元) する際に、元のテーブルと別のリージョンにリストアできるようになったようです。今回は、実際に 東京 (ap-northeast-1) で取得したバックアップを バージニア北部 (us-east-1) リージョンへリストアしてみました。

AWS 公式のアナウンスは下記記事を参照してください。

やってみる

手順としては下記の通りです。

  1. バックアップを作成する
  2. リージョンを指定して復元する

バックアップの作成については、普段からバックアップ取得している場合は不要です。

1. バックアップを作成する

今回は 東京 (ap-northeast-1) リージョンにある Thread テーブルを対象にします。バックアップが存在しないので、まずは手動でバックアップを作成します。

DynamoDB Restore - create backup 1
DynamoDB Restore - create backup 2
DynamoDB Restore - create backup 3
DynamoDB Restore - create backup 4

バックアップが作成されました。

今回はオンデマンドバックアップからの復元を試しますが、ポイントインタイムリカバリ (PITR) からの復元については AWS のブログ記事を参照してください。

2. リージョンを指定してリストアする

続いて、作成したバックアップからリストアします。

先ほど作成したバックアップを選択して バックアップの復元 ボタンを押します。

DynamoDB Restore - restore backup 1

すると、 クロスリージョンの復元 という項目があるので、ここでリストア先のリージョンを選択します。

DynamoDB Restore - restore backup 2

後の項目は適宜変更してください。

最後に テーブルの復元 ボタンを押すと、リストアが開始されます。

DynamoDB Restore - restore backup 3

リストア先のリージョンで確認する

復元ボタンを押した直後は、リストア先のリージョンではステータスが リストア中 となっています。

DynamoDB Restore - restore backup 4

リストアには最大で数時間かかると書かれていますが、今回は 5 分ほどでステータスが 有効 になりました。

DynamoDB Restore - restore backup 5

CLI でリストアしてみる

同じことを AWS CLI でやってみます。

AWS CLI のバージョンは、最新の v2.0.0 です。

$ aws --version
aws-cli/2.0.0 Python/3.7.4 Darwin/18.7.0 botocore/2.0.0dev4

コマンドとしては DynamoDB の restore-table-from-backup です。

$ aws dynamodb restore-table-from-backup \
--target-table-name ThreadFromBk \
--backup-arn arn:aws:dynamodb:ap-northeast-1:123456789012:table/Thread/backup/01582064716226-XXXXXXXX \
--region us-east-1

An error occurred (ValidationException) when calling the RestoreTableFromBackup operation: Invalid Request: sseSpecificationOverride must be provided for cross-region restores

エラーになりました。
どうやらクロスリージョンリストアには SSESpecificationOverride が必要なようです。

ただ、 v2.0.0 では restore-table-from-backup のオプションとして SSESpecificationOverride を渡すオプションがありません。 --generate-cli-skeleton オプションで確認してみても項目が見当たりません。

$ aws dynamodb restore-table-from-backup --generate-cli-skeleton
{
    "TargetTableName": "",
    "BackupArn": "",
    "BillingModeOverride": "PAY_PER_REQUEST",
    "GlobalSecondaryIndexOverride": [
        {
            "IndexName": "",
            "KeySchema": [
                {
                    "AttributeName": "",
                    "KeyType": "RANGE"
                }
            ],
            "Projection": {
                "ProjectionType": "INCLUDE",
                "NonKeyAttributes": [
                    ""
                ]
            },
            "ProvisionedThroughput": {
                "ReadCapacityUnits": 0,
                "WriteCapacityUnits": 0
            }
        }
    ],
    "LocalSecondaryIndexOverride": [
        {
            "IndexName": "",
            "KeySchema": [
                {
                    "AttributeName": "",
                    "KeyType": "RANGE"
                }
            ],
            "Projection": {
                "ProjectionType": "INCLUDE",
                "NonKeyAttributes": [
                    ""
                ]
            }
        }
    ],
    "ProvisionedThroughputOverride": {
        "ReadCapacityUnits": 0,
        "WriteCapacityUnits": 0
    }
}

ということで、 v1 の最新版である v1.18.2 で試してみます。
v1 と v2 の共用については、下記の記事を参考に環境を作りました。

(aws-cli-v1) $ aws --version
aws-cli/1.18.2 Python/3.7.5 Darwin/18.7.0 botocore/1.15.2

この環境で --generate-cli-skeleton オプションで確認してみると SSESpecificationOverride の項目が存在しています。

(aws-cli-v1) $ aws dynamodb restore-table-from-backup --generate-cli-skeleton
{
    "TargetTableName": "",
    "BackupArn": "",
    "BillingModeOverride": "PROVISIONED",
    "GlobalSecondaryIndexOverride": [
        {
            "IndexName": "",
            "KeySchema": [
                {
                    "AttributeName": "",
                    "KeyType": "RANGE"
                }
            ],
            "Projection": {
                "ProjectionType": "KEYS_ONLY",
                "NonKeyAttributes": [
                    ""
                ]
            },
            "ProvisionedThroughput": {
                "ReadCapacityUnits": 0,
                "WriteCapacityUnits": 0
            }
        }
    ],
    "LocalSecondaryIndexOverride": [
        {
            "IndexName": "",
            "KeySchema": [
                {
                    "AttributeName": "",
                    "KeyType": "HASH"
                }
            ],
            "Projection": {
                "ProjectionType": "INCLUDE",
                "NonKeyAttributes": [
                    ""
                ]
            }
        }
    ],
    "ProvisionedThroughputOverride": {
        "ReadCapacityUnits": 0,
        "WriteCapacityUnits": 0
    },
    "SSESpecificationOverride": {
        "Enabled": true,
        "SSEType": "KMS",
        "KMSMasterKeyId": ""
    }
}

help で確認してみても、 --sse-specification-override の説明があります。

(aws-cli-v1) $ aws dynamodb restore-table-from-backup help
...

OPTIONS
...
       --sse-specification-override (structure)
          The new server-side encryption settings for the restored table.

       Shorthand Syntax:

          Enabled=boolean,SSEType=string,KMSMasterKeyId=string

       JSON Syntax:

          {
            "Enabled": true|false,
            "SSEType": "AES256"|"KMS",
            "KMSMasterKeyId": "string"
          }

では、先ほどのコマンドを実行してみます。

(aws-cli-v1) $ aws dynamodb restore-table-from-backup \
--target-table-name ThreadFromBk \
--backup-arn arn:aws:dynamodb:ap-northeast-1:123456789012:table/Thread/backup/01582064716226-XXXXXXXX \
--sse-specification-override Enabled=false \
--region us-east-1
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "ForumName",
                "AttributeType": "S"
            },
            {
                "AttributeName": "Subject",
                "AttributeType": "S"
            }
        ],
        "TableName": "ThreadFromBk",
        "KeySchema": [
            {
                "AttributeName": "ForumName",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "Subject",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1582071746.299,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 1,
            "WriteCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:us-east-1:123456789012:table/ThreadFromBk",
        "TableId": "bd27f2d1-61c3-41e4-b91a-XXXXXXXXXXXX",
        "BillingModeSummary": {
            "BillingMode": "PROVISIONED"
        },
        "RestoreSummary": {
            "SourceBackupArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/Thread/backup/01582064716226-XXXXXXXX",
            "SourceTableArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/Thread",
            "RestoreDateTime": 1582064716.226,
            "RestoreInProgress": true
        }
    }
}

(aws-cli-v1) $ aws dynamodb list-tables --region us-east-1
{
    "TableNames": [
        "ThreadFromBk"
    ]
}

リストアが正常に実行され、バージニア北部 (us-east-1) リージョンにテーブルが作成されました。

CLI から実行する場合は、今 (2020/02/19) のところ v1 でのみ可能なようです。

まとめ

DynamoDB のバックアップからテーブルをリストアする際に、他のリージョンにもリストアできるようになったみたいなので、実際に試してみた話でした。

リージョンを跨いだリストアと聞くと面倒な印象がありましが、非常に簡単にリストアすることができました。
今回はマネジメントコンソールから実行しましたが、 CLI からも実行できるようなので、そちらもあらためて試してみようと思います。 CLI でのクロスリージョンリストアについては、現時点 (2020/02/19) では v1 でのみ実行可能なようですが、問題なく実行できました。

参考


comments powered by Disqus