启用跨账户联合查询 - Amazon Athena

启用跨账户联合查询

联合查询允许您使用部署在 AWS Lambda 上的数据源连接器查询 Amazon S3 以外的数据源。跨账户联合查询功能允许 Lambda 函数和要查询的数据源位于不同的账户中。

作为数据管理员,您可以通过与数据分析人员的账户共享数据连接器来启用跨账户联合查询。或者作为数据分析人员,可以通过将数据管理员提供的共享 Lambda ARN 添加到您的账户中来启用跨账户联合查询。对原始账户中的连接器进行配置更改时,更新的配置将自动应用于其他用户账户中该连接器的共享实例。

注意事项和限制

  • 跨账户联合查询功能适用于非 Hive 元数据仓数据连接器,该连接器使用基于 Lambda 的数据源。

  • 此功能不适用于 AWS Glue Data Catalog 数据源类型。有关跨账户访问 AWS Glue Data Catalog 的信息,请参阅 配置 AWS Glue 数据目录的跨账户存取

  • 如果来自连接器的 Lambda 函数的响应超过 6MB 的 Lambda 响应大小限制,Athena 会自动对响应进行加密、批处理并溢出到您配置的 Amazon S3 存储桶。运行 Athena 查询的实体必须有权访问溢出位置,Athena 才能读取溢出的数据。我们建议您设置 Amazon S3 生命周期策略,以从溢出位置删除对象,因为查询完成后不需要数据。

  • 不支持跨 AWS 区域 使用联合查询。

所需的权限

要设置所需的权限,必须同时在账户 A 和账户 B 中执行操作。

账户 A 的操作

若要让数据管理员账户 A 与数据分析人员账户 B 共享 Lambda 函数,账户 B 需要 Lambda 调用函数和溢出存储桶访问权限。因此,账户 A 应该将基于资源的策略添加到 Lambda 函数并添加主体访问 Amazon S3 中其溢出存储桶的权限。

  1. 以下策略向账户 A 中的 Lambda 函数授予账户 B 调用 Lambda 函数的权限。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountInvocationStatement", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::account-B-id:user/username"] }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:aws-region:account-A-id:function:lambda-function-name" } ] }
  2. 以下策略允许溢出存储桶访问账户 B 中的主体。

    { "Version": "2008-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::account-B-id:user/username"] }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::spill-bucket", "arn:aws:s3:::spill-bucket/*" ] } ] }
  3. 如果 Lambda 函数使用 AWS KMS 密钥而不是联合开发工具包提供的默认加密来加密溢出存储桶,则账户 A 中的 AWS KMS 密钥策略必须向账户 B 中的用户授予访问权限,如以下示例所示。

    { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::account-B-id:user/username"] }, "Action": [ "kms:Decrypt" ], "Resource": "*" // Resource policy that gets placed on the KMS key. }

账户 B 的操作

若要让账户 A 与账户 B 共享其连接器,账户 B 必须创建一个名为 AthenaCrossAccountCreate-account-A-id 的角色,账户 A 通过调用 AWS Security Token Service AssumeRole API 操作担任该角色。

  1. 使用 IAM 控制台或 AWS CLI 将 AthenaCrossAccountCreate-account-A-id 角色创建为自定义信任策略角色。自定义信任策略可委托访问权限并允许其他人在您的 AWS 账户中执行操作。有关具体步骤,请参阅 IAM 用户指南中的使用自定义信任策略创建角色

    该信任关系应有一个主体,其中的密钥是是 AWS,而值是账户 A 的 ARN,如下例所示。

    ... "Principal": { "AWS": ["arn:aws:iam::account-A-id:user/username"] }, ...
  2. 同样在账户 B 中,创建允许 CreateDataCatalog 操作的如下策略。

    { "Effect": "Allow", "Action": "athena:CreateDataCatalog", "Resource": "arn:aws:athena:*:account-B-id:datacatalog/*" }
  3. 将允许 CreateDataCatalog 操作的策略添加到您使用账户 B 创建的 AthenaCrossAccountCreate-account-A-id 角色中。

与账户 B 共享账户 A 中的数据源

获得相应权限后,您可以使用 Athena 控制台中的 Data sources(数据源)页面与其他账户(账户 B)共享您账户(账户 A)中的数据连接器。账户 A 保留对连接器的完全控制权和所有权。账户 A 对连接器进行配置更改时,已更新的配置将应用于账户 B 中的共享连接器。

与账户 B 共享账户 A 中的 Lambda 数据源
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 如果控制台导航窗格不可见,请选择左侧的扩展菜单。

    选择扩展菜单。
  3. 选择 Data Source(数据源)。

  4. Data sources(数据源)页面上,选择要共享的连接器的链接。

  5. 在 Lambda 数据来源的详细信息页面上,选择右上角的操作菜单,然后选择共享

  6. 与其他账户共享 Lambda-name 对话框中,输入所需信息。

    • Data source name(数据源名称)中,输入您要在另一个账户中显示的复制数据源名称。

    • Account ID(账户 ID)中,输入要与其共享数据源的账户 ID(在本例中为账户 B)。

  7. 选择共享。您指定的共享数据连接器在账户 B 中创建。账户 A 中连接器的配置更改将应用于账户 B 中的连接器。

将共享数据源从账户 A 添加到账户 B

作为数据分析人员,您可能会从数据管理员那里获得连接器的 ARN 以添加到您的账户中。您可以使用 Athena 控制台的 Data sources(数据源)页面,将管理员提供的 Lambda ARN 添加到您的账户中。

将共享数据连接器的 Lambda ARN 添加到您的账户
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 如果导航窗格不可见,请选择左侧的扩展菜单。

  3. 选择 Data Source(数据源)。

  4. Data sources(数据源)页面上,选择 Create data source(创建数据源)。

  5. 选择数据来源页面上,选择自定义或共享连接器

  6. 选择下一步

  7. 输入数据来源详细信息页面上的连接详细信息部分中,对于选择或输入 Lambda 函数,输入账户 A 的 Lambda ARN。

  8. 选择下一步

  9. 审核和创建页面上,选择创建数据来源

故障排除

如果您收到一条错误消息,指出账户 A 没有在账户 B 中担任角色的权限,请确保正确拼写在账户 B 中创建的角色名称,并且附加了适当的策略。