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

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

授予跨账户访问权限

跨账户授予对 Data Catalog 资源的访问权限,使您的提取、转换和加载 (ETL) 作业可查询和联接来自不同账户的数据。

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

您可以使用 AWS Glue 方法或使用 AWS 湖泊形成跨账户授予对外部 AWS 账户数据的访问权限。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 中的管理员将向账户 B 中的用户或其他 IAM 身份附加一个 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 委派权限的更多信息,请参阅访问控制中的IAM 用户指南。有关用户、组、角色和权限的更多信息,请参阅《IAM 用户指南》 中的身份 (用户、组和角色)

有关这两种方法的对比,请参阅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,然后他才能实际访问db1在账户 A 中。

{ "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 Command Line Interface (AWS CLI) 添加或更新 AWS Glue 数据目录资源策略。

重要

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

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

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

  1. 打开 AWS Glue 控制台,https://console.aws.amazon.com/glue/

    以 AWS Identity and Access Management (IAM) 管理用户或拥有glue:PutResourcePolicy权限。

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

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

    如果控制台显示警报,指出策略中的权限将是使用 Lake Formation 授予的任何权限之外的权限,请选择继续

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

执行跨账户 API 调用

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

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

执行跨账户 ETL 调用

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

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

对于支持 catalog_id 的 PySpark API,请参阅 GlueContext 类。对于支持 catalogId 的 Scala API,请参阅 AWS Scala GlueContext API

以下示例显示被授权者运行 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 策略,以允许访问账户 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 数据目录资源都具有所有权。具体而言,资源的 AWS 有者是委托人(即 AWS 账户根用户、IAM 用户或 IAM 角色)身份验证该资源的创建请求;例如:

  • 如果您使用 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 (get_catalog_import_status)查找当前的迁移状态。有关如何将 Athena 目录迁移到 AWS Glue 的更多详细信息,请参阅分步升级到 AWS Glue 数据目录中的Amazon Athena 用户指南

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

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