ある AWS アカウントから別の AWS アカウントに DynamoDB テーブルを移行する方法を教えてください。
Amazon DynamoDB テーブルのデータを、同じアカウントまたは別のアカウント内の新しいテーブルにコピーしたいです。
簡単な説明
いくつかの方法で、ある AWS アカウントの DynamoDB テーブルから別の AWS アカウントにデータを転送することができます。最適な方法は、データ量、リアルタイム更新の必要性、データ変換の複雑さなどの要因に左右されます。
次のいずれかの方法で、ある AWS アカウントから別の AWS アカウントに DynamoDB テーブルを移行することができます。
- AWS Backup
- DynamoDB と Amazon Simple Storage Service (Amazon S3) 間のエクスポートとインポート
- Amazon EMR
- AWS Data Pipeline
- Amazon S3 と AWS Glue
- カスタムのエクスポート/インポート用スクリプト
解決策
ユースケースに応じて、次のタスクを実行します。
AWS Backup
AWS アカウントのソースとターゲットが同じ AWS Organizations 組織にある場合、AWS Backup はクロスリージョンおよびクロスアカウントの DynamoDB データ転送を実行できます。詳細については、「複数 AWS アカウントにわたるバックアップコピーを作成する」を参照してください。
ターゲットアカウントで、次の手順を実行します。
- DynamoDB が配置された AWS リージョンのターゲットアカウントに AWS Backup ボールトを作成します。ボールトの作成時には、設定済みの AWS Key Management Service (AWS KMS) キーを使用します。これは、同じ組織のソースアカウントと共有されたキーです。
- ボールトに、ボールトへのバックアップを許可する AWS Identity and Access Management (IAM) ポリシーを追加します。[組織からバックアップボールトへのアクセスを許可] オプションを選択することで、追加できます。こうすることで、同じ組織内の他のアカウントがボールトへのコピーを行うことができます。
ソースアカウントで次のタスクを実行します。
- テーブルデータの移行先リージョンに AWS Backup ボールトを作成します。ボールトの作成時には、設定済みの AWS KMS キーを使用します。これは、組織内の他のアカウントと共有したキーです。
- 組織内の他のアカウントに、ボールトへのコピーを許可する IAM ポリシーをボールトに追加します。[組織からバックアップボールトへのアクセスを許可] オプションを選択することで、追加できます。
- バックアッププランを作成し、ソースアカウント内の DynamoDB テーブルのバックアップをターゲットアカウントに生成します。バックアップボールトには、ソースアカウントで作成したボールトを選択します。
- [別のアカウントのボールトにコピー] オプションを選択します。
- [リソースの割り当て] で [特定のリソースタイプを含める] オプションを選択し、バックアップする必要があるリソースを含めます。
- [特定のリソースタイプを選択] で [DynamoDB] を選択し、すべてのテーブルを選択するか、バックアップする必要があるテーブルのみを選択します。
設定を確認してテーブルを復元するには、次の手順を実行します。
- ターゲットアカウントで、作成したボールトに移動します。リカバリポイントがソースアカウントと同じであることを確認します。
- ターゲットアカウントで DynamoDB テーブルを復元します。
注: このオプションは、同じ AWS Organization に属するアカウントでのみサポートされます。
DynamoDB と Amazon S3 間のエクスポートとインポート
[DynamoDB を Amazon S3 にエクスポート] 機能を使用すると、ポイントインタイムリカバリ期間内の任意の時点で、Amazon DynamoDB テーブルからデータをエクスポートできます。この機能の使用方法の例については、「コードを記述せずに Amazon DynamoDB テーブルデータを Amazon S3 内のデータレイクにエクスポートする」を参照してください。
[DynamoDB を Amazon S3 にエクスポート] 機能を使用するには、次の手順を実行します。
- DynamoDB テーブルデータを移行するには、ターゲットアカウント内の Amazon S3 バケットにテーブルをエクスポートします。
注: DynamoDB には、この S3 バケットに対する s3:ListBucket アクセス許可が必要です。エクスポートされたデータへのアクセスを拒否するアクセス制御リストを、S3 バケットに配置することはできません。 - ターゲットアカウント内の新しいテーブルに、S3 バケットからデータをインポートします。
注: このオプションでは、AWS Data Pipeline、クロスアカウントアクセス許可、IAM ロールを設定し、管理する必要があります。
Amazon EMR
Amazon EMR を使用してデータを S3 バケットにエクスポートするには、次のいずれかの手順を実行します。
- DynamoDBStorageHandler を使用して DynamoDB テーブルに対して Hive または Spark クエリを実行します。詳細については、「DynamoDB からデータをエクスポートする」を参照してください。
- DynamoDB テーブルのインポートまたはエクスポートには、GitHub にあるオープンソースの emr-dynamodb-tool を使用します。
Amazon EMR を使用して DynamoDB テーブルを移行するには、次のステップを実行します。
- ソースアカウントとターゲットアカウントの両方で EMR クラスターを起動します。[ソフトウェア設定] セクションで、Apache Hive を含むオプションを選択します。
注: Amazon EMR クラスターは、プライベートサブネット内で起動することがベストプラクティスです。プライベートサブネットには Amazon S3 VPC エンドポイントおよび、DynamoDB へのルートが必要です。クラスターがインターネットにアクセスする必要がある場合は、パブリックサブネットに配置した NAT ゲートウェイを使用します。詳細については、「プライベートサブネットと NAT 内のサーバーを使用する VPC」を参照してください。 - 両方のアカウントの EMR_EC2_DefaultRole IAM ロールを更新し、宛先アカウントの S3 バケットへの書き込みアクセス許可を付与します。詳細については、「AWS サービスとリソースに対する Amazon EMR のアクセス許可用に IAM サービスロールを設定する」
- ソースアカウントで、SSH を使用してリーダーノードに接続します。
- ソースアカウントで、Hive コマンドを実行して DynamoDB テーブルデータを宛先アカウントの S3 バケットにエクスポートします。
- 宛先アカウントで、Amazon S3 データを新しい DynamoDB テーブルにインポートします。
注: ステージングテーブルを使用して移行中に発生した書き込みをキャプチャする場合は、ステージングテーブルでステップ 3 と 4 を繰り返します。
移行中に発生するすべてのトランザクションをステージングテーブルに保存することで、ダウンタイムを短縮できます。元のテーブルをターゲットアカウントに移行した後、新しいトランザクションをステージングテーブルからターゲットテーブルにプッシュします。
Amazon EMR でテーブルを移行するのに必要な時間は、変動する場合があります。所要時間は、DynamoDB テーブルのプロビジョニングされたスループットのネットワークパフォーマンスや、テーブルに格納されているデータ量に左右されます。
注: このオプションでは、EMR クラスターを作成して管理する必要があります。
AWS Data Pipeline
AWS データパイプラインを使用して、DynamoDB テーブルから Amazon S3 バケット内のファイルにデータをエクスポートします。このオプションでは、Amazon EMR でマネージド Hadoop クラスターを実行することで、DynamoDB と Amazon S3 間の読み取りと書き込みを行います。
注: このオプションでは、AWS Data Pipeline、クロスアカウントアクセス許可、IAM ロールを設定し、管理する必要があります。
Amazon S3 と AWS Glue
AWS Glue ETL ジョブは、別のアカウントの DynamoDB テーブルからのデータの読み取りと、別のアカウントの DynamoDB テーブルへのデータの書き込みをサポートしています。ジョブスクリプトでクロスアカウントロールを引き受けるには、dynamodb.sts.roleArn パラメータを使用します。ロールを引き受けると、DynamoDB へのクロスアカウントアクセスに使用する必要がある一時的な認証情報が得られます。詳細については、「DynamoDB テーブルへのクロスアカウントおよびクロスリージョンアクセス」と「AWS Step Functions と AWS Glue を使用して Amazon DynamoDB テーブルを Amazon S3 にエクスポートする方法」を参照してください。
注: このオプションでは、Spark を多用し、AWS Glue ETL ジョブ用のソースコードを管理する必要があります。詳細については、「DynamoDB 接続」を参照してください。
カスタムのエクスポート/インポート用スクリプト
2 GB 程度の小さいデータセットや 1 回限りの転送には、手動のエクスポートおよびインポートプロセスを使用できます。たとえば、DynamoDB の Scan 操作を使用する C# コードを使用してソーステーブルから項目を読み取ることができます。その後、コードは BatchWriteItem APIコールを使用してターゲットアカウント内の宛先テーブルにデータを書き込みます。
注: このプロセスは、大規模なデータセットでは時間がかかる場合があり、カスタムスクリプトを使用する必要があります。スクリプトを実行する IAM エンティティには、クロスアカウント S3 アクセスを設定する必要があります。
関連情報
ある AWS アカウントから別の AWS アカウントに Amazon DynamoDB テーブルを移行する方法を教えてください

