Amazon Web Services ブログ

Amazon DynamoDB への CSV 一括取り込みの実装

この記事は、Amazon DynamoDB へのデータの取り込みに今日どのようなソリューションが存在するかを再検討するとともに、Amazon S3 バケットから DynamoDB テーブルへの CSV ファイルの一括取り込みのための能率化されたソリューションについて説明して、AWS アカウントへの簡単なデプロイメントのために、このソリューションの AWS CloudFormation テンプレートを提供します。

Amazon DynamoDB は、規模を問わず 1 桁台のミリ秒でのパフォーマンスを実現する key-value /ドキュメントデータベースです。今日、AWS の何十万人ものお客様が、モバイル、ウェブ、ゲーミング、アドテクノロジー、IoT、および低レイテンシーのデータアクセスを必要とするその他アプリケーションのために DynamoDB の使用を選択しておられます。一般的なユースケースは、DynamoDB へのデータの一括取り込みの実装です。大抵の場合、このデータは CSV 形式であり、すでに Amazon S3 内に保存されている場合があります。この一括取り込みは移行取り組みを迅速化するための鍵であり、取り込みのパイプラインジョブを設定する必要性を軽減し、全体的なコストを削減して、Amazon S3 からのデータの取り込みをシンプル化します。

この記事では、DynamoDB に加えて、ソリューションを作成するために AWS の以下のサービスを 200~300 レベルで使用します。

前提条件

この記事のソリューションを完成させるには、以下が必要です。

  • AWS アカウント
  • DynamoDB、Amazon S3、Lambda、および AWS CloudFormation にアクセスできる IAM ユーザー。

DynamoDB へのデータ挿入のための現在のソリューション

Amazon DynamoDB へのデータの取り込みにはオプションがいくつかあります。以下の AWS のサービスはソリューションを提供しますが、大量のデータを挿入するときにサービスそれぞれで問題が生じます。

  • AWS マネジメントコンソールAWS マネジメントコンソールを使って DynamoDB テーブルに手動でデータを挿入できます。[項目] で [項目の作成] を選択します。それぞれのキー/値ペアは手動で入力する必要があります。これは、一括取り込みを行うには時間のかかるプロセスです。このため、コンソール経由でのデータの取り込みは実行可能なオプションではありません。
  • AWS CLI – もうひとつのオプションは AWS CLI を使用して DynamoDB テーブルにデータをロードすることです。しかし、このプロセスではデータが JSON 形式である必要があります。JSON データはキー/値ペアになっていることから非リレーショナルデータには最適ですが、CSV ファイルはデータ交換に使用されることがより一般的です。このため、CSV 形式のデータを一括で受け取る場合、DynamoDB への挿入に AWS CLI を簡単に使うことはできません。
  • AWS Data PipelineAWS Data Pipeline を使って Amazon S3 から DynamoDB にデータをインポートすることができます。しかし、このソリューションでは、DynamoDB と Amazon S3 間でのデータの読み込みと書き込みのために、Amazon S3、AWS Data Pipeline、および Amazon EMR を設定する前提条件ステップがいくつか必要になります。さらに、このソリューションではこれら 3 つの基盤となる AWS サービスを使用する追加コストが発生することから、高額になり得ます。

Amazon S3 から DynamoDB への CSV 一括取り込み

DynamoDB への CSV ファイルの一括取り込みに、より効率的かつ能率的なソリューションをお使いいただけるようになりました。手順に従って、このソリューションの CloudFormation テンプレートを GitHub リポジトリからダウンロードしてください。このテンプレートは、次のリソースをデプロイします。

  • ファイルのアップロード時における S3 イベントトリガーで設定されたプライベート S3 バケット
  • 読み込み/書き込みキャパシティーモードがオンデマンドになっている DynamoDB テーブル
  • タイムアウトが 15 分に設定されている Lambda 関数 (これには CSV データを DynamoDB にインポートするコードが含まれています)
  • このソリューションに必要な、関連付けられた IAM ロール (最小権限の原則に従って設定されているもの) すべて

