如何使用目录资源策略为表设置跨账户 AWS Glue ETL 任务?
我想使用 AWS Glue Data Catalog 中的 ETL 任务通过账户 B 访问账户 A 中的表,而不使用 AWS Lake Formation。
概述
无论是否使用 AWS Lake Formation,您都可以访问 AWS Glue Data Catalog 中的跨账户。以下部分概述了仅使用 AWS Glue 访问跨账户目录的设置。
如果使用的是 Lake Formation,请参阅 Lake Formation 中的跨账户数据共享,了解有关设置跨账户资源共享的更多信息。
**注意:**这些步骤介绍了如何在单个 AWS 区域内访问跨账户。它们无法解决对位于其他 AWS 区域资源的访问问题。
解决方法
在源账户和目标账户中设置访问策略
使用下列步骤从账户 A 的 AWS Glue Data Catalog 向账户 B 授予资源级权限。
**注意:**账户 A 拥有 AWS Glue Data Catalog 资源,账户 B 是提取、转换、加载(ETL)账户。此外,账户 A 具有基于资源的策略修改,而账户 B 持有部分 AWS Identity and Access Management(IAM)策略修改。
在账户 A 中附加目录资源策略
1. 登录 AWS 管理控制台。
2. 在搜索栏中,搜索 AWS Glue。选择开始使用 AWS Glue。
3. 从左侧面板中,选择目录设置。
4. 在权限下,输入下列资源策略。此资源策略允许账户 B 访问账户 A 中的数据库和表。
{ "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 替换为账户 B 的账户 ID
- 将 5555666677778888 替换为账户 A 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 doc_example_DB 替换为您的数据库名称
5. (可选)您可以通过在策略中包括角色的 Amazon 资源名称(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 替换为账户 B 的账户 ID
- 将 5555666677778888 替换为账户 A 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 doc_example_DB 替换为您的数据库名称
- 将 AWSGlueServiceRole_Glue_Test 替换为用于运行 ETL 任务的角色的 ARN
在账户 B 中附加 IAM 策略
账户 B 中运行 ETL 任务的 IAM 用户需要访问账户 A 中的数据库和表。
**注意:**如果您对 Data Catalog 使用 Amazon Athena,请在策略中包括默认数据库。这样,可确保 GetDatabase 和 CreateDatabase 操作取得成功。有关详细信息,请参阅每个 AWS 区域的默认数据库和目录。
1. 使用您的 AWS 登录凭证登录 IAM 控制台。
2. 从左侧面板中,选择角色。
3. 选择您在 ETL 脚本中使用的角色名称。
4. 将 IAM 策略附加到账户 B 中 AWS Glue ETL 任务的 IAM 角色。让您能够访问账户 A 中的数据库和表:
{ "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/*" ] } ] }
**注意:**请替换策略中的下列值:
- 将 5555666677778888 替换为账户 A 的账户 ID
- 将 us-east-1 替换为您选择的区域
- 将 doc_example_DB 替换为您的数据库名称
5. 验证您创建的策略是否已附加到账户 B 中的 IAM 角色。
6. 测试账户 B 是否有权访问账户 A 中的数据目录。请使用下列脚本创建 ETL 任务:
动态帧脚本:
df = glueContext.create_dynamic_frame.from_catalog(database="doc_example_DB", table_name="doc_example_table", catalog_id="5555666677778888", region="us-east-1")
数据帧脚本:
"""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 替换为账户 A 的账户 ID
- 将 doc_example_DB 替换为您的数据库名称
- 将 doc_example_table 替换为您的表名
- 将 us-east-1 替换为您选择的区域
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 年前
- AWS 官方已更新 2 年前