授予 Amazon Glue 数据目录跨账户访问权限 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

授予 Amazon Glue 数据目录跨账户访问权限

您可以使用 Athena 的跨账户 Amazon Glue 目录功能来从您自己的账户以外的账户注册 Amazon Glue 目录。为 Amazon Glue 配置所需 IAM 权限并将目录注册为 Athena DataCatalog 资源后,您可以使用 Athena 运行跨账户查询。要了解如何使用 Athena 控制台注册来自其他账户的目录,请参阅 从另一个账户注册 Amazon Glue Data Catalog

有关 Amazon Glue 中跨账户访问的更多信息,请参阅《Amazon Glue 开发人员指南》中的 授予跨账户访问权限

开始之前

因为此功能使用现有的 Athena DataCatalog 资源 API 和功能来启用跨账户访问,我们建议您先阅读以下资源:

注意事项和限制

当前,Athena 跨账户 Amazon Glue 目录访问具有以下限制:

  • 此功能仅在支持 Athena 引擎版本 2 或更高版本的 Amazon Web Services 区域可用。有关 Athena 引擎版本的更多信息,请参阅 Athena 引擎版本控制。要升级工作组的引擎版本,请参阅 更改 Athena 引擎版本

  • 当您在账户中注册另一个账户的 Amazon Glue Data Catalog 时,您可以创建一个区域 DataCatalog 资源,该资源将仅链接到该特定区域中的其他账户数据。

  • 当前,包含跨账户 Amazon Glue 目录的 CREATE VIEW 语句不受支持。

  • 无法跨账户查询使用 Amazon 托管密钥进行加密的目录。对于希望跨账户查询的目录,请改用客户托管密钥 (KMS_CMK)。有关客户托管密钥和 Amazon 托管密钥之间差异的信息,请参阅《Amazon Key Management Service Developer Guide》中的 Customer keys and Amazon keys

开始使用

在下列应用场景中,“借入者”账户(666666666666)想要运行 SELECT 查询,该查询引用的 Amazon Glue 目录属于“拥有者”账户(999999999999),如下例所示:

SELECT * FROM ownerCatalog.tpch1000.customer

在以下过程中,步骤 1a 和 1b 显示了如何授予借入者账户对拥有者账户 Amazon Glue 资源的访问权限,从借入者和拥有者这两个角度均进行了展示。该示例授予对数据库 tpch1000 和表 customer 的访问权限。更改这些示例名称以满足您的要求。

步骤 1a:创建借入者角色以及可访问拥有者 Amazon Glue 资源的策略

要创建借入者账户角色以及可访问拥有者账户 Amazon Glue 资源的策略,可以使用 Amazon Identity and Access Management(IAM)控制台或 IAM API。以下过程使用了 IAM 控制台。

创建借入者角色以及可访问拥有者账户 Amazon Glue 资源的策略
  1. 通过借入者账户从 https://console.aws.amazon.com/iam/ 登录 IAM 控制台。

  2. 在导航窗格中,展开访问管理,然后选择策略

  3. 选择创建策略

  4. 对于策略编辑器,选择 JSON

  5. 在策略编辑器中,输入以下策略,然后根据您的要求对其进行修改:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:999999999999:catalog", "arn:aws:glue:us-east-1:999999999999:database/tpch1000", "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer" ] } ] }
  6. 选择下一步

  7. 查看并创建页面上,输入策略的名称(例如 CrossGluePolicyForBorrowerRole)作为策略名称

  8. 选择创建策略

  9. 在导航窗格中,选择角色

  10. 选择 Create role(创建角色)。

  11. 选择信任的实体页面上,选择 Amazon Web Services 账户,然后选择下一步

  12. 添加权限页面上,在搜索框中输入所创建策略的名称(例如 CrossGluePolicyForBorrowerRole)。

  13. 选择策略名称旁的复选框,然后选择下一步

  14. Name, review, and create(命名、检查和创建)页面上,对于 Role name(角色名称),输入角色的名称(例如 CrossGlueBorrowerRole)。

  15. 选择 Create role(创建角色)。

步骤 1b:创建要向借入者授予 Amazon Glue 访问权限的拥有者策略

要从拥有者账户(999999999999)向借入者角色授予 Amazon Glue 访问权限,可以使用 Amazon Glue 控制台或 Amazon Glue PutResourcePolicy API 操作。以下步骤使用了 Amazon Glue 控制台。

从拥有者账户向借入者账户授予 Amazon Glue 访问权限
  1. 通过拥有者账户从 https://console.aws.amazon.com/glue/ 登录 Amazon Glue 控制台。

  2. 在导航窗格中,展开数据目录,然后选择目录设置

  3. Permissions(权限)框中,输入类似如下的策略。对于 rolename,输入借入者在步骤 1a 中创建的角色(例如 CrossGlueBorrowerRole)。如果要增加权限范围,您可以将通配符 * 用于数据库和表资源类型。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::666666666666:user/username", "arn:aws:iam::666666666666:role/rolename" ] }, "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:999999999999:catalog", "arn:aws:glue:us-east-1:999999999999:database/tpch1000", "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer" ] } ] }

完成后,建议使用 Amazon Glue API 进行一些测试跨账户调用,确认权限是否按预期进行配置。

第 2 步:借入者注册属于拥有者账户的 Amazon Glue Data Catalog

以下过程说明了如何使用 Athena 控制台将拥有者的 Amazon Web Services 账户中的 Amazon Glue Data Catalog 配置为数据来源。要了解如何使用 API 操作而不是通过控制台来注册目录,请参阅 使用 API 注册属于拥有者账户的 Athena 数据目录

