如何提供对 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 配合使用,请将默认数据库包含在策略中。这可以确保 GetDatabaseCreateDatabase 操作成功。有关更多信息,请参阅每个 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 方法授予数据目录权限