Amazon DynamoDB テーブルを別のアカウントに移行する

AWS

2022.9.2

Topics

はじめに

DynamoDB テーブルを別の AWS アカウントに移行するには DynamoDB のエクスポート・インポート機能を使えば簡単に実現できます。

2022/08 のアップデートで DynamoDB にインポート機能が追加されたため、ほぼ DynamoDB だけでアカウント移行ができるようになりました。
Amazon DynamoDB が Amazon S3 のデータを新しいテーブルにインポートできるようになりました | Amazon Web Services ブログ

概要

DynamoDB テーブルを別の AWS アカウントに移行するには、次の手順を実行します。

  1. DynamoDB テーブルデータを別のアカウントの S3 バケットにエクスポートします。
  2. DynamoDB インポート機能を使用して S3 からデータをインポートします。

DynamoDBアカウント移行構成図

やってみる

リソースの作成は Terraform を使用して実施します。
その後の作業である「エクスポート・インポート」はコンソール画面で操作します。

provider.tf と variables.tf は省略します。

必要リソース作成

  • アカウント A の移行元に DynamoDB テーブルを作成します
  • アカウント B にエクスポートするデータを格納する S3 を作成します

アカウント A に DynamoDB 作成

大事なポイントとして、DynamoDB のエクスポート機能はPITRが有効じゃないと使用できません。

新機能 – Amazon DynamoDB に継続的バックアップと Point-In-Time-Recovery(PITR)機能が追加されました | Amazon Web Services ブログ

resource "aws_dynamodb_table" "STANDARD" {
  name           = "GameScores"
  billing_mode   = "PROVISIONED"
  read_capacity  = 20
  write_capacity = 20
  hash_key       = "UserId"
  range_key      = "GameTitle"
  point_in_time_recovery {
    enabled = true
  }
  attribute {
    name = "UserId"
    type = "S"
  }

  attribute {
    name = "GameTitle"
    type = "S"
  }
}

Terraform でテーブルと合わせて、検証用に 2 件のデータを作成します。

resource "aws_dynamodb_table_item" "example1" {
  table_name = aws_dynamodb_table.STANDARD.name
  hash_key   = aws_dynamodb_table.STANDARD.hash_key
  range_key  = aws_dynamodb_table.STANDARD.range_key
  item       = <<ITEM
{
  "UserId": {"S": "test"},
  "GameTitle": {"S": "4"}
}
ITEM
}
resource "aws_dynamodb_table_item" "example2" {
  table_name = aws_dynamodb_table.STANDARD.name
  hash_key   = aws_dynamodb_table.STANDARD.hash_key
  range_key  = aws_dynamodb_table.STANDARD.range_key
  item       = <<ITEM
{
  "UserId": {"S": "test"},
  "GameTitle": {"S": "5"}
}
ITEM
}

テーブルとデータが出来たことを確認します。

DynamoDBテーブル概要

移行元テーブルの2件のデータ

アカウント B に S3 作成

次に DynamoDB のエクスポート先に指定する S3 を作成します。

アカウント A の DynamoDB がアクセスできるように、S3 バケットポリシーで権限を設定します。
var.account_idはアカウント A の AWS アカウント ID を入力してください。

ポリシーは以下を参考にしました。
DynamoDB でテーブルのエクスポートをリクエストする – Amazon DynamoDB

resource "aws_s3_bucket" "bucket" {
  bucket = "${var.project_name}-bucket"
}
resource "aws_s3_bucket_acl" "bucket_acl" {
  bucket = aws_s3_bucket.bucket.id
  acl    = "private"
}
resource "aws_s3_bucket_policy" "allow_access_from_another_account" {
  bucket = aws_s3_bucket.bucket.id
  policy = data.aws_iam_policy_document.allow_access_from_another_account.json
}

data "aws_iam_policy_document" "allow_access_from_another_account" {
  statement {
    principals {
      type        = "AWS"
      identifiers = ["${var.account_id}"]
    }
    effect = "Allow"
    actions = [
      "s3:AbortMultipartUpload",
      "s3:PutObject",
      "s3:PutObjectAcl",
      "s3:ListBucket"
    ]

    resources = [
      "${aws_s3_bucket.bucket.arn}",
      "${aws_s3_bucket.bucket.arn}/*",
    ]
  }
}

バケットが出来たことを確認します。

作成したS3バケット

S3 に DynamoDB テーブルデータをエクスポートする

準備が整ったのでエクスポートを行います。
作成したテーブルを選択して「エクスポートおよびストリーム」のタブ選択してエクスポートします。

DynamoDBテーブルエクスポート画面

アカウント B の AWS アカウント ID と S3 の URL を指定します。
追加設定は特に変更していません。

エクスポートの詳細画面

実行したら完了するまで待ちます。
DynamoDBテーブルエクスポート完了画面

エクスポートが完了したらアカウント B の S3 バケットの中身を見てみます。

S3にエクスポートされたDynamoDBテーブルデータ

色々と出来てますが、実際のデータは data 配下にあります。

DynamoDB でテーブルのインポートをリクエストする

先程エクスポートされた S3 のデータを使用してインポートします。

DynamoDB のコンソール画面からインポートを選択します。

インポートの設定画面

インポート詳細を入力する画面で注意点が 2 つあります。

  1. 圧縮タイプは GZIP を選択する
  2. ソース S3URL は対象のデータのみを指定する

先程の S3 バケットを見てもらうとわかりますが、データファイル以外に色々と生成されます。
そのため、バケット全体を指定すると他のファイルもインポート対象となりますが形式が違うためエラーになります。

↓ ソース S3URL は今回の場合はこちらで指定します。
s3://account-b-destination-bucket/AWSDynamoDB/01661496152558-14061b13/data/

インポートするテーブルの情報を入力します。
これは移行元のテーブルと同じように入力します。
インポートテーブルの詳細設定画面

その他はデフォルトにしています。

インポートするテーブル設定画面

あとは、待つだけです。
しばらくするとインポートが終わり移行元と同じ行数が作成されていることが確認できます。
インポート結果画面

まとめ

データ量によってエクスポート・インポートの時間は変化すると思われますが、大体 30 分ぐらいで全作業は完了できました。
以前は Gule とか使ってインポートする必要があったのですが、ほぼ DynamoDB の機能だけで完結できるようにアップデートしました。

参考記事

DynamoDB テーブルをある AWS アカウントから別のアカウントに移行する
Amazon DynamoDB は、Amazon S3 から新しい DynamoDB テーブルへの一括インポートをサポートするようになりました
Amazon DynamoDB が Amazon S3 のデータを新しいテーブルにインポートできるようになりました | Amazon Web Services ブログ
DynamoDB テーブルのエクスポート出力形式 – Amazon DynamoDB
DynamoDB でテーブルのエクスポートをリクエストする – Amazon DynamoDB

Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら