翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 料金SELECT * FROM table1 LIMIT 10
)。また、本番環境で JOINまたは GROUP BY クエリを実行する前に、テーブルのサイズを考慮してください。テーブルが大きすぎる場合は、「テーブルを Amazon S3 に移行する
アーキテクチャ
次の図は、ユーザーが Athena から DynamoDB テーブルでSQLクエリを実行する方法を示しています。
この図表は、次のワークフローを示しています:
DynamoDB テーブルをクエリするには、ユーザーは Athena からSQLクエリを実行します。
Athena は Lambda 関数を開始します。
Lambda 関数は、DynamoDB テーブル内のリクエストされたデータをクエリを行います。
DynamoDB はリクエストされたデータを Lambda 関数に返します。次に、この関数は Athena を介してクエリ結果をユーザーに転送します。
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 つ目のサンプルテーブルを作成します。 |
| 開発者 |
最初のテーブルにサンプルデータを挿入します。 |
| 開発者 |
2 番目のサンプルテーブルを作成します。 |
| 開発者 |
2 番目のテーブルにサンプルデータを挿入します。 |
| 開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
データソースコネクタを設定します。 | DynamoDB のデータソースを作成し、そのデータソースに接続する Lambda 関数を作成します。
| 開発者 |
Lambda 関数が S3 スピルバケットにアクセスできることを確認します。 |
エラーが発生した場合は、このパターンの「追加情報」セクションでガイダンスを参照してください。 | 開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
DynamoDB テーブルに対してクエリを実行します。 |
| 開発者 |
2 つの DynamoDB テーブルを結合します。 | DynamoDB は NoSQL データストアであり、SQL結合オペレーションをサポートしていません。そのため、次の 2 つの DynamoDB テーブルで結合操作を実行する必要があります。
| 開発者 |
関連リソース
Amazon Athena DynamoDB コネクタ
(AWSラボ) Amazon Athena の新しいフェデレーティッドクエリを使用してデータソースをクエリする
(AWSビッグデータブログ) 「Athena エンジンバージョンリファレンス」(Athena ユーザーガイド)
AWS Glue と Amazon Athena を使用して Amazon DynamoDB データ抽出と分析を簡素化する
(AWS データベースブログ)
追加情報
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}
のみを使用して再作成することもできます。