

# 在 Athena for Spark 中配置跨账户 AWS Glue 存取。
<a name="spark-notebooks-cross-account-glue"></a>

本主题介绍如何将消费者账户 *666666666666* 和所有者账户 *999999999999* 配置为跨账户 AWS Glue 访问。配置账户后，消费者账户可以从 Athena for Spark 对所有者的 AWS Glue 数据库和表运行查询。

## 步骤 1：在 AWS Glue 中，提供对使用者角色的访问权限
<a name="spark-notebooks-cross-account-glue-in-aws-glue-provide-access-to-the-consumer-account"></a>

在 AWS Glue 中，所有者创建了一个策略，为消费者的角色提供对所有者 AWS Glue 数据目录的访问权限。

**添加允许消费者角色访问所有者数据目录的 AWS Glue 策略**

1. 使用目录所有者的账户登录 AWS 管理控制台。

1. 通过 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 打开 AWS Glue 控制台。

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

1. 在**数据目录设置**页面的**权限**部分，添加如下所示的策略。本策略为使用者账户 *666666666666* 提供了访问拥有者账户 *999999999999* 中数据目录的角色。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Cataloguers",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:role/Admin",
                       "arn:aws:iam::666666666666:role/AWSAthenaSparkExecutionRole"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-west-2:999999999999:catalog",
                   "arn:aws:glue:us-west-2:999999999999:database/*",
                   "arn:aws:glue:us-west-2:999999999999:table/*"
               ]
           }
       ]
   }
   ```

------

## 步骤 2：配置使用者账户的访问权限
<a name="spark-notebooks-cross-account-glue-configure-the-consumer-account-for-access"></a>

在消费者账户中，创建允许访问所有者 AWS Glue Data Catalog、数据库和表的策略，并将该策略附加到角色。以下示例使用消费者账户 *666666666666*。

**创建访问所有者 AWS Glue Data Catalog 的 AWS Glue 策略**

1. 使用消费者账户登录 AWS 管理控制台。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

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

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

1. 在**指定权限**页面上，选择 **JSON**。

1. 在**策略编辑器**中，输入如下所示的 JSON 语句，该语句允许对所有者账户的数据目录进行 AWS Glue 操作。

------
#### [ 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/*",
                   "arn:aws:glue:us-east-1:999999999999:table/*"
               ]
           }
       ]
   }
   ```

------

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

1. 在**审核并创建**页面上，对于**策略名称**，输入策略的名称。

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

接下来，您可以在消费者账户中使用 IAM 控制台将您刚刚创建的策略附加到消费者账户将用于访问所有者数据目录的 IAM 一个或多个角色。

**将 AWS Glue 策略附加到消费者账户中的角色**

1. 在消费者账户 IAM 控制台的导航窗格中，选择**角色**。

1. 在**角色**页面上，找到您要将策略附加到的角色。

1. 选择**添加权限**，然后选择**附加策略**。

1. 找到您刚刚创建的策略。

1. 选择策略对应的复选框，然后选择**添加权限**。

1. 重复上述步骤，将策略添加到要使用的其他角色。

## 步骤 3：配置会话并创建查询
<a name="spark-notebooks-cross-account-glue-configure-a-session-and-create-a-query"></a>

在 Athena Spark 中，在请求者账户中，使用指定的角色创建会话，通过[创建笔记本](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook)或[编辑当前会话](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details)来测试访问权限。[配置会话属性](notebooks-spark-custom-jar-cfg.md#notebooks-spark-custom-jar-cfg-console)时，请指定以下选项之一：
+ **AWS Glue 目录分隔符**：使用这种方法，您可以在查询中包含所有者账户 ID。如果您要使用会话查询来自不同所有者的数据目录，请使用此方法。
+ **AWS Glue 目录 ID**：使用这种方法，您可以直接查询数据库。如果您要使用会话仅查询单个所有者的数据目录，则此方法会更方便。

### 使用 AWS Glue 目录分隔符
<a name="spark-notebooks-cross-account-glue-using-the-glue-catalog-separator-approach"></a>

编辑会话属性时，添加以下内容：

```
{ 
    "spark.hadoop.aws.glue.catalog.separator": "/" 
}
```

在单元格中运行查询时，请使用与以下示例类似的语法。请注意，在 `FROM` 子句中，数据库名称前必须有目录 ID 和分隔符。

```
df = spark.sql('SELECT requestip, uri, method, status FROM `999999999999/mydatabase`.cloudfront_logs LIMIT 5') 
df.show()
```

### 使用 AWS Glue 目录 ID
<a name="spark-notebooks-cross-account-glue-using-the-glue-catalog-id-approach"></a>

编辑会话属性时，输入以下属性。将 *999999999999* 替换为所有者账户 ID。

```
{ 
    "spark.hadoop.hive.metastore.glue.catalogid": "999999999999" 
}
```

在单元格中运行查询时，请使用与以下类似的语法。请注意，在 `FROM` 子句中，数据库名称前不能有目录 ID 和分隔符。

```
df = spark.sql('SELECT * FROM mydatabase.cloudfront_logs LIMIT 10') 
df.show()
```

## 其他资源
<a name="spark-notebooks-cross-account-glue-additional-resources"></a>

[配置 AWS Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)

《*AWS Lake Formation 开发人员指南*》中的[同时使用 AWS Glue 和 Lake Formation 管理跨账户权限](https://docs.aws.amazon.com/lake-formation/latest/dg/hybrid-cross-account.html)。

*AWS 规范性指导模式*中的[使用 Amazon Athena 配置对共享 AWS Glue Data Catalog 的跨账户访问权限](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)。