使用亚马逊 Athena 联合查询查询跨账户的亚马逊 DynamoDB 表

Amazon DynamoDB 非常适合需要灵活 NoSQL 数据库、低读写延迟、能够在不更改代码或停机的情况下根据需要向上或向下扩展存储和吞吐量的应用程序。您可以将 DynamoDB 用于包括移动应用程序、游戏、数字广告服务、现场投票、现场活动的观众互动、传感器网络、日志提取、基于 Web 内容的访问控制、Amazon S3 对象的元数据存储、电子商务购物车和 Web 会话管理等用例。

如果您需要允许其他 亚马逊云科技 账户查询您的 DynamoDB 表怎么办?如果其他账户需要将您的 DynamoDB 表上的数据与存储在亚马逊 CloudWatch、Amazon DocumentDB、亚马逊 Redshift、Amazon OpenSearch、MySQL、连接雅典娜数据源 连接器 的 PostgreSQL 和亚马逊 S3 等数据源中的数据结合起来,会怎么样?

Amazon Athena 跨账户联合查询 使您能够对存储在关系、非关系、对象和自定义数据源中的数据运行 SQL 查询,其中数据源及其连接器与查询数据的用户位于不同的 亚马逊云科技 账户中。在其他账户中查询连接器没有新的费用,但是 Athena 的数据扫描、Lambda 使用量和其他服务的标准费率适用。

这篇文章将演示 Aws 账户中的 Athena 使用 Athena 跨账户联合查询访问另一个 亚马逊云科技 账户的 DynamoDB 表。它还解释了 使用 A WS Serverless Appl ication Re pository 部署 亚马逊 Athena DynamoDB 连接器 ,以及为演示版在两个账户之间设置雅典娜跨账户联合。

草率排练

该解决方案包含以下步骤来演示 Athena 跨账户联合查询:

  • 设置 Athena 联邦 -为数据源连接器部署 Lambda 函数并将其连接到数据源。
  • 设置 Athena 跨账户联合 -为 Athena 跨账户联合设置 IAM 权限。
  • 测试 Athena 跨账户联合查询 — 演示一个 亚马逊云科技 账户如何与另一个 亚马逊云科技 账户共享其 DynamoDB 表作为雅典娜数据源。

先决条件

在本演练中,您应该具备以下先决条件:

  • 两个 亚马逊云科技 账户
  • 亚马逊云科技 资源:亚马逊 Simple Storage Service(亚马逊 S3)、亚马逊 Athena、亚马逊 DynamoDB、Aws Lambda

数据源连接器

数据源连接器是一段可以在目标数据源和 Athena 之间转换的代码。雅典娜使用在 亚马逊云科技 Lambda 上运行的数据源连接器来运行联合查询。你可以将连接器视为 Athena 查询引擎的扩展。

连接器使用 Apache Arrow 作为返回查询中请求的数据的格式,这使连接器可以用 C、C++、Java、Python 和 Rust 等语言实现。

雅典娜使用在 亚马逊云科技 Lambda 上运行的数据源连接器来运行联合查询。由于连接器是在 Lambda 中处理的,因此它们可用于访问可从 Lambda 访问的云端或本地的任何数据源的数据

要在您的 Athena 查询中使用连接器,请使用以下方法之一将其部署到您的账户:

  • 亚马逊云科技 Serverless 应用程序存储库
  • 雅典娜和 Lambda 游戏机

本博客使用 亚马逊云科技 无服务器应用程序 存储库来部署 亚马逊 Ath ena Dyn am oDB 连接器。

部署数据源连接器后,该连接器将与您可以在 SQL 查询中指定的目录相关联。您可以使用单个查询组合来自多个目录的 SQL 语句并跨越多个数据源。当针对数据源提交查询时,Athena 会调用相应的连接器来识别表中需要读取的部分、管理并行度并下推过滤谓词。根据用户提交的查询,连接器可以提供或限制对特定数据元素的访问权限。

架构

  • AWS 账户 A 有一张名为 Music 的 DynamoDB 表。
  • 账户 A 有一个 Athena 数据源连接器,可以联合到 DynamoDB 中。
  • 亚马逊云科技 Account-B 的分析师需要查询 DynamoDB 表。
  • 账户 A 使用雅典娜跨账户联合查询与账户 B 共享 Athena 数据源。

