如何提供对 AWS Glue Data Catalog 中资源的跨账户访问?
我想将 Amazon EMR、Amazon Athena 和 AWS Glue 等服务与另一个账户中的 AWS Glue Data Catalog 配合使用。
解决方法
访问 AWS Glue Data Catalog 中跨账户资源的方式取决于您用于连接的 AWS 服务。该访问方法还取决于您是否使用 AWS Lake Formation 来控制对 Data Catalog 的访问权限。
如果您不确定自己是否在使用 Lake Formation 且想要共享表,请运行以下 AWS 命令行界面 (AWS CLI) 命令:
aws glue get-table --database-name DOC-EXAMPLE-DB --name DOC-EXAMPLE-TABLE --query 'Table.IsRegisteredWithLakeFormation'
请务必替换此命令中的以下值:
- 将 DOC-EXAMPLE-DB 替换为数据库的名称
- 将 DOC-EXAMPLE-TABLE 替换为表的名称
如果该命令返回 true,则表明您正在使用 Lake Formation。
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI。
Data Catalog 可能位于混合环境中,其中一些表使用 Lake Formation,另一些表使用 AWS Glue 权限。要将 Data Catalog 升级到 Lake Formation,请参阅将 AWS Glue 数据权限升级到 AWS Lake Formation 模型。
**注意:**本文介绍了针对单个 AWS 区域内的跨账户访问的解决方案选项。访问其他区域中的资源不在本文的范围内。要将 Data Catalog 从您的账户复制到其他 AWS 区域中的账户,请参阅 GitHub 上的 AWS Glue Data Catalog replication utility。
在不使用 Lake Formation 的情况下访问 Data Catalog
如果您没有使用 Lake Formation,请执行以下操作,以从账户 B 的 AWS Glue Data Catalog 中向账户 A 授予资源级权限。
**注意:**账户 A 是提取、转换、加载 (ETL) 账户,账户 B 是 AWS Glue Data Catalog 资源所在的账户。
使用 AWS Glue ETL 作业访问资源
1.在账户 B 中附加类似于以下的资源策略。这允许账户 A 访问账户 B 中的数据库和表。您可以通过在导航窗格中选择 Catalog settings(目录设置),使用 AWS Glue 控制台附加策略。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1111222233334444:root" }, "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:5555666677778888:catalog", "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB", "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*" ] } ] }
请务必替换此策略中的以下值:
- 将 1111222233334444 替换为账户 A 的账户 ID
- 将 5555666677778888 替换为账户 B 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 DOC-EXAMPLE-DB 替换为数据库的名称
您还可以限制对账户 A 中用于运行作业的特定角色的访问权限。这可通过在策略中包含角色的 ARN 实现。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1111222233334444:role/service-role/AWSGlueServiceRole-Glue-Test" }, "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:5555666677778888:catalog", "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB", "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*" ] } ] }
请务必替换此策略中的以下值:
- 将 1111222233334444 替换为账户 A 的账户 ID
- 将 5555666677778888 替换为账户 B 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 DOC-EXAMPLE-DB 替换为数据库的名称
- 将 AWSGlueServiceRole-Glue-Test 替换为用于运行 ETL 作业的角色的 ARN
2.账户 A 中运行 ETL 作业的 AWS Identity and Access Management (IAM) 用户需要账户 B 中数据库和表的访问权限。在账户 A 中,请将 IAM 策略附加到 AWS Glue ETL 作业的 IAM 角色,以访问账户 B 中的数据库和表:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:GetConnection", "glue:GetTable", "glue:GetPartition" ], "Resource": [ "arn:aws:glue:us-east-1:5555666677778888:catalog", "arn:aws:glue:us-east-1:5555666677778888:database/default", "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB", "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*" ] } ] }
**注意:**如果您将 Athena 与 AWS Glue Data Catalog 配合使用,请在策略中包括默认数据库。这样可确保 GetDatabase 和 CreateDatabase 操作成功。有关详细信息,请参阅每个 AWS 区域的默认数据库和目录的访问策略。
请务必替换此策略中的以下值:
- 将 1111222233334444 替换为账户 A 的账户 ID
- 将 5555666677778888 替换为账户 B 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 DOC-EXAMPLE-DB 替换为数据库的名称
3.向账户 A 提供所需的权限后,您可以测试账户 A 是否有权访问账户 B 中的 Data Catalog。要对此进行测试,请使用以下脚本创建一个 ETL 作业:
"""Create Spark Session with cross-account AWS Glue Data Catalog""" from pyspark.sql import SparkSession spark_session = SparkSession.builder.appName("Spark Glue Example") \ .config("hive.metastore.client.factory.class", \ "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \ .config("hive.metastore.glue.catalogid", "5555666677778888") \ .enableHiveSupport() \ .getOrCreate() table_df = spark_session.sql("SELECT * FROM DOC-EXAMPLE-DB.DOC-EXAMPLE-TABLE limit 10") table_df.show()
请务必替换此脚本中的以下值:
- 将 5555666677778888 替换为账户 B 的账户 ID
- 将 DOC-EXAMPLE-DB 替换为数据库的名称
- 将 DOC-EXAMPLE-TABLE 替换为表的名称
使用 Amazon EMR 访问资源
要使用 Amazon EMR 访问其他账户中的 Data Catalog,请参阅如何在 Amazon EMR 上使用 Hive 和 Spark 查询位于不同 AWS 账户中的 AWS Glue Data Catalog?
使用 Athena 访问资源
要使用 Athena 访问其他账户中的 Data Catalog,请参阅 AWS Glue Data Catalog 的跨账户访问。
使用 Lake Formation 访问 Data Catalog
如果您使用的是 Lake Formation,则可以使用以下方法之一授予对 Data Catalog 的跨账户访问:
- 命名资源
- 基于标签的访问控制 (TBAC)
**重要事项:**要防止 Data Catalog 中的新表具有对 IAMAllowedPrincipals 的默认 Super 权限,请执行以下操作:
1.打开 AWS Lake Formation 控制台。
2.在导航窗格中,选择 Data Catalog,然后选择 Settings(设置)。
3.清除 Use only IAM access control for new databases(仅对新数据库使用 IAM 访问控制)和 Use only IAM access control for new tables in this database(仅对此数据库中的新表使用 IAM 访问控制)。
4.选择 Save(保存)。
有关详细信息,请参阅更改数据湖的默认安全设置。
使用命名资源方法授予跨账户权限
AWS Resource Access Manager (AWS RAM) 用于通过使用命名资源方法提供数据库权限。
- 要访问组织中其他账户中的资源,请在组织内激活资源共享。
- 要访问组织外其他账户中的资源,请参阅访问和查看共享的 Data Catalog 表和数据库。
要向账户 A 授予对账户 B 中 Data Catalog 资源的 Lake Formation 权限,请执行以下操作:
1.在账户 B 的 Data Catalog 中附加类似于以下的资源策略:
{ "Effect": "Allow", "Action": [ "glue:ShareResource" ], "Principal": { "Service": [ "ram.amazonaws.com" ] }, "Resource": [ "arn:aws:glue:us-east-1:5555666677778888:table/*/*", "arn:aws:glue:us-east-1:5555666677778888:database/*", "arn:aws:glue:us-east-1:5555666677778888:catalog" ] }
请务必将策略中的 5555666677778888 替换为账户 B 的账户 ID。
2.使用命名资源方法授予对账户 B 中 Data Catalog 数据库和表的 Lake Formation 权限。有关详细信息,请参阅使用命名资源方法授予 Data Catalog 权限。
使用 TBAC 授予跨账户权限
使用 TBAC,您可以定义策略标签并将这些标签分配给 AWS Glue 数据库、表和列。然后,这些标签可用于对这些 Data Catalog 资源应用精细访问权限。有关详细信息,请参阅使用基于标签的访问控制共享数据。
要使用 TBAC 授予 Lake Formation 权限,请执行以下操作:
1.在账户 B 的 Data Catalog 中附加类似于以下的资源策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1111222233334444:root" }, "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:5555666677778888:catalog", "arn:aws:glue:us-east-1:5555666677778888:database/*", "arn:aws:glue:us-east-1:5555666677778888:table/*" ], "Condition": { "Bool": { "glue:EvaluatedByLakeFormationTags": true } } } ] }
请务必替换策略中的以下值:
- 将 1111222233334444 替换为账户 A 的账户 ID
- 将 5555666677778888 替换为账户 B 的账户 ID
2.创建策略标签。
3.使用 TBAC 方法授予对 Data Catalog 资源的 Lake Formation 权限。有关详细信息,请参阅使用 LF-TBAC 方法授予 Data Catalog 权限。
相关信息

相关内容
- AWS 官方已更新 4 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前