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 でのみ実行可能なようですが、問題なく実行できました。

参考


以上、よっしー (michimani) でした。

Share to ...

0

Follow on Feedly


comments powered by Disqus