

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

# Athena による Amazon DynamoDB テーブルへのアクセス、クエリ、結合
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena"></a>

*Moinul Al-Mamun、Amazon Web Services*

## 概要
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-summary"></a>

このパターンは、Amazon Athena DynamoDB コネクタを使用して Amazon Athena と Amazon DynamoDB 間の接続をセットアップする方法を示しています。コネクタは AWS Lambda 関数を使用して DynamoDB 内のデータをクエリします。接続を設定するコードはありません。接続が確立されたら、「[Athena フェデレーテッドクエリ](https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html)」を使用して Athena から SQL コマンドを実行することで、DynamoDB テーブルにすばやくアクセスして分析できます。また、1 つ以上の DynamoDB テーブルを相互に結合したり、Amazon Redshift や Amazon Aurora などの他のデータソースに結合したりすることもできます。

## 前提条件と制限事項
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-prereqs"></a>

**前提条件**
+ DynamoDB テーブル、Athena データソース、Lambda、AWS Identity and Access Management (IAM) ロールを管理するアクセス許可があるアクティブな AWS アカウント
+ Athena がクエリ結果を保存できる Amazon Simple Storage Service (Amazon S3) バケット
+ Athena DynamoDB コネクタがデータを短期的に保存できる S3 バケット
+ 「[Athena エンジンバージョン 2](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html)」をサポートする AWS リージョン
+ Athena と必要な S3 バケットにアクセスするための IAM 権限
+ 「[Amazon Athena DynamoDB コネクタ](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)」、インストール済み

**制限事項**

DynamoDB テーブルのクエリにはコストがかかります。テーブルサイズが数ギガバイト (GB) を超えると、高いコストが発生する可能性があります。テーブル全体の SCAN 操作を実行する前に、コストを考慮することをお勧めします。詳細については、「[Amazon DynamoDB 料金](https://aws.amazon.com/dynamodb/pricing/)」を参照してください。コストを削減して高いパフォーマンスを実現するには、クエリでは常に LIMIT を使用することをお勧めします (例: `SELECT * FROM table1 LIMIT 10`)。また、運用環境で JOIN または GROUP BY クエリを実行する前に、テーブルのサイズを検討してください。テーブルが大きすぎる場合は、「[テーブルを Amazon S3 に移行する](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/)」などの代替オプションを検討してください。

## アーキテクチャ
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-architecture"></a>

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

![\[Athena と DynamoDB を接続して SQL クエリを実行するためのワークフロー。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/e6ff94af-d208-40c7-94e4-af257755a603/images/bc8e0132-b578-463b-bf55-3c39ce359c17.png)


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

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

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

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

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

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

テクノロジースタック
+ Amazon Athena
+ Amazon DynamoDB
+ Amazon S3
+ AWS Lambda

## ツール
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-tools"></a>
+ 「[Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)」はインタラクティブなクエリサービスで、Amazon S3 内のデータをスタンダード SQL を使用して直接分析できます。
+ 「[Amazon Athena DynamoDB コネクタ](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)」は、Athena テナが DynamoDB に接続し、SQL クエリを使用してテーブルにアクセスできるようにする AWS ツールです。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

## エピック
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-epics"></a>

### サンプル DynamoDB テーブルを作成する
<a name="create-sample-dynamodb-tables"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 1 つ目のサンプルテーブルを作成します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 開発者 | 
| 最初のテーブルにサンプルデータを挿入します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)<pre>{<br />  "PK1": "1234",<br />  "SK1": "info",<br />  "Salary": "5000"<br /> }</pre><pre>{<br />  "PK1": "1235",<br />  "SK1": "info",<br />  "Salary": "5200"<br /> }</pre> | 開発者 | 
| 2 番目のサンプルテーブルを作成します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 開発者 | 
| 2 番目のテーブルにサンプルデータを挿入します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)<pre>{<br />  "PK2": "1234",<br /> "SK2": "bonus",<br /> "Bonus": "500"<br />}</pre><pre>{<br />  "PK2": "1235",<br /> "SK2": "bonus",<br /> "Bonus": "1000"<br />}</pre> | 開発者 | 

### Athena で DynamoDB 用のデータソースを作成する
<a name="create-a-data-source-in-athena-for-dynamodb"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| データソースコネクタを設定します。 | DynamoDB のデータソースを作成し、そのデータソースに接続する Lambda 関数を作成します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 開発者 | 
| Lambda 関数が S3 スピルバケットにアクセスできることを確認します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)エラーが発生した場合は、このパターンの *[追加情報]* セクションでガイダンスを参照してください。 | 開発者 | 

### Athena から DynamoDB テーブルにアクセスする
<a name="access-dynamodb-tables-from-athena"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| DynamoDB テーブルに対してクエリを実行します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 開発者 | 
| 2 つの DynamoDB テーブルを結合します。 | DynamoDB は NoSQL データストアであり、SQL 結合オペレーションをサポートしていません。そのため、次の 2 つの DynamoDB テーブルで結合操作を実行する必要があります。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)<pre>SELECT pk1, salary, bonus FROM dydbtable1 t1<br /> JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;</pre> | 開発者 | 

## 関連リソース
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-resources"></a>
+ 「[Amazon Athena DynamoDB コネクタ](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)」(AWS ラボ)
+ 「[Amazon Athena の新しいフェデレーテッドクエリ](https://aws.amazon.com/blogs/big-data/query-any-data-source-with-amazon-athenas-new-federated-query/)」(AWS ビッグデータブログ) であらゆるデータソースをクエリできます
+ 「[Athena エンジンバージョンリファレンス](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html)」(Athena ユーザーガイド)
+ 「[AWS Glue と Amazon Athena を使用して Amazon DynamoDB データの抽出と分析を簡素化](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/)」(AWS データベースブログ)

## 追加情報
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-additional"></a>

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}` のみを使用して再作成することもできます。