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

授予跨账户访问权限

授予跨账户的数据目录资源访问权限,支持您提取、转换和加载(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 支持这两个选项,但存在限制,即资源策略只能授予对数据目录资源的访问权限。

例如,要向账户 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 policy 附加至 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 或 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。如果 API 返回现有数据目录策略以外的任何策略,则存在 Lake Formation 授权。有关更多信息,请参阅 Amazon Lake Formation 开发人员指南中的使用 GetResourcePolicies API 查看所有跨账户授权

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

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

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

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

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

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

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

执行跨账户 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 Glue 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 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 Glue 资源所有权和操作

您的 Amazon 账户对在该账户下创建的 Amazon Glue Data Catalog 资源具有所有权,而无论创建资源的人员是谁。具体而言,资源拥有者是对资源创建请求进行身份验证委托人实体(即 Amazon 账户根用户、IAM 用户或 IAM 角色)的 Amazon 账户;例如:

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

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

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

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

跨账户资源所有权和账单

当一个 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

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

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

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