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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

授予跨账户访问权限

通过跨账户授予对 数据目录 资源的访问权限,您的提取、转换和加载 (ETL) 作业能够查询和联接不同账户的数据。

在 AWS Glue 中授予跨账户访问权限的方法

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

本节介绍如何使用 AWS Glue 方法。有关使用 Lake Formation 跨账户授权的信息,请参阅 中的授予 Lake Formation 权限。AWS Lake Formation 开发人员指南

可以使用两种方法授予对资源的跨账户访问权限:AWS Glue

  • 使用 数据目录 资源策略

  • 使用 IAM 角色

使用资源策略授予跨账户访问权限

以下是使用 数据目录 资源策略授予跨账户访问权限的常规步骤:

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

  2. 账户 B 中的管理员将一个 IAM 策略附加到账户 B 中的用户或其他 IAM 身份,用于委派从账户 A 收到的权限。

    现在,账户 B 中的用户或其他身份有权访问账户 A 中的指定资源。

    用户需要同时 具有资源拥有者(账户 A) 其父账户(账户 B)授予的权限,才能访问资源。

使用 IAM 角色授予跨账户访问权限

以下是使用 IAM 角色授予跨账户访问权限的常规步骤:

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

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

  3. 账户 A 中的管理员将向该角色中附加一个信任策略,用于将其他账户(账户 B)中的 IAM 身份标识为可以代入该角色的委托人。

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

  4. 现在,账户 B 中的管理员向账户 B 中的一个或多个 IAM 身份委派权限,使其可以代入该角色。这样,账户 B 中的身份便可访问账户 A 中的资源。

有关使用 IAM 委派权限的更多信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/access.html 中的IAM 用户指南访问权限管理。有关用户、组、角色和权限的更多信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/id.html 中的IAM 用户指南身份 (用户、组和角色)

有关这两种方法的比较,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_compare-resource-policies.html 中的 IAM 角色与基于资源的策略有何不同IAM 用户指南。 支持这两个选项,存在的限制是资源策略只能向 AWS Glue 资源授予访问权限。数据目录

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase" ], "Principal": {"AWS": [ "arn:aws:iam::account-B-id:user/Bob" ]}, "Resource": [ "arn:aws:glue:us-east-1:account-A-id:catalog", "arn:aws:glue:us-east-1:account-A-id:database/db1" ] } ] }

此外,账户 B 还必须将以下 IAM 策略附加至 Bob,然后他才能实际访问账户 A 中的 db1

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

添加或更新 数据目录 资源策略

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

重要

如果您已使用 AWS Lake Formation 从您的账户进行跨账户权限授予,则添加或更新 数据目录 资源策略需要额外的步骤。有关更多信息,请参阅 中的AWS Glue使用 Lake Formation 和 管理跨账户权限。AWS Lake Formation 开发人员指南

要确定是否存在 Lake Formation 跨账户授权,请使用 glue:GetResourcePolicies API 或 AWS CLI。如果 API 返回现有 数据目录 策略以外的任何策略,则存在 Lake Formation 授权。有关更多信息,请参阅 中的GetResourcePolicies使用 API 查看所有跨账户授权。AWS Lake Formation 开发人员指南

添加或更新 数据目录 资源策略(控制台)

  1. 通过以下网址打开 AWS Glue 控制台:https://console.amazonaws.cn/glue/

    以 AWS Identity and Access Management (IAM) 管理用户或具有 glue:PutResourcePolicy 权限的用户身份登录。

  2. 在导航窗格中,选择 Settings

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

    如果控制台显示警报,指出策略中的权限将与使用 Lake Formation 授予的任何权限相补充,请选择 Proceed (继续)

添加或更新 数据目录 资源策略 (AWS CLI)

执行跨账户 API 调用

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

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

执行跨账户 ETL 调用

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

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

有关支持 PySpark 的 APIs catalog_id,请参阅GlueContext 类。有关支持 APIs 的 Scala catalogId,请参阅AWS Glue Scala GlueContext APIs

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

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

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

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

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

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

    2. 更新账户 A 中的 IAM 策略,以允许访问账户 B 中的存储桶。

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

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

    2. 更新账户 A 中的 IAM 策略,以允许访问账户 B 中的 数据目录。

跨账户 CloudTrail 日志记录

当 AWS Glue 提取、转换和加载 (ETL) 作业访问通过 数据目录 跨账户授权共享的 AWS Lake Formation 表的底层数据时,会发生其他 AWS CloudTrail 日志记录行为。

在本讨论中,共享该表的 AWS 账户是所有者账户,共享该表的账户是收件人账户。当接收者账户中的 ETL 作业访问所有者账户中的表中的数据时,添加到接收者账户的日志中的数据访问 CloudTrail 事件将复制到所有者账户的 CloudTrail 日志。这样,所有者账户就可以跟踪各种收件人账户的数据访问。默认情况下,CloudTrail 事件不包含人类可读的委托人标识符(委托人 ARN)。收件人账户中的管理员可以选择在日志中包含委托人 ARN。

有关更多信息,请参阅 中的CloudTrail跨账户 日志记录。AWS Lake Formation 开发人员指南

AWS Glue 资源所有权和操作

您的 AWS 账户对在该账户下创建的 AWS Glue 数据目录 资源具有所有权,而无论创建资源的人员是谁。具体而言,资源所有者是对资源创建请求进行身份验证的IAM委托人实体IAM(即 AWS 账户根用户、 用户或 角色)的 AWS 账户。

  • 如果您使用 AWS 账户的根用户凭证在 数据目录 中创建表,则您的 AWS 账户即为该资源的拥有者。

  • 如果您在您的 AWS 账户中创建一个 IAM 用户并向该用户授予创建表的权限,则该用户创建的每个表的所有者均为您的 AWS 账户(即该用户所属的账户)。

  • 如果您在您的 AWS 账户中创建具有创建表的权限的 IAM 角色,则能够代入该角色的任何人都可以创建表。但同样,您的 AWS 账户将拥有使用该角色创建的这些表资源。

对于每个 AWS Glue 资源,该服务都定义一组适用于它的 API 操作。为授予这些 API 操作的权限,AWS Glue 定义了一组您可以在策略中指定的操作。某些 API 操作可能需要多个操作的权限才能执行 API 操作。

跨账户资源所有权和账单

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

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

有关 AWS Glue 计费和定价的更多信息,请参阅 AWS 定价原理

跨账户访问限制

AWS Glue 跨账户访问具有以下限制:

  • 如果资源所有者账户未将 Amazon Athena 数据目录迁移至 AWS Glue,则不允许跨账户访问 AWS Glue。可以使用GetCatalogImportStatus (获取目录导入状态)查找当前的迁移状态。有关如何将 Athena 目录迁移到 AWS Glue 的更多详细信息,请参阅 用户指南AWS Glue 数据目录 中的升级到 分步指南Amazon Athena。

  • 数据目录 资源(包括数据库、表、用户定义的函数和连接)支持跨账户访问。

  • 使用 AWS Glue 爬网程序或 Amazon Athena 时,不支持对 数据目录 进行跨账户访问。