Athena による Amazon DynamoDB テーブルへのアクセス、クエリ、結合 - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Athena による Amazon DynamoDB テーブルへのアクセス、クエリ、結合

作成者: Moinul Al-Mamun (AWS)

環境:本稼働

テクノロジー: 分析、データベース、サーバーレス

AWS サービス: Amazon AthenaAmazon DynamoDBAWSLambda、Amazon S3

[概要]

このパターンは、Amazon Athena DynamoDB コネクタを使用して Amazon Athena と Amazon DynamoDB 間の接続をセットアップする方法を示しています。コネクタは AWS Lambda 関数を使用して DynamoDB 内のデータをクエリします。接続を設定するコードはありません。接続が確立されたら、Athena フェデレーティッドクエリを使用して Athena からSQLコマンドを実行することで、DynamoDB テーブルにすばやくアクセスして分析できます。また、1 つ以上の DynamoDB テーブルを相互に結合したり、Amazon Redshift や Amazon Aurora などの他のデータソースに結合したりすることもできます。

前提条件と制限

前提条件

  • DynamoDB テーブル、Athena データソース、Lambda、および AWS Identity and Access Management (IAM) ロールを管理するアクセス許可を持つアクティブなAWSアカウント

  • Athena がクエリ結果を保存できる Amazon Simple Storage Service (Amazon S3) バケット

  • Athena DynamoDB コネクタがデータを短期的に保存できる S3 バケット

  • Athena エンジンバージョン 2 をサポートするAWSリージョン

  • IAM Athena および必要な S3 バケットにアクセスする許可

  • Amazon Athena DynamoDB コネクタ」、インストール済み

制約事項

DynamoDB テーブルのクエリにはコストがかかります。数ギガバイト (GBs) を超えるテーブルサイズでは、高いコストが発生する可能性があります。完全なテーブルSCANオペレーションを実行する前に、コストを考慮することをお勧めします。詳細については、「Amazon DynamoDB 料金」を参照してください。コストを削減し、高いパフォーマンスを実現するには、クエリLIMITで常に を使用することをお勧めします (例: SELECT * FROM table1 LIMIT 10)。また、本番環境で JOINまたは GROUP BY クエリを実行する前に、テーブルのサイズを考慮してください。テーブルが大きすぎる場合は、「テーブルを Amazon S3 に移行する」などの代替オプションを検討してください。

アーキテクチャ

次の図は、ユーザーが Athena から DynamoDB テーブルでSQLクエリを実行する方法を示しています。

Athena と DynamoDB を接続してSQLクエリを実行するワークフロー。

この図表は、次のワークフローを示しています:

  1. DynamoDB テーブルをクエリするには、ユーザーは Athena からSQLクエリを実行します。

  2. Athena は Lambda 関数を開始します。

  3. Lambda 関数は、DynamoDB テーブル内のリクエストされたデータをクエリを行います。

  4. DynamoDB はリクエストされたデータを Lambda 関数に返します。次に、この関数は Athena を介してクエリ結果をユーザーに転送します。

  5. Lambda 関数は S3 バケットにデータを保存します。

テクノロジースタック

  • Amazon Athena

  • Amazon DynamoDB

  • Amazon S3

  • AWS Lambda

ツール

  • Amazon Athena は、標準の を使用して Amazon S3 でデータを直接分析するのに役立つインタラクティブなクエリサービスですSQL。

  • Amazon Athena DynamoDB Connector は、Athena が DynamoDB に接続し、SQLクエリを使用してテーブルにアクセスできるようにするAWSツールです。

  • Amazon DynamoDB は、高速で予測可能でスケーラブルなパフォーマンスを提供するフルマネージドの NoSQL データベースサービスです。

  • AWS Lambda は、サーバーのプロビジョニングや管理を必要とせずにコードを実行するのに役立つコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

エピック

タスク説明必要なスキル

1 つ目のサンプルテーブルを作成します。

  1. AWS マネジメントコンソールにサインインし、DynamoDB コンソール を開きます。

  2. [Create table (テーブルの作成)] を選択します。

  3. [テーブル名] に「dydbtable1」と入力します。

  4. パーティションキー には、 を入力しますPK1

  5. [ソートキー]SK1 と入力します。

  6. [Table settings (テーブルの設定)] セクションで、[Customize settings (設定のカスタマイズ)] を選択します。

  7. 「テーブルクラス」セクションで、[DynamoDB 標準] を選択します。

  8. 「読み取り/書き込みキャパシティ設定」セクションの [キャパシティモード] で [オンデマンド] を選択します。

  9. 「保存時の暗号化」セクションで、[Amazon DynamoDB が所有] を選択します。

  10. [Create table (テーブルの作成)] を選択します。

開発者

最初のテーブルにサンプルデータを挿入します。

  1. DynamoDB コンソールを開きます。

  2. ナビゲーションペインで [テーブル] を選択し、[名前] 列でテーブルを選択します。

  3. [アクション]、[アイテムの作成] の順に選択します。

  4. JSON ビュー を選択します。

  5. 属性エディタのタイトルバーで、DynamoDB の表示 JSONをオフにします

  6. [属性] エディタで、次のサンプルデータを 1 つずつ入力します。

{ "PK1": "1234", "SK1": "info", "Salary": "5000" }
{ "PK1": "1235", "SK1": "info", "Salary": "5200" }
開発者