下图显示了账户 B 使用亚马逊 Athena 跨账户联合访问账户 A 中的 DynamoDB。

要演示 Athena 跨账户联合,请在账户 A 中创建名 为音乐的 DynamoDB 示例表。 按照 DynamoDB 入门 中的说明创建 音乐表 并加载 样本数据。

成立雅典娜联邦

创建联合查询的准备过程分为两部分:为数据源连接器部署 Lambda 函数,以及将 Lambda 函数连接到数据源。有关更多详细信息,请参阅 启用跨账户联合查询

使用 亚马逊云科技 Serverless 应用程序存储库部署 AthenadynamodbConnector

  1. 以管理员身份登录 亚马逊云科技 账户 A。
  2. 打开 无服务器应用程序存储库
  3. 在导航窗格中,选择 可用应用程序
  4. 选择 “ 显示创建自定义 IAM 角色或资源策略的应用程序” 选项 。
  5. 在搜索框中,键入连接器的名称 A thenadynamodbConn ector。

  6. 选择连接器会在 亚马逊云科技 Lambda 控制台中打开 Lambda 函数的 应用程序详情 页面。
  7. 在详细信息页面的右侧,对于 “ 应用程序设置” ,填写必填信息。
    • 应用程序名称 — 用于部署连接器的 AWS CloudFormation Stack 的名称: AthenadynamodbConnector。
    • A
    • thenaCatalogname — 这是要在 Athena 中创建的目录名称。它也是 Lambda 函数的名称。用小写字母给出:acct1dynamodb 。
    • SpillBucket — 指定您的账户中现有的 S3 存储桶(溢出存储桶 ),以便从任何超过 Lambda 函数响应大小限制的大型响应负载接收数据。
  8. 选择 “ 我确认此应用程序创建自定义 IAM 角色和资源策略” 。要了解更多信息,请选择 “ 信息” 链接。
  9. 应用程序设置 部分的右下角,选择 部署
  10. 无服务器应用程序存储库 将创建一个 亚马逊云科技 CloudFormation 堆栈来部署连接器。
  11. 部署完成后,您将在亚马逊云科技 CloudFormation堆栈的 资源 部分看到 Lambda 函数。记下 Lambda 函数的名称。

将 Athena 连接到数据源

  1. 在账户 A 中进入雅典娜控制台。
  2. 选择数据源。单击 “创建数据源”。
  3. 在选择数据源中,搜索亚马逊 DynamoDB 并将其选中。
  4. 数据源详细信息中 ,给出一个 数据源名称 acc t1dynamodb
  5. 对于 连接详细信息 部分中的 Lambda 函数 ,从下拉列表中选择函数的名称 acct1 dynamodb。
  6. 在 “ 查看并创建 ” 页面上,查看数据源详细信息,然后选择 “ 创建数据源” 。

  7. 你将在数据源中看到数据源 acctdynamodb
  8. 转到 查询编辑器 。从下拉列表中选择 数据源 acct1dynamodb
  9. 您将看到共享数据源中的所有表。
  10. 在 Athena Quer y 编辑器中运行以下 SQL,
    从 “acct1dynamodb 
     
     
    
    ” 中选择歌名、专辑标题、演员(奖项为整数)。”默认”。”音乐” WHERE 艺术家 = 'Acme Band '上限 2
  11. 验证雅典娜联盟是否正常运行。

设置 Athena 跨账户联合

在账户 A 中:为跨账户设置 IAM 权限

  1. 以管理员身份登录账户 A。
  2. 在(Lambda 函数的)S3 泄漏存储桶上,向账户 B 的 IAM 用户分析师授予 getObject ListBucket 权限。

注意 :将账户 b-ID 替换为要与之共享 DynamoDB 表的实际 亚马逊云科技 跨账户 ID。使用账户 A 中的实际 S3 存储桶替换溢出存储桶。

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": ["arn:aws:iam::Account-B-id:user/analyst"]
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
             ],
            "Resource": [
                "arn:aws:s3::: spill-bucket",
                "arn:aws:s3::: spill-bucket/*"
            ]
        }
     ]
 }
  1. 向 Accou nt-B 的 IAM 用户分析师授予 Lambda 函数 acct1dynamodb 上的 I nvoke Funct ion。

