如何提供对 AWS Glue Data Catalog 中资源的跨账户访问?
上次更新日期:2022 年 10 月 21 日
我想将 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 方法授予数据目录权限。