データを取り込むには、次の手順を実行します。

  1. AWS CloudFormation コンソールで、[スタックの作成] を選択します。
  2. [新しいリソースを使用 (標準)] を選択します。
  3. テンプレートの指定セクションで、[テンプレートソース] に [テンプレートファイルのアップロード] を選択します。
  4. [ファイルの選択] を選択します。
  5. 以前ダウンロードした CloudFormation テンプレートファイルを選択します。
  6. [次へ] を選択します。
  7. スタックの詳細を指定画面で、[スタックの名前] にスタックの名前を入力します。
  8. [パラメータ] には以下のリソースのパラメータ名を入力します。
    • BucketName – CSV ファイルをアップロードする S3 バケットの名前。
      バケット名は小文字で一意の値にする必要があります。そうしなければ、スタックの作成が失敗します。
    • DynamoDBTableName – データのインポート先となる DynamoDB テーブルの名前。
    • FileName – DynamoDB テーブルへの挿入のために S3 バケットにアップロードする、.csv で終わる CSV ファイル名。
  9. [次へ] を選択します。
  10. 再度 [次へ] を選択します。
  11. [AWS CloudFormation によって IAM リソースが作成される場合があることを承認します] を選択します。
  12. [スタックの作成] を選択します。
  13. スタックが完成したら、新しく作成された S3 バケットに移動して、CSV ファイルをアップロードします。
    このアップロードは、DynamoDB へのデータのインポートをトリガーしますが、CSV ファイルが以下の要件に従っていることを確認する必要があります。
  • パーティションキーが CSV ファイルの最初の列に位置するように入力データを構築する。CSV ファイルの最初の列に uuid という名前が付いていることを確認してください。ベストプラクティスに従ったパーティションキーの選択に関する詳細については、Choosing the Right DynamoDB Partition Key を参照してください。
  • CSV ファイル名が以前入力した正確なファイル名 (.csv サフィックスで終わるもの) に一致することを確認する。
    100,000 行のファイルでの実行には、約 80 秒かかります。この Lambda 関数のタイムアウトは約 100 万行のデータに対応できますが、CSV ファイルはより小規模なチャンクに分割する必要があります。さらに、このソリューションは DynamoDB テーブルにインポートされるデータの順序を保証しません。実行が失敗する場合は、環境変数を前述どおりに正しく作成して設定したことを確認してください。また、Lambda 関数コンソールでエラーハンドリングメッセージをチェックすることもできます。
  1. DynamoDB コンソールで [テーブル] を選択します。
  2. CloudFormation テンプレートで DynamoDBTableName に入力したテーブルを選択します。
    これで、インポートされたデータと関連付けられたテーブルの詳細を表示できるようになります。

まとめ

この記事では、Amazon DynamoDB に大量のデータを取り込む一般的なユースケースについて説明し、この記事を書いている時点で利用できる取り込みオプションを再検討しました。また、Python で記述された Lambda 関数を使用する、DynamoDB への CSV データの一括取り込みのための能率的でコスト効率性に優れたソリューションも提供しました。

このソリューションを構築して使用するには、GitHub リポジトリから CloudFormation テンプレートをダウンロードします。この CloudFormation スタックは、Lambda 関数、S3 バケット、DynamoDB テーブル、および数個の IAM ロールを含めたリソースを起動します。テンプレートの起動、およびこのソリューションの使用の一環としてこれらのサービスを使用するには、料金が発生することに留意してください。これらのコストは、入力ファイルのサイズが大きくなるにつれて増加します。コストを削減するには、DynamoDB テーブルにオンデマンド (データインポートの高速化のためにこのポストで使用したもの) ではなく、プロビジョンド書込キャパシティーを選択することを検討してください。

これで、より効率的でコスト効率性に優れた単純な方法で DynamoDB に大規模なデータセットを簡単に取り込むことができるようになりました。ご不明な点がございましたら、コメントをお寄せください。

 


著者について

 

Julia Soscia は、ニューヨーク市を拠点とするアマゾン ウェブ サービスのソリューションアーキテクトで、お客様が AWS クラウドプラットフォーム上で Well-Architected 環境を作成できるようにすることに力を入れています。Julia は経験豊富なデータアナリストで、分析と機械学習に重点を置いています。

 

 

 

Anthony Pasquariello は、ニューヨーク市を拠点とするアマゾン ウェブ サービスのソリューションアーキテクトで、クラウドジャーニーを進めるお客様へのテクニカルコンサルティング (特にセキュリティのベストプラクティスについて) の提供に焦点を当てています。Anthony は、ボストン大学で電気・電子工学修士号を取得しています。テクノロジー以外の楽しみは、執筆、自然、そして哲学について読むことです。

 

 

Nir Ozeri は、アマゾン ウェブ サービスのソリューションアーキテクトです。