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

授予 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 的区域可用。有关支持 Athena 引擎版本 2 的 Amazon 区域列表,请参阅 Athena 引擎版本 2。要将工作组升级到引擎版本 2,请参阅 更改 Athena 引擎版本

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

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

开始使用

在下面的情况下,“Borrower”(借入者)账户(666666666666)想要运行 SELECT 查询,该查询引用的 Amazon Glue 目录属于“Owner”(拥有者)账户(999999999999),如下例所示:

SELECT * FROM ownerCatalog.tpch1000.customer

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

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

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

从拥有者账户向借入者账户授予 Amazon Glue 访问权限

  1. 使用 Owner 账户从 https://console.aws.amazon.com/glue/ 登录到 Amazon Glue 控制台。

  2. 在导航窗格中,选择 Settings (设置)

  3. Permissions(权限)框中,输入类似如下的策略。如果要增加权限范围,您可以将通配符 * 用于数据库和表资源类型。

    { "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" ] } ] }

步骤 1b:创建借入者角色或用户策略,授予可访问拥有者 Amazon Glue 资源的权限

若要授予 Borrower 账户角色或用户访问 Owner 账户 Amazon Glue 资源的权限,您可以使用 Amazon Identity and Access Management(IAM)控制台或 IAM API。以下过程使用了 IAM 控制台。

要授予借入者角色或用户对拥有者账户 Amazon Glue 资源的访问权限

  1. 使用 Borrower 账户从 https://console.aws.amazon.com/iam/ 登录 IAM 控制台。

  2. 在导航窗格中,选择 Roles(角色)或 Users(用户)。

  3. 选择要更改的角色或用户。

  4. 请执行下列操作之一:

    • 如果要更改角色,请选择 Attach policies(附加策略)。

    • 如果您要更改用户,请选择 Add permissions(添加权限),然后选择 Attach existing policies directly(直接附加现有策略)。

  5. 选择 Create policy(创建策略)

  6. 选择 JSON

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

    { "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" ] } ] }
  8. 选择Review policy(查看策略)

  9. 名称中,为策略输入名称。

  10. 选择 Create policy(创建策略)。

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

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

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

注册属于其他账户的 Amazon Glue Data Catalog

  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

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

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

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

  5. Choose a data source(选择数据来源)页面上,对于Data sources(数据来源),选择 S3 - Amazon Glue Data Catalog,然后选择 Next(下一步)。

  6. Enter data source details(输入数据来源详细信息)页面的 Amazon Glue Data Catalog 部分,对于 Choose an Amazon Glue Data Catalog(选择一个 Amazon Glue Data Catalog),选择 Amazon Glue Data Catalog in another account(其他账户中的 Amazon Glue Data Catalog)。

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

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

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

    • Catalog ID(目录编号)– 输入数据目录所属账户的 12 位亚马逊云科技账户 ID。亚马逊云科技账户 ID 即是目录 ID。

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

  9. 选择 Next (下一步)

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

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

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

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

步骤 3:借入者提交查询

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

SELECT * FROM ownerCatalog.tpch1000.customer

Borrower 如不使用完全限定的语法,则也可以通过 QueryExecutionContext 将目录传入以指定上下文中的目录。

其他 Amazon S3 权限

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

  • 某些跨账户 DDL 操作,如 MSCK REPAIR TABLE 需要 Amazon S3 权限。例如,如果 Borrower 账户正在根据在 Owner 账户 S3 存储桶中拥有其数据的 Owner 账户中的表执行跨账户 MSCK REPAIR 操作,则该存储桶必须向 Borrower 授予权限才能成功查询。

有关授予存储桶权限的信息,请参阅《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