如何提供对 AWS Glue 数据目录中资源的跨账户存取权限?
上次更新日期:2022 年 6 月 27 日
我想将 Amazon EMR、Amazon Athena 和 AWS Glue 等服务与另一个账户中的 AWS Glue 数据目录配合使用。
解决方法
为了访问另一个账户的 AWS Glue 数据目录中的资源,可用的方法取决于用来连接的 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 区域中的账户,请参阅 AWS Glue 数据目录复制实用工具。
访问没有 Lake Formation 的数据目录
如果您没有使用 Lake Formation,请执行以下操作以从账户 B 的 AWS Glue 数据目录授予账户 A 资源级权限。
注意:账户 A 是 ETL 账户,账户 B 是 AWS Glue 数据目录资源所在的账户。
使用 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 替换为数据库的名称
您还可以在策略中包含角色的 ARN,从而限制对用于运行作业的账户 A 中特定角色的访问权限。例如:
{
"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 中的 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 数据目录配合使用,请务必将默认数据库包含在 GetDatabase 和 CreateDatabase 操作的策略中方可成功。有关更多信息,请参阅在 AWS Glue 数据目录中对数据库和表的精细访问。
请务必在上述策略中替换以下值:
- 将 1111222233334444 替换为账户 A 的账户 ID
- 将 5555666677778888 替换为账户 B 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 DOC-EXAMPLE-DB 替换为数据库的名称
3. 提供账户 A 所需的权限后,您可以使用以下脚本创建 ETL 作业,以测试账户 A 是否有权访问账户 B 中的数据目录:
"""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 替换为表的名称
使用 EMR 访问资源
要使用 EMR 访问其他账户中的数据目录,请参阅如何使用 Amazon EMR 上的 Hive 和 Spark 来查询不同 AWS 账户中的 AWS Glue 数据目录?
使用 Athena 访问资源
要使用 Athena 访问其他账户中的数据目录,请参阅从另一个账户注册 AWS Glue 数据目录。
使用 Lake Formation 访问数据目录
如果您使用的是 Lake Formation,则可以利用以下方法之一授予对数据目录的跨账户访问权限:
- 命名资源
- 基于标签的访问控制 (TBAC)
重要提示:若要防止数据目录中的新表对 IAMAllowedPrincipals 具有默认的 Super (超级) 权限,请执行以下操作:
- 打开 AWS Lake Formation 控制台。
- 在导航窗格中,选择数据目录,然后选择设置。
- 清除仅对新数据库使用 IAM 访问控制和仅对此数据库中的新表使用 IAM 访问控制复选框。
- 选择保存。
有关更多信息,请参阅更改数据湖的默认安全设置。
使用命名资源方法授予跨账户权限
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 数据库、表和列。然后,这些标签可用于对这些数据目录资源应用精细访问权限。有关更多信息,请参阅 基于 Lake Formation 标签的访问控制。
要使用 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 权限。有关详细信息,请参阅使用 TBAC 方法授予数据目录权限。