注意 :将 Account-a-ID 替换为您有 DynamoDB 表的实际 亚马逊云科技 账户 ID。将账户 B-ID 替换为要与之共享 DynamoDB 表的实际 亚马逊云科技 跨账户 ID。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossAccountInvocationStatement",
      "Effect": "Allow",
      "Principal": {
        "AWS": ["arn:aws:iam::Account-B-id:user/analyst"]
      }, 
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:aws-region:Account-A-id:function:acct1dynamodb"
    }
  ]
}
  1. 前往 Lambda 函数 acct1dynamodb 。 选择 “ 配置和权限”

  1. 转到 基于资源的策略 添加权限

保存上述权限时,可以在 Lambda 函数的 基于资源 的策略 中的策略声明下 看到它们。

在账户 B 中:为跨账户设置 IAM 权限

  1. 以管理员身份登录 亚马逊云科技 账户 B。
  2. 创建 名为 A thenacrossAccountFederated-Account-a-ID 的 IAM 角色 供账户 A 担任。向角色添加以下 内联策略

注意: 将账户 b-ID 替换为要与之共享 DynamoDB 表的实际 亚马逊云科技 跨账户 ID。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "athena:CreateDataCatalog",
            "Resource": "arn:aws:athena:aws-region:Account-B-id:datacatalog/*"
        }
    ]
}
  1. 授予 IAM 用户分析师调用账户 A 的 Lambda 函数 acct1dymanodb 的权限

注意: 将 Account-a-ID 替换为您有 DynamoDB 表的实际 亚马逊云科技 账户 ID。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:aws-region:Account-A-id:function:acct1dynamodb"
        }
    ]
}

与 Account-B 共享 Athena 数据源

权限到位后,您将账户(账户 A)中的数据连接器与其他账户(账户 B)共享。账户 A 保留对连接器的完全控制权和所有权。当账户 A 对连接器进行配置更改时,更新的配置将应用于账户 B 中的共享连接器。

  1. 以管理员身份登录账户 A。
  2. 在 Athena 上,转到 数据源 ,选择要共享的数据源 acct1dynamodb 。转到右 上角的 “共享” 选项。

  1. 账户 ID 中 ,输入账户 b-ID 以与账户 B 共享您的数据源,然后点击共享。

测试 Athena 跨账户联合查询:从 Account-B 访问共享数据源

  1. 以 IAM 用户分析师身份登录账户 B。
  2. 在 Athena 中,转到 数据源 。你会看到数据源 acct1dynamodb。

  1. 转到 查询编辑器 。从下拉列表中选择 数据源 acct1dynamodb

  1. 您将看到共享数据源中的所有表。

  1. 在 Athena 查询编辑器中运行以下 SQL
SELECT songtitle, albumtitle, cast(awards as int) as awards 
FROM "acct1dynamodb"."default"."music" 
WHERE artist = 'Acme Band' 
limit 2;

  1. 雅典娜跨账户联合成功了!这验证了账户 B 中的用户分析师可以看到账户 A 的 DynamoDB 表的数据。

清理

为避免将来产生费用,请删除为此演示预置的以下资源:

  • 亚马逊云科技 Lambda 中使用的 S3 泄漏存储桶
  • 用于数据源连接器的 Lambda 函数
  • 示例 DynamoDB 表

结论

在这篇文章中,我们看到了如何使用 Athena Federated Query 访问跨账户 DynamoDB 表来就地查询数据。 你可以执行单个 SQL 查询,使用雅典娜数据源连接器和亚马逊 S3,在亚马逊 CloudWatch、Amazon DocumentDB、Amazon Redshift、Amazon OpenSearch、MySQL、PostgreSQL、甲骨文、Sql Server、HBase、Redis、BigQuery、Snowflake、Teradata 等数据源中加入这些数据。


作者简介

萨蒂亚·阿迪穆拉 是位于波士顿的亚马逊云科技的高级数据架构师。凭借在数据和分析方面的丰富经验,Satya可以帮助组织大规模地从数据中获得业务见解。