DatapipelineでDynamoDBを別アカウントのDynamoDBへデータ移行する
別アカウントへDynamoDBのデータをコピーしたい
MySQLだとdumpしたデータをexportしたり、RDSならスナップショット機能を使って、 別アカウントへのデータの移行は可能だと思います。 DynamoDBの場合はData Pipelineを使用するのがセオリーのようですが、 ちょっとハマったので記録を残しておきます。
目次
[1] 移行元アカウントでの作業
(1) 移行先のアカウントにS3バケットを作成して、バケットポリシーを設定する
クロスアカウントアクセスを許可するため、おおよそ以下の様な感じのバケットポリシーを設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{{ 移行先のアカウントID }}:role/DataPipelineDefaultResourceRole" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::{{ 移行先のバケット名 }}/*", "arn:aws:s3:::{{ 移行先のバケット名 }}" ] } ] }
(2) データパイプラインの作成
基本的な手順は公式ドキュメントを参照していただければ問題ないかと思います。 ざっくり今回の設定したものを示すと以下の様な感じになります。
(3) データが大きい場合にPipelineがFAILEDになってしまう場合
DynamoDBの読込みのキャパシティユニットが不足していて読込に時間がかかりData Pipelineのタイムアウトにひっかかる
=> RCUを積んでおきましょうコアノードのメモリ不足 もともとデフォルトで設定されているインスタンスタイプが本日時点ではm3.large(2世代前)かつ1つとなっているので、 以下の様な感じでスケールアップかスケールアウトを考えてみる。
[2] 移行先アカウントでの作業
(1) DynamoDBデータのACLを変更
S3において、別アカウントがオブジェクトを作成した場合、そのオブジェクトの所有権は作成者にあります。 今回のDataPipelineは移行元のアカウントに作成しているので、DynamoDBのバックアップデータの所有権は 移行元アカウントになっています。 そのため移行先のアカウントでは設定はおろか閲覧もできない状態です。
まずは、バケットの所有者に権限を付与することをAWS CLIにて行います。
1.オブジェクトのACLを確認
aws s3api get-object-acl --bucket {{ bucket名 }} --key {{ オブジェクトのパス }} --profile {{移行元アカウントのプロフィール}}
2.オブジェクトに対して、バケット所有者に権限を付与するようにACLを変更
aws s3api put-object-acl --bucket {{ bucket名 }} --acl bucket-owner-full-control --key {{ オブジェクトのパス }} --profile {{移行元アカウントのプロフィール}}
今回は手でコマンド書いて対応できる範囲だったので1つ1つ対応しましたが、 数が多い場合はスクリプトを書いたり、もっと上手いやり方を考える必要がありそうです。
(2) DynamoDBへのimport
ここまでくれあばあとは公式ドキュメントをご参照ください。
[3] 所感
EMRについては試験対策でしか触れたことがない程度ですが、 マネコンをぽちぽちでけっこう手軽にDynamoDBのコピーができました。 少し設定をいじれば定期的な対応も可能な様なので使い道が結構ありそうですね。 少しでも誰かの役に立てば嬉しいです。