如何提供对 AWS Glue Data Catalog 中资源的跨账户访问?
我想将 Amazon EMR、Amazon Athena 和 AWS Glue 等服务与另一个账户中的 AWS Glue Data Catalog 配合使用。
解决方案
访问 AWS Glue Data Catalog 中跨账户资源的方式取决于您用来连接的 AWS 服务。同时还取决于您是否使用 AWS Lake Formation 来控制对数据目录的访问权限。
如果您不确定自己是否在使用 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。
数据目录可能位于混合环境中,其中有些表使用 Lake Formation,另一些表使用 AWS Glue 权限。要将数据目录升级到 Lake Formation,请参阅将 AWS Glue 数据权限升级到 AWS Lake Formation 模型。
**注意:**本文介绍了单个 AWS 区域内跨账户存取的解决方案选项。访问其他区域内的资源不在本文的讨论范围内。要将数据目录从自己的账户复制到其他 AWS 区域中的账户,请参阅 GitHub 上的 AWS Glue Data Catalog 复制实用工具。
在不使用 Lake Formation 的情况下访问数据目录
如果您没有使用 Lake Formation,请执行以下操作以从账户 B 的 AWS Glue Data Catalog 授予账户 A 资源级权限。
**注意:**账户 A 是提取、转换、加载 (ETL) 账户,账户 B 是 AWS Glue Data Catalog 资源所在的账户。
使用 AWS Glue ETL 作业访问资源
1. 在账户 B 中附加类似于以下内容的资源策略。这允许账户 A 从账户 B 访问数据库和表。您可以通过在导航窗格中选择目录设置,使用 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. 运行 ETL 作业的账户 A 中的 AWS Identity and Access Management (IAM) 用户需要账户 B 中数据库和表的访问权限。在账户 A 中,将 IAM policy 附加到 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 中的数据目录。要验证这一点,请使用以下脚本创建 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 访问其他账户中的数据目录,请参阅如何使用 Amazon EMR 上的 Hive 和 Spark 来查询不同 AWS 账户中的 AWS Glue Data Catalog?
使用 Athena 访问资源
要使用 Athena 访问其他账户中的数据目录,请参阅 AWS Glue Data Catalog 的跨账户访问。
使用 Lake Formation 访问数据目录
如果您使用的是 Lake Formation,则可以利用以下方法之一授予对数据目录的跨账户访问:
- 命名资源
- 基于标签的访问控制 (TBAC)
**重要提示:**若要防止数据目录中的新表对 IAMAllowedPrincipals 具有默认的 **Super (超级)**权限,请执行以下操作:
1. 打开 AWS Lake Formation 控制台。
2. 在导航窗格中,选择数据目录,然后选择设置。
3. 清除仅对新数据库使用 IAM 访问控制和仅对此数据库中的新表使用 IAM 访问控制。
4. 选择保存。
有关更多信息,请参阅更改数据湖的默认安全设置。
使用命名资源方法授予跨账户权限
AWS Resource Access Manager (AWS RAM) 用于通过使用命名资源方法提供数据库权限。
- 要从组织中的其他账户访问资源,请在组织内激活资源共享。
- 要访问组织之外的其他账户中的资源,请参阅访问和查看共享的数据目录表和数据库。
要向账户 A 授予账户 B 中数据目录资源的 Lake Formation 权限,请执行以下操作:
1. 在账户 B 的数据目录中附加类似于以下内容的资源策略:
{ "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 中数据目录数据库和表的 Lake Formation 权限。有关详细信息,请参阅使用命名资源方法授予数据目录权限。
使用 TBAC 授予跨账户权限
借助 TBAC,您可以定义策略标签并将这些标签分配给 AWS Glue 数据库、表和列。然后,这些标签可用于对这些数据目录资源应用精细访问权限。有关更多信息,请参阅使用基于标签的访问控制进行数据共享。
要使用 TBAC 授予 Lake Formation 权限,请执行以下操作:
1. 在账户 B 的数据目录中附加类似于以下内容的资源策略:
{ "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 方法授予对数据目录资源的 Lake Formation 权限。有关更多信息,请参阅使用 LF-TBAC 方法授予数据目录权限。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前