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

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

授予跨账户访问权限

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

用于在 Amazon Glue 中授予跨账户访问权限的方法

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

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

有两种 Amazon Glue 方法可用于授予跨账户资源访问权限:

  • 使用数据目录资源策略

  • 使用 IAM 角色

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

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

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

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

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

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

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

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

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

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

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

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

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

有关使用 IAM 委派权限的更多信息,请参阅 IAM 用户指南中的访问权限管理。有关用户、组、角色和权限的更多信息,请参阅 IAM 用户指南中的身份(用户、组和角色)

有关这两种方法的对比,请参阅 IAM 用户指南中的 IAM 角色与基于资源的策略有何不同。Amazon Glue 支持这两个选项,但存在限制,即资源策略只能授予对 Data Catalog 资源的访问权限。

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

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

此外,账户 B 还必须将以下 IAM policy 附加至 Dev 角色,然后才能实际访问账户 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 或 Amazon Command Line Interface(Amazon CLI)添加或更新 Amazon Glue 数据目录资源策略。

重要

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

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

添加或更新数据目录资源策略(控制台)
  1. 通过 https://console.aws.amazon.com/glue/ 打开 Amazon Glue 控制台。

    作为具有 glue:PutResourcePolicy 权限的 Amazon Identity and Access Management(IAM)管理用户登录。

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

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

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

添加或更新数据目录资源策略(Amazon CLI)
  • 提交 aws glue put-resource-policy 命令。如果 Lake Formation 授权已存在,请确保包含值为 'TRUE'--enable-hybrid 选项。

    有关使用此命令的示例,请参阅 Amazon Glue 基于资源的策略示例

执行跨账户 API 调用

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

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

执行跨账户 ETL 调用

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

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

对于支持 catalog_id 的 PySpark API,请参阅 GlueContext 班级。对于支持 catalogId 的 Scala API,请参阅 Amazon GlueScala API GlueContext

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

{ "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 policy,以允许访问账户 B 中的存储桶。

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

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

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

跨账户 CloudTrail 日志记录

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

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

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

跨账户资源所有权和账单

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

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

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

跨账户访问限制

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

  • 如果您在区域支持 Amazon Glue 之前已使用 Amazon Athena 或 Amazon Redshift Spectrum 创建数据库和表,并且资源拥有者账户尚未将 Amazon Athena 数据目录迁移至 Amazon Glue,则不允许跨账户访问 Amazon Glue。可以使用GetCatalogImportStatus (get_catalog_import_status)查找当前的迁移状态。有关如何将 Athena 目录迁移到 Amazon Glue 的更多信息,请参阅 Amazon Athena 用户指南中的按步骤升级到 Amazon Glue Data Catalog

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

  • 从 Athena 跨账户访问数据目录需要将目录注册为 Athena DataCatalog 资源。有关说明,请参阅 Amazon Athena 用户指南中的从其他账户注册 Amazon Glue Data Catalog