如何提供对 AWS Glue 数据目录中资源的跨账户访问权限?

上次更新日期:2021 年 8 月 13 日

我想将 Amazon EMR、Amazon Athena 和 AWS Glue 等服务与另一个账户中的 AWS Glue 数据目录配合使用。

解决方法

为了访问另一个账户的 AWS Glue 数据目录中的资源,可用的方法取决于用来连接的 AWS 服务以及您是否使用 AWS Lake Formation 来控制对数据目录的访问权限。

如果您不确定自己是否在使用 Lake Formation 且有想要共享的表,请运行以下 AWS Command Line Interface (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 是源账户,账户 B 是 AWS Glue 数据目录资源所在的账户。

使用 AWS Glue 提取、转换和加载 (ETL) 作业访问资源

1.    在账户 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 策略附加到 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 数据目录配合使用,请务必将默认数据库包含在 GetDatabaseCreateDatabase 操作的策略中方可成功。有关更多信息,请参阅在 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 (超级) 权限,请执行以下操作:

  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 数据库、表和列。然后,这些标签可用于对这些数据目录资源应用精细访问权限。有关更多信息,请参阅 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 方法授予数据目录权限