Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用目录资源策略为表设置跨账户 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 官方已更新 2 年前