

# 授予跨账户访问权限
<a name="cross-account-access"></a>

授予跨账户的数据目录资源访问权限，支持您提取、转换和加载（ETL）任务，以便从不同账户查询和联接数据。

**Topics**
+ [用于在 AWS Glue 中授予跨账户访问权限的方法](#cross-account-how-works)
+ [添加或更新数据目录资源策略](#cross-account-adding-resource-policy)
+ [执行跨账户 API 调用](#cross-account-calling)
+ [执行跨账户 ETL 调用](#cross-account-calling-etl)
+ [跨账户 CloudTrail 日志记录](#cross-account-ct-logs)
+ [跨账户资源所有权和账单](#cross-account-ownership-and-billing)
+ [跨账户访问限制](#cross-account-limitations)

## 用于在 AWS Glue 中授予跨账户访问权限的方法
<a name="cross-account-how-works"></a>

您可以使用 AWS Glue 方法或 AWS Lake Formation 跨账户授权，为外部 AWS 账户授予数据访问权限。AWS Glue 方法使用 AWS Identity and Access Management（IAM）policy，实现精细访问控制。Lake Formation 使用更简单的 `GRANT/REVOKE` 权限模型，类似于关系数据库系统中的 `GRANT/REVOKE` 命令。

本部分介绍如何使用 AWS Glue 方法。有关使用 Lake Formation 跨账户授权的信息，请参阅《AWS Lake Formation 开发人员指南》**中的[授予 Lake Formation 权限](https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html)。

有两种 AWS Glue 方法可用于授予跨账户资源访问权限：
+ 使用数据目录资源策略
+ 使用 IAM 角色

**使用资源策略授予跨账户访问权限**  
以下是使用数据目录资源策略授予跨账户访问权限的一般步骤：

1. 账户 A 中的管理员（或其他授权身份）将资源策略附加到账户 A 中的数据目录。此策略将向账户 B 授予对账户 A 的目录中的资源执行操作的具体跨账户权限。

1. 账户 B 中的管理员将一个 IAM policy 附加到账户 B 中的 IAM 身份，用于委托从账户 A 收到的权限。

   现在，账户 B 中的身份有权访问账户 A 中的指定资源。

   用户需要*同时*具有资源拥有者（账户 A）*及*其父账户（账户 B）授予的权限，才能访问资源。

**使用 IAM 角色授予跨账户访问权限**  
以下是使用 IAM 角色授予跨账户访问权限的一般步骤：

1. 账户中拥有资源（账户 A）的管理员（或其他授权身份）可创建一个 IAM 角色。

1. 账户 A 中的管理员会向该角色中附加一个策略，以授予用于访问所涉及资源的跨账户访问权限。

1. 账户 A 中的管理员将向该角色中附加一个信任策略，用于将其他账户（账户 B）中的 IAM 身份标识为可以担任该角色的委托人。

   如果您需要向 AWS 服务授予担任该角色的权限，则信任策略中的委托人也可以是 AWS 服务委托人。

1. 现在，账户 B 中的管理员向账户 B 中的一个或多个 IAM 身份委托权限，使其可以担任该角色。这样，账户 B 中的身份便可访问账户 A 中的资源。

有关使用 IAM 委派权限的更多信息，请参阅 *IAM 用户指南*中的[访问权限管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html)。有关用户、组、角色和权限的更多信息，请参阅 *IAM 用户指南*中的[身份（用户、组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。

有关这两种方法的对比，请参阅 *IAM 用户指南*中的 [IAM 角色与基于资源的策略有何不同](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_compare-resource-policies.html)。AWS Glue 支持这两个选项，但存在限制，即资源策略只能授予对 Data Catalog 资源的访问权限。

例如，要向账户 B 中的 `Dev` 角色授予对账户 A 中的数据库 `db1` 的访问权限，请将以下资源策略附加到账户 A 中的目录。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase"
      ],
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:role/Dev"
        ]
      },
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1"
      ]
    }
  ]
}
```

------

此外，账户 B 还必须将以下 IAM policy 附加至 `Dev` 角色，然后才能实际访问账户 A 中的 `db1`。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1"
      ]
    }
  ]
}
```

------

## 添加或更新数据目录资源策略
<a name="cross-account-adding-resource-policy"></a>

您可以使用控制台、API 或 AWS Command Line Interface（AWS CLI）添加或更新 AWS Glue 数据目录资源策略。

**重要**  
如果您已经使用 AWS Lake Formation 从您的账户授予跨账户权限，则添加或更新数据目录资源策略需要额外步骤。有关更多信息，请参阅 *AWS Lake Formation 开发人员指南*中的 [同时使用 AWS Glue 和 Lake Formation 管理跨账户权限](https://docs.aws.amazon.com/lake-formation/latest/dg/hybrid-cross-account.html)。  
要确定是否存在 Lake Formation 跨账户授权，请使用 `glue:GetResourcePolicies` API 操作或 AWS CLI。如果 `glue:GetResourcePolicies` 返回现有 Data Catalog 策略以外的任何策略，则存在 Lake Formation 授权。有关更多信息，请参阅 *AWS Lake Formation 开发人员指南*中的[使用 GetResourcePolicies API 操作查看所有跨账户授权](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-getresourcepolicies.html)。

**添加或更新数据目录资源策略（控制台）**

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

   作为具有 `glue:PutResourcePolicy` 权限的 AWS Identity and Access Management（IAM）管理用户登录。

1. 在导航窗格中，选择 **Settings (设置)**。

1. 在 **Data catalog settings (数据目录设置)** 页面上的 **Permissions (权限)** 下面，将资源策略粘贴到文本区域。然后选择**保存**。

   如果控制台显示提示，指明策略中的权限不属于使用 Lake Formation 授予的权限，请选择 **Proceed (继续)**。

**添加或更新数据目录资源策略（AWS CLI）**
+ 提交 `aws glue put-resource-policy` 命令。如果 Lake Formation 授权已存在，请确保包含值为 `'TRUE'` 的 `--enable-hybrid` 选项。

  有关使用此命令的示例，请参阅 [AWS Glue 基于资源的策略示例](security_iam_resource-based-policy-examples.md)。

## 执行跨账户 API 调用
<a name="cross-account-calling"></a>

所有 AWS Glue Data Catalog 操作都有一个 `CatalogId` 字段。如果已授予所需的权限来启用跨账户访问，则发起人可以跨账户进行数据目录 API 调用。调用方通过传递 `CatalogId` 中的目标 AWS 账户 ID，以访问目标账户中的资源。

如果没有提供 `CatalogId` 值，AWS Glue 将默认使用调用方自己的账户 ID，但该调用不是跨账户调用。

## 执行跨账户 ETL 调用
<a name="cross-account-calling-etl"></a>

有些 AWS Glue PySpark 和 Scala API 具有目录 ID 字段。如果已授予启用跨账户访问所需的全部权限，ETL 任务可通过在目录 ID 字段中传递目标 AWS 账户 ID 来对 API 操作进行跨账户的 PySpark 和 Scala 调用，以访问目标账户中的数据目录资源。

如果没有提供目录 ID 值，AWS Glue 将默认使用调用方自己的账户 ID，但该调用不是跨账户调用。

对于支持 `catalog_id` 的 PySpark API，请参阅 [GlueContext 类](aws-glue-api-crawler-pyspark-extensions-glue-context.md)。对于支持 `catalogId` 的 Scala API，请参阅 [AWS Glue Scala GlueContext API](glue-etl-scala-apis-glue-gluecontext.md)。

以下示例显示被授权者运行 ETL 任务所需的权限。在此示例中，*grantee-account-id* 是运行作业的客户端的 `catalog-id`，*grantor-account-id* 是资源的拥有者。此示例用于授予对授予者账户中所有目录资源的权限。为限制所授予资源的范围，您可以提供目录、数据库、表和连接的特定 ARN。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetConnection",
        "glue:GetDatabase",
        "glue:GetTable",
        "glue:GetPartition"
      ],
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:root"
        ]
      },
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:*"
      ]
    }
  ]
}
```

------

**注意**  
如果授予者账户中的某个表指向同在该账户中的一个 Amazon S3 位置，则授予者账户中用于运行 ETL 任务的 IAM 角色必须有权列出和获取授予者账户中的对象。

如果账户 A 中的客户端已经获得创建和运行 ETL 作业的权限，则设置用于跨账户访问的 ETL 作业的基本步骤如下：

1. 允许跨账户数据访问（如果已设置 Amazon S3 跨账户访问权限，则可跳过此步骤）。

   1. 更新账户 B 中的 Amazon S3 存储桶策略，以允许来自账户 A 的跨账户访问

   1. 更新账户 A 中的 IAM policy，以允许访问账户 B 中的存储桶。

1. 允许跨账户数据目录访问。

   1. 创建或更新账户 B 中附加到数据目录的资源策略，以允许来自账户 A 的访问。

   1. 更新账户 A 中的 IAM policy，以允许访问账户 B 中的数据目录。

## 跨账户 CloudTrail 日志记录
<a name="cross-account-ct-logs"></a>

当 AWS Glue 提取、转换和加载（ETL）任务访问通过 AWS Lake Formation 跨账户授权分享的数据目录表的底层数据时，存在额外 AWS CloudTrail 日志记录行为。

为了本次讨论，共享表的 AWS 账户是拥有者账户，与该表的共享目标账户是收件人账户。当收件人账户中的 ETL 任务访问拥有者账户中表的数据时，添加到收件人账户日志中的数据访问 CloudTrail 事件将复制到拥有者账户的 CloudTrail 日志。这样，拥有者账户可以跟踪不同收件人账户的数据访问情况。默认情况下，CloudTrail 事件不包括人类可读的委托人标识符（委托人 ARN）。收件人账户中的管理员可以选择在日志中包含委托人 ARN。

有关更多信息，请参阅 *AWS Lake Formation 开发人员指南*中的[跨账户 CloudTrail 日志记录](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html)。

**另请参阅**  
[AWS Glue 中的日志记录和监控](logging-and-monitoring.md)

## 跨账户资源所有权和账单
<a name="cross-account-ownership-and-billing"></a>

当一个 AWS 账户（账户 A）中的用户在其他账户（账户 B）中创建新资源（如数据库）时，该资源的所有者将为账户 B，即创建资源所在的账户。账户 B 中的管理员将自动获得访问这一新资源的完整权限，包括读取、写入和向第三个账户授予访问权限。账户 A 中的用户只有获得账户 B 授予的相应权限后，才能访问他们刚刚创建的资源。

与新资源直接关联的存储成本和其他成本将计入账户 B，即资源所有者。创建资源的用户的请求成本将计入请求者的账户，即账户 A。

 有关 AWS Glue 计费和定价的更多信息，请参阅 [AWS 定价原理](https://d0.awsstatic.com/whitepapers/aws_pricing_overview.pdf)。

## 跨账户访问限制
<a name="cross-account-limitations"></a>

AWS Glue 跨账户访问具有以下限制：
+ 如果您在区域支持 AWS Glue 之前已使用 Amazon Athena 或 Amazon Redshift Spectrum 创建数据库和表，并且资源拥有者账户尚未将 Amazon Athena 数据目录迁移至 AWS Glue，则不允许跨账户访问 AWS Glue。可以使用[GetCatalogImportStatus (get\$1catalog\$1import\$1status)](aws-glue-api-catalog-migration.md#aws-glue-api-catalog-migration-GetCatalogImportStatus)查找当前的迁移状态。有关如何将 Athena 目录迁移到 AWS Glue 的更多信息，请参阅 *Amazon Athena 用户指南*中的[按步骤升级到 AWS Glue Data Catalog](https://docs.aws.amazon.com/athena/latest/ug/glue-upgrade.html)。
+ *仅*数据目录资源（包括数据库、表、用户定义的函数和连接）支持跨账户访问。
+ 从 Athena 跨账户访问数据目录需要将目录注册为 Athena `DataCatalog` 资源。有关说明，请参阅 *Amazon Athena 用户指南*中的[从其他账户注册 AWS Glue Data Catalog](https://docs.aws.amazon.com/athena/latest/ug/data-sources-glue-cross-account.html)。