启用跨账户联合查询 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

启用跨账户联合查询

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

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

注意事项和限制

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

  • 此功能不适用于 Amazon Glue Data Catalog 数据源类型。有关跨账户访问 Amazon Glue Data Catalog 的信息,请参阅 授予 Amazon Glue 数据目录跨账户访问权限

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

  • 不支持跨 Amazon Web Services 区域 使用联合查询。

所需的权限

  • 若要让数据管理员账户 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 函数使用 Amazon KMS 密钥而不是联合开发工具包提供的默认加密来加密溢出存储桶,则账户 A 中的 Amazon 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. }
  • 若要让账户 A 与账户 B 共享其连接器,账户 B 必须创建一个名为 AthenaCrossAccountCreate-account-A-id 的角色,账户 A 通过调用 Amazon Security Token Service AssumeRole API 操作担任该角色。

    应在账户 B 中创建允许以下 CreateDataCatalog 操作的策略,并添加到账户 B 为账户 A 创建的 AthenaCrossAccountCreate-account-A-id 角色中。

    { "Effect": "Allow", "Action": "athena:CreateDataCatalog", "Resource": "arn:aws:athena:*:account-B-id:datacatalog/*" }

与账户 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 数据源的详细信息页面上,选择右上角的 Share(共享)选项。

    
                        选择 Share。
  6. Share Lambda-name with another account(与其他账户共享 Lambda-name)对话框中,输入所需信息。

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

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

  7. 选择 Share。您指定的共享数据连接器在账户 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(数据源)页面上,选择 Connect data source(连接数据源)。

  5. 选择 Custom or shared connector(自定义或共享连接器)。

  6. Lambda function(Lambda 函数)部分中,请确保已选择 Use an existing Lambda function(使用现有 Lambda 函数)选项。

    
                        指定另一个账户的 Lambda ARN。
  7. Choose or enter a Lambda function(选择或输入 Lambda 函数)中,输入账户 A 的 Lambda ARN。

  8. 选择 Connect data source (连接数据源)

问题排查

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