

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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 資料表。您也可以將一或多個 DynamoDB 資料表加入彼此或其他資料來源，例如 Amazon Redshift 或 Amazon Aurora。

## 先決條件和限制
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶，具有管理 DynamoDB 資料表、Athena 資料來源、Lambda 和 AWS Identity and Access Management (IAM) 角色的許可
+ Athena 可儲存查詢結果的 Amazon Simple Storage Service (Amazon S3) 儲存貯體
+ Athena DynamoDB 連接器可以短期儲存資料的 S3 儲存貯體
+ 支援 [Athena 引擎第 2 版的 AWS](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html) 區域
+ 存取 Athena 和所需 S3 儲存貯體的 IAM 許可
+ [Amazon Athena DynamoDB 連接器](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)，已安裝

**限制**

查詢 DynamoDB 資料表需要付費。超過幾 GB (GBs資料表大小可能會產生高成本。建議您在執行任何完整資料表 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/)。

## Architecture
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-architecture"></a>

下圖顯示使用者如何從 Athena 在 DynamoDB 資料表上執行 SQL 查詢。

![\[用於連接 Athena 和 DynamoDB 以執行 SQL 查詢的工作流程。\]](http://docs.aws.amazon.com/zh_tw/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) 是一種互動式查詢服務，可協助您使用標準 SQL 直接在 Amazon S3 中分析資料。
+ [Amazon Athena DynamoDB Connector](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb) 是一種 AWS 工具，可讓 Athena 與 DynamoDB 連線，並使用 SQL 查詢存取您的資料表。
+ [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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立第一個範例資料表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/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> | 開發人員 | 
| 建立第二個範例資料表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/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 for DynamoDB 中建立資料來源
<a name="create-a-data-source-in-athena-for-dynamodb"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定資料來源連接器。 | 建立 DynamoDB 的資料來源，然後建立 Lambda 函數以連線至該資料來源。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)如果您遇到錯誤，請參閱此模式中*的其他資訊*一節以取得指引。 | 開發人員 | 

### 從 Athena 存取 DynamoDB 資料表
<a name="access-dynamodb-tables-from-athena"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 查詢 DynamoDB 資料表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 開發人員 | 
| 聯結兩個 DynamoDB 資料表。 | DynamoDB 是 NoSQL 資料存放區，不支援 SQL 聯結操作。因此，您必須在兩個 DynamoDB 資料表上執行聯結操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 中使用 `{bucket_name}/folder_name/` 格式`spill_bucket`的 執行查詢，則您可能會收到下列錯誤訊息：

```
"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 資料來源連接器，並僅使用 `{bucket_name}`重新建立`spill_bucket`。