2 番目のサンプルテーブルを作成します。

  1. DynamoDB コンソールを開きます。

  2. [Create table] を選択します。

  3. [テーブル名] に「dydbtable2」と入力します。

  4. [パーティションキー]PK2 と入力します。

  5. [ソートキー]SK2 と入力します。

  6. [Table settings (テーブルの設定)] セクションで、[Customize settings (設定のカスタマイズ)] を選択します。

  7. 「テーブルクラス」セクションで、[DynamoDB 標準] を選択します。

  8. 「読み取り/書き込みキャパシティ設定」セクションの [キャパシティモード] で [オンデマンド] を選択します。

  9. 「保存時の暗号化」セクションで、[Amazon DynamoDB が所有] を選択します。

  10. [Create table (テーブルの作成)] を選択します。

開発者

2 番目のテーブルにサンプルデータを挿入します。

  1. DynamoDB コンソールを開きます。

  2. ナビゲーションペインで [テーブル] を選択し、[名前] 列でテーブルを選択します。

  3. [アクション]、[アイテムの作成] の順に選択します。

  4. 属性エディタのタイトルバーで、DynamoDB の表示 JSONをオフにします

  5. [属性] エディタで、次のサンプルデータを 1 つずつ入力します。

{ "PK2": "1234", "SK2": "bonus", "Bonus": "500" }
{ "PK2": "1235", "SK2": "bonus", "Bonus": "1000" }
開発者
タスク説明必要なスキル

データソースコネクタを設定します。

DynamoDB のデータソースを作成し、そのデータソースに接続する Lambda 関数を作成します。

  1. AWS マネジメントコンソールにサインインし、Athena コンソール を開きます。

  2. ナビゲーションペインで [データソース] を選択してから、[データソースの作成] を選択します。

  3. [Amazon DynamoDB] データソースを選択し、[次へ] を選択します。

  4. データソースの詳細セクションで、データソース名 testDynamoDB と入力します。

  5. 接続の詳細セクションで、すでにデプロイされている Lambda 関数を選択するか、このパターンに使用する Lambda 関数がない場合は [Lambda 関数を作成] を選択します。注: Lambda 関数の作成の詳細については、Lambda 開発者ガイドの「Lambda の使用開始」を参照してください。

  6. (オプション) Lambda 関数の作成 を選択した場合は、スタックをデプロイする前に、Java アプリケーションに含まれるAWS CloudFormation テンプレートを設定する必要があります。テンプレートには ApplicationName、、 SpillBucket AthenaCatalogName、およびその他のアプリケーション設定が含まれます。注:この Java ベースのアプリケーションをデプロイすると、スタックは Athena が DynamoDB と通信できるようにする Lambda 関数を作成します。これにより、 SQL コマンドを介してテーブルにアクセスできるようになります。

  7. Lambda 関数をデプロイします。

  8. [Next (次へ)] を選択します。

開発者

Lambda 関数が S3 スピルバケットにアクセスできることを確認します。

  1. Lambdaのコンソールを開きます。

  2. ナビゲーションペインで [関数] を選択し、先ほど作成した関数を選択する。

  3. [設定] タブを選択します。

  4. 左側のペインで [環境変数] を選択し、キーの値が spill_bucket であることを確認します。

  5. 左側のペインで アクセス許可 を選択し、実行ロールセクションでアタッチされたIAMロールを選択します。: IAMコンソールの Lambda 関数にアタッチされているIAMロールに移動します。

  6. spill_bucket バケットへの書き込み権限があることを確認します。

エラーが発生した場合は、このパターンの「追加情報」セクションでガイダンスを参照してください。

開発者
タスク説明必要なスキル

DynamoDB テーブルに対してクエリを実行します。

  1. AWS マネジメントコンソールにサインインし、Athena コンソール を開きます。

  2. ナビゲーションペインで [データソース] を選択してから、[データソースの作成] を選択します。

  3. ナビゲーションペイン内で [Query editor (クエリエディタ)] を選択します。

  4. [エディター] タブの「データ」セクションの [データソース] で、お客様のデータソースを選択します。

  5. [Database] (データベース) で、データベースを選択します。

  6. クエリ 1 には、次のクエリを入力します。SELECT * FROM dydbtable1 t1;

  7. [実行] を選択し、テーブル内の出力を確認します。

  8. クエリ 2 には、次のクエリを入力します。SELECT * FROM dydbtable2 t2;

  9. [実行] を選択し、テーブル内の出力を確認します。

開発者

2 つの DynamoDB テーブルを結合します。

DynamoDB は NoSQL データストアであり、SQL結合オペレーションをサポートしていません。そのため、次の 2 つの DynamoDB テーブルで結合操作を実行する必要があります。

  1. 新しいクエリを作成するには、プラスアイコンを選択します。

  2. クエリ 3 には、次のクエリを入力します。

SELECT pk1, salary, bonus FROM dydbtable1 t1 JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;
開発者

関連リソース

追加情報

Athena のクエリで spill_bucket{bucket_name}/folder_name/ という形式で実行すると、次のエラーメッセージが表示されることがあります。

"GENERIC_USER_ERROR: Encountered an exception[java.lang.RuntimeException] from your LambdaFunction[arn:aws:lambda:us-east-1:xxxxxx:function:testdynamodb] executed in context[retrieving meta-data] with message[You do NOT own the spill bucket with the name: s3://amzn-s3-demo-bucket/athena_dynamodb_spill_data/] This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: [query-id]"

このエラーを解決するには、Lambda 関数の環境変数を spill_bucketに更新し{bucket_name_only}、バケット書き込みアクセスの次の Lambda IAMポリシーを更新します。

{ "Action": [ "s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObjectVersion", "s3:PutObject", "s3:PutObjectAcl", "s3:GetLifecycleConfiguration", "s3:PutLifecycleConfiguration", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::spill_bucket", "arn:aws:s3:::spill_bucket/*" ], "Effect": "Allow" }

または、前に作成した Athena データソースコネクタを削除し、spill_bucket のために {bucket_name} のみを使用して再作成することもできます。