

# 配置 Amazon Glue 数据目录的跨账户存取
<a name="security-iam-cross-account-glue-catalog-access"></a>

您可以使用 Athena 的跨账户 Amazon Glue 目录功能来从您自己的账户以外的账户注册 Amazon Glue 目录。为 Amazon Glue 配置所需 IAM 权限并将目录注册为 Athena [DataCatalog](https://docs.amazonaws.cn/athena/latest/APIReference/API_DataCatalog.html) 资源后，您可以使用 Athena 运行跨账户查询。要了解如何使用 Athena 控制台注册来自其他账户的目录，请参阅 [从其他账户注册数据目录](data-sources-glue-cross-account.md)。

有关 Amazon Glue 中跨账户访问的更多信息，请参阅《Amazon Glue 开发人员指南**》中的[授予跨账户访问权限](https://docs.amazonaws.cn/glue/latest/dg/cross-account-access.html)。

## 开始之前
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

因为此功能使用现有的 Athena `DataCatalog` 资源 API 和功能来启用跨账户访问，我们建议您先阅读以下资源：
+ [连接到数据来源](work-with-data-stores.md) - 包含有关将 Athena 与 Amazon Glue、Hive 或 Lambda 数据目录源搭配使用的主题。
+ [数据目录示例策略](datacatalogs-example-policies.md) - 介绍如何编写控制对数据目录访问权限的策略。
+ [将 Amazon CLI 与 Hive 元存储结合使用](datastores-hive-cli.md)：介绍如何使用带有 Hive 元存储仓的 Amazon CLI，但包含适用于其他数据来源的使用案例。

## 注意事项和限制
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

当前，Athena 跨账户 Amazon Glue 目录访问具有以下限制：
+ 此功能仅在支持 Athena 引擎版本 2 或更高版本的 Amazon Web Services 区域可用。有关 Athena 引擎版本的更多信息，请参阅 [Athena 引擎版本控制](engine-versions.md)。要升级工作组的引擎版本，请参阅 [更改 Athena 引擎版本](engine-versions-changing.md)。
+ 当您在账户中注册另一个账户的 Amazon Glue Data Catalog 时，您可以创建一个区域 `DataCatalog` 资源，该资源将仅链接到该特定区域中的其他账户数据。
+ 当前，包含跨账户 Amazon Glue 目录的 `CREATE VIEW` 语句不受支持。
+ 无法跨账户查询使用 Amazon 托管密钥进行加密的目录。对于希望跨账户查询的目录，请改用客户托管密钥 (`KMS_CMK`)。有关客户托管密钥和 Amazon 托管密钥之间差异的信息，请参阅《Amazon Key Management Service Developer Guide》**中的 [Customer keys and Amazon keys](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#key-mgmt                     )。

## 开始使用
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

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

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

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

### 步骤 1a：创建借入者角色以及可访问拥有者 Amazon Glue 资源的策略
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

要创建借入者账户角色以及可访问拥有者账户 Amazon Glue 资源的策略，可以使用 Amazon Identity and Access Management（IAM）控制台或 [IAM API](https://docs.amazonaws.cn/IAM/latest/APIReference/API_Operations.html)。以下过程使用了 IAM 控制台。

**创建借入者角色以及可访问拥有者账户 Amazon Glue 资源的策略**

1. 通过借入者账户从 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 登录 IAM 控制台。

1. 在导航窗格中，展开**访问管理**，然后选择**策略**。

1. 选择**创建策略**。

1. 对于**策略编辑器**，选择 **JSON**。

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

------
#### [ JSON ]

****  

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

------

1. 选择**下一步**。

1. 在**查看并创建**页面上，输入策略的名称（例如 **CrossGluePolicyForBorrowerRole**）作为**策略名称**。

1. 选择**创建策略**。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 在**选择信任的实体**页面上，选择 **Amazon Web Services 账户**，然后选择**下一步**。

1. 在**添加权限**页面上，在搜索框中输入所创建策略的名称（例如 **CrossGluePolicyForBorrowerRole**）。

1. 选择策略名称旁的复选框，然后选择**下一步**。

1. 在 **Name, review, and create**（命名、检查和创建）页面上，对于 **Role name**（角色名称），输入角色的名称（例如 **CrossGlueBorrowerRole**）。

1. 选择**创建角色**。

### 步骤 1b：创建要向借入者授予 Amazon Glue 访问权限的拥有者策略
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

要从拥有者账户（999999999999）向借入者角色授予 Amazon Glue 访问权限，可以使用 Amazon Glue 控制台或 Amazon Glue [PutResourcePolicy](https://docs.amazonaws.cn/glue/latest/webapi/API_PutResourcePolicy.html) API 操作。以下步骤使用了 Amazon Glue 控制台。

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

1. 通过拥有者账户从 [https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/) 登录 Amazon Glue 控制台。

1. 在导航窗格中，展开**数据目录**，然后选择**目录设置**。

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

------
#### [ JSON ]

****  

   ```
   {
       "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](https://docs.amazonaws.cn/glue/latest/dg/aws-glue-api.html) 进行一些测试跨账户调用，确认权限是否按预期进行配置。

### 第 2 步：借入者注册属于拥有者账户的 Amazon Glue Data Catalog
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

以下过程说明了如何使用 Athena 控制台将拥有者的 Amazon Web Services 账户中的 Amazon Glue Data Catalog 配置为数据来源。要了解如何使用 API 操作而不是通过控制台来注册目录，请参阅 [（可选）使用 API 注册属于拥有者账户的 Athena 数据目录](#security-iam-cross-account-glue-catalog-access-step-2-api)。

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

1. 从 [https://console.aws.amazon.com/athena/](https://console.amazonaws.cn/athena/home) 打开 Athena 控制台。

1. 如果控制台导航窗格不可见，请选择左侧的扩展菜单。  
![\[选择扩展菜单。\]](http://docs.amazonaws.cn/athena/latest/ug/images/nav-pane-expansion.png)

1. 展开**管理**，然后选择**数据来源**。

1. 选择右上角的 **Connect data source**（连接数据来源）。

1. 在**选择数据来源**页面上，对于**数据来源**，选择 **S3 - Amazon Glue Data Catalog**，然后选择**下一步**。

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

1. 对于**数据来源详细信息**，提供以下信息：
   + **数据来源名称**：输入要在 SQL 查询中使用的名称，以引用其他账户中的数据目录。
   + **Description**（描述）–（可选）输入其他账户中数据目录的描述。
   + **Catalog ID**（目录编号）– 输入数据目录所属账户的 12 位 Amazon Web Services 账户 ID。Amazon Web Services 账户 ID 即是目录 ID。

1. （可选）展开**标签**，输入要与数据来源关联的键-值对。有关标签的更多信息，请参阅[标记 Athena 资源](tags.md)。

1. 选择**下一步**。

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

1. 选择**数据来源和目录**。您注册的数据目录在 **Data source name**（数据来源名称）列中列出。

1. 要查看或编辑有关数据目录的信息，请选择该目录，然后选择**Actions**（操作）、**Edit**（编辑）。

1. 要删除新数据目录，请选择该目录，然后选择 **Actions**（操作）、**Delete**（删除）。

### 步骤 3：借入者提交查询
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

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

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

借入者如不使用完全限定的语法，也可以通过 [QueryExecutionContext](https://docs.amazonaws.cn/athena/latest/APIReference/API_QueryExecutionContext.html) 传入目录，从而根据上下文指定目录。

## （可选）配置其他 Amazon S3 权限
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 如果借入者账户使用 Athena 查询将新数据写入拥有者账户中的表，即使该表存在于拥有者的账户中，拥有者也将无法自动获取对 Amazon S3 中此数据的访问权限。这是因为借入者就是 Amazon S3 中信息的对象拥有者，另有配置的情况除外。要授予拥有者对数据的访问权限，请作为附加步骤相应地设置对象的权限。
+ 某些跨账户 DDL 操作，如 [MSCK REPAIR TABLE](msck-repair-table.md) 需要 Amazon S3 权限。例如，如果借入者账户正在根据拥有者账户中的表（该表的数据位于拥有者账户 S3 存储桶中）执行跨账户 `MSCK REPAIR` 操作，则该存储桶必须向借入者所担任的角色授予权限才能成功查询。

有关授予存储桶权限的信息，请参阅《*Amazon Simple Storage Service 用户指南*》中的[如何设置 ACL 存储桶权限？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/set-bucket-permissions.html)。

## （可选）动态使用目录
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

在某些情况下，您可能需要快速对跨账户 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](https://docs.amazonaws.cn/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。在该示例中，Athena 使用此语法动态指向账户 999999999999 的 Amazon Glue 数据目录，如同您已为其单独创建了 `DataCatalog` 对象。

### 使用动态目录的注意事项
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

使用动态目录时，请记住以下几点。
+ 使用动态目录需要您通常用于 Athena Data Catalog API 操作的 IAM 权限。主要区别在于，Data Catalog 资源名称遵循 `glue:*` 命名约定。
+ 目录 ARN 必须属于正在运行查询的同一区域。
+ 在 DML 查询或视图中使用动态目录时，请使用转义双引号 (`\"`)。在 DDL 查询中使用动态目录时，请使用反引号字符 (```)。

## （可选）使用 API 注册属于拥有者账户的 Athena 数据目录
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

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

Athena [DataCatalog](https://docs.amazonaws.cn/athena/latest/APIReference/API_DataCatalog.html) 资源的创建者必须具有运行 Athena [CreateDataCatalog](https://docs.amazonaws.cn/athena/latest/APIReference/API_CreateDataCatalog.html) API 操作的必要权限。根据您的要求，可能需要访问其他 API 操作。有关更多信息，请参阅 [数据目录示例策略](datacatalogs-example-policies.md)。

以下 `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](https://docs.amazonaws.cn/athena/latest/APIReference/API_ListDataCatalogs.html) API 操作时看到 `ownerCatalog`。

## 其他资源
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [从其他账户注册数据目录](data-sources-glue-cross-account.md)
+ *Amazon 规范性指导模式*指南中的[使用 Amazon Athena 配置对共享 Amazon Glue Data Catalog 的跨账户访问权限](https://docs.amazonaws.cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)。
+ *Amazon 大数据博客*中的[使用 Amazon Athena 查询跨账户 Amazon Glue Data Catalog](https://www.amazonaws.cn/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)
+ 在《*Amazon Glue 开发人员指南*》中的[授予跨账户访问权限](https://docs.amazonaws.cn/glue/latest/dg/cross-account-access.html) 