Amazon DynamoDB テーブルを別のアカウントに移行する
2022.9.2
はじめに
DynamoDB テーブルを別の AWS アカウントに移行するには DynamoDB のエクスポート・インポート機能を使えば簡単に実現できます。
2022/08 のアップデートで DynamoDB にインポート機能が追加されたため、ほぼ DynamoDB だけでアカウント移行ができるようになりました。
Amazon DynamoDB が Amazon S3 のデータを新しいテーブルにインポートできるようになりました | Amazon Web Services ブログ
概要
DynamoDB テーブルを別の AWS アカウントに移行するには、次の手順を実行します。
- DynamoDB テーブルデータを別のアカウントの S3 バケットにエクスポートします。
- DynamoDB インポート機能を使用して S3 からデータをインポートします。

やってみる
リソースの作成は 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
}
テーブルとデータが出来たことを確認します。


アカウント 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 に DynamoDB テーブルデータをエクスポートする
準備が整ったのでエクスポートを行います。
作成したテーブルを選択して「エクスポートおよびストリーム」のタブ選択してエクスポートします。

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

実行したら完了するまで待ちます。

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

色々と出来てますが、実際のデータは data 配下にあります。
DynamoDB でテーブルのインポートをリクエストする
先程エクスポートされた S3 のデータを使用してインポートします。
DynamoDB のコンソール画面からインポートを選択します。

インポート詳細を入力する画面で注意点が 2 つあります。
- 圧縮タイプは GZIP を選択する
- ソース 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
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。
Recommends
こちらもおすすめ
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16
