本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Athena 访问、查询和联接 Amazon DynamoDB 表
由 Moinul Al-Mamun 创作 () AWS
环境:生产 | 技术:分析;数据库;无服务器 | AWS服务:亚马逊 Athena;亚马逊 DynamoDB;Lambda;亚马逊 S3 AWS |
Summary
此模式说明如何使用 Amazon Athena DynamoDB 连接器在 Amazon Athena 和 Amazon DynamoDB 之间建立连接。连接器使用 AWS Lambda 函数查询 DynamoDB 中的数据。您无需编写任何代码即可设置连接。建立连接后,您可以使用 Athena 联合查询来自 Athena 的命令来快速访问和分析 DynamoDB 表。SQL您还可以将一个或多个 DynamoDB 表相互联接,或联接到其他数据来源,例如 Amazon Redshift 或 Amazon Aurora。
先决条件和限制
先决条件
有权管理 DynamoDB 表、Athena 数据源、Lambda 以及身份AWS和访问管理 () 角色的活跃AWS账户 IAM
一个 Amazon Simple Storage Service(Amazon S3)存储桶,Athena 可以在其中存储查询结果
一个 S3 存储桶,Athena DynamoDB 连接器可以在其中保存数据
支持 Athena 引擎版本 2 的AWS区域
IAM访问 Athena 的权限和所需的 S3 存储桶
限制
查询 DynamoDB 表需要付费。表大小超过几千兆字节 (GBs) 可能会产生高昂的成本。我们建议您在执行任何全表SCAN操作之前考虑成本。有关更多信息,请参阅 Amazon DynamoDB 定价SELECT * FROM table1 LIMIT 10
)。另外,在生产环境中执行JOIN或 B GROUP Y 查询之前,请考虑表的大小。如果您的表太大,请考虑其他选项,例如将表迁移到 Amazon S3
架构
下图显示了用户如何在 Athena 的 DynamoDB 表上运行SQL查询。
图表显示了以下工作流:
要查询 DynamoDB 表,用户需要从 Athena 运行SQL查询。
Athena 启动 Lambda 函数。
Lambda 函数查询 DynamoDB 表中请求的数据。
DynamoDB 将请求的数据返回给 Lambda 函数。然后,该函数通过 Athena 将查询结果传输给用户。
Lambda 函数将数据存储在 S3 存储桶中。
技术堆栈
Amazon Athena
Amazon DynamoDB
Amazon S3
AWSLambda
工具
Amazon Athena 是一项交互式查询服务,可帮助您使用标准直接在 Amazon S3 中分析数据。SQL
Amazon Athena DynamoDB
连接器AWS是一款工具,它使 Athena 能够连接 DynamoDB 并使用查询访问您的表。SQL Amazon DynamoDB 是一项完全托管的SQL无数据库服务,可提供快速、可预测和可扩展的性能。
AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
创建第一个示例表。 |
| 开发人员 |
将示例数据插入到第一个表中。 |
| 开发人员 |
创建第二个示例表。 |
| 开发人员 |
将示例数据插入到第二个表中。 |
| 开发人员 |
任务 | 描述 | 所需技能 |
---|---|---|
设置数据来源连接器。 | 为 DynamoDB 创建数据来源,然后创建 Lambda 函数以连接到该数据来源。
| 开发人员 |
验证 Lambda 函数是否可以访问 S3 溢出存储桶。 |
如果遇到错误,请参阅此模式中的其他信息部分以获取指导。 | 开发人员 |
任务 | 描述 | 所需技能 |
---|---|---|
查询 DynamoDB 表。 |
| 开发人员 |
连接两个 DynamoDB 表。 | DynamoDB 是一个SQL无数据存储,不支持SQL联接操作。因此,您必须对两个 DynamoDB 表执行联接操作:
| 开发人员 |
相关资源
其他信息
如果您在 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 函数的环境变量更新为{bucket_name_only}
,然后更新spill_bucket
以下 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}
重新创建它。