如何使用目录资源策略为表设置跨账户 AWS Glue ETL 任务?

3 分钟阅读
0

我想使用 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,请在策略中包括默认数据库。这样,可确保 GetDatabaseCreateDatabase 操作取得成功。有关详细信息,请参阅每个 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 Glue 资源 ARN

关于升级到 Lake Formation 权限模型

在 Hive 元存储和 AWS Glue Data Catalog 之间迁移

用于访问控制的 AWS Glue 资源策略

AWS 官方
AWS 官方已更新 1 年前