注册属于其他账户的 Amazon Glue Data Catalog
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

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

    选择扩展菜单。
  3. 展开管理,然后选择数据来源

  4. 选择右上角的 Connect data source(连接数据来源)。

  5. 选择数据来源页面上,对于数据来源,选择 S3 - Amazon Glue Data Catalog,然后选择下一步

  6. 输入数据来源详细信息页面的 Amazon Glue Data Catalog 部分中,对于选择 Amazon Glue Data Catalog,选择 Amazon Glue Data Catalog 中的其他账户

  7. 对于 Data source details(数据源详细信息),提供以下信息:

    • Data source name(数据源名称)– 输入要在 SQL 查询中使用的名称,以引用其他账户中的数据目录。

    • Description(描述)–(可选)输入其他账户中数据目录的描述。

    • Catalog ID(目录编号)– 输入数据目录所属账户的 12 位 Amazon Web Services 账户 ID。Amazon Web Services 账户 ID 即是目录 ID。

  8. (可选)展开标签,输入要与数据来源关联的键-值对。有关标签的更多信息,请参阅 为 Athena 资源添加标签

  9. 选择下一步

  10. Review and create(审核和创建)页面中,检查数据来源的详细信息,然后选择 Create data source(创建数据来源)。Data source details(数据来源详细信息)页面列出了所注册数据目录的数据库和标签。

  11. 选择 Data Source(数据源)。您注册的数据目录在 Data source name(数据来源名称)列中列出。

  12. 要查看或编辑有关数据目录的信息,请选择该目录,然后选择Actions(操作)、Edit(编辑)。

  13. 要删除新数据目录,请选择该目录,然后选择 Actions(操作)、Delete(删除)。

步骤 3:借入者提交查询

借入者提交一个查询,该查询使用 catalog.database.table 语法引用目录,如下例所示:

SELECT * FROM ownerCatalog.tpch1000.customer

借入者如不使用完全限定的语法,也可以通过 QueryExecutionContext 传入目录,从而根据上下文指定目录。

其他 Amazon S3 权限

  • 如果借入者账户使用 Athena 查询将新数据写入拥有者账户中的表,即使该表存在于拥有者的账户中,拥有者也将无法自动获取对 Amazon S3 中此数据的访问权限。这是因为借入者就是 Amazon S3 中信息的对象拥有者,另有配置的情况除外。要授予拥有者对数据的访问权限,请作为附加步骤相应地设置对象的权限。

  • 某些跨账户 DDL 操作,如 MSCK REPAIR TABLE 需要 Amazon S3 权限。例如,如果借入者账户正在根据拥有者账户中的表(该表的数据位于拥有者账户 S3 存储桶中)执行跨账户 MSCK REPAIR 操作,则该存储桶必须向借入者所担任的角色授予权限才能成功查询。

有关授予存储桶权限的信息,请参阅《Amazon Simple Storage Service 用户指南》中的如何设置 ACL 存储桶权限?

动态使用目录

在某些情况下,您可能需要快速对跨账户 Amazon Glue 目录执行测试,而无需执行注册它的先决步骤。如果您已按照本文档前述说明正确配置了所需的 IAM 和 Amazon S3 权限,则您可以动态执行跨账户查询,而无需创建 DataCatalog 资源对象。

要在不注册的情况下显式引用目录,请使用以下示例中的语法:

SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer

使用格式“glue:<arn>”,其中 <arn> 是您想要使用的 Amazon Glue Data Catalog ARN。在该示例中,Athena 使用此语法动态指向账户 999999999999 的 Amazon Glue 数据目录,如同您已为其单独创建了 DataCatalog 对象。

使用动态目录的注意事项

使用动态目录时,请记住以下几点。

  • 使用动态目录需要您通常用于 Athena Data Catalog API 操作的 IAM 权限。主要区别在于,Data Catalog 资源名称遵循 glue:* 命名约定。

  • 目录 ARN 必须属于正在运行查询的同一区域。

  • 在 DML 查询或视图中使用动态目录时,请使用转义双引号 (\")。在 DDL 查询中使用动态目录时,请使用反引号字符 (`)。

使用 API 注册属于拥有者账户的 Athena 数据目录

您可以使用 API 操作来注册属于拥有者账户的数据目录,而不是如第 2 步中所述使用 Athena 控制台。

Athena DataCatalog 资源的创建者必须具有运行 Athena CreateDataCatalog API 操作的必要权限。根据您的要求,可能需要访问其他 API 操作。有关更多信息,请参阅 数据目录示例策略

以下 CreateDataCatalog 请求正文为跨账户访问注册了 Amazon Glue 目录:

# Example CreateDataCatalog request to register a cross-account Glue catalog: { "Description": "Cross-account Glue catalog", "Name": "ownerCatalog", "Parameters": {"catalog-id" : "999999999999" # Owner's account ID }, "Type": "GLUE" }

以下示例代码使用 Java 客户端创建 DataCatalog 对象。

# Sample code to create the DataCatalog through Java client CreateDataCatalogRequest request = new CreateDataCatalogRequest() .withName("ownerCatalog") .withType(DataCatalogType.GLUE) .withParameters(ImmutableMap.of("catalog-id", "999999999999")); athenaClient.createDataCatalog(request);

完成这些步骤后,借入者应会在调用 ListDataCatalogs API 操作时看到 ownerCatalog

其他 资源