为 AWS Glue Iceberg REST 配置目录集成

按照本主题中的步骤,使用 签名版本 4 (SigV4) (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html) 身份验证为 AWS Glue Iceberg REST 端点 (https://docs.aws.amazon.com/glue/latest/dg/connect-glu-iceberg-rest.html) 创建目录集成。

备注

要配置目录集成,通过专用 IP 地址连接 AWS Glue Data Catalog,而非通过公共互联网,请参阅 配置具有出站私有连接功能的 Apache Iceberg™ REST 目录集成

第 1 步:配置 AWS Glue Data Catalog 的访问权限

为 Snowflake 创建一个 IAM 策略来访问 AWS Glue Data Catalog。将策略附加到您在创建目录集成时指定的 IAM 角色。有关说明,请参阅《AWS Identity and Access Management 用户指南》中的 创建 IAM 策略 (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html) 和 修改角色权限策略 (https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)。

只读示例策略

Snowflake 至少需要 AWS Glue Data Catalog 的以下权限才能使用 Glue Iceberg REST 目录访问信息。

  • glue:GetCatalog

  • glue:GetDatabase

  • glue:GetDatabases

  • glue:GetTable

  • glue:GetTables

以下示例策略(JSON 格式)提供了访问指定数据库中所有表所需的权限。

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "AllowGlueCatalogTableAccess",
         "Effect": "Allow",
         "Action": [
           "glue:GetCatalog",
           "glue:GetDatabase",
           "glue:GetDatabases",
           "glue:GetTable",
           "glue:GetTables"
         ],
         "Resource": [
            "arn:aws:glue:*:<accountid>:table/*/*",
            "arn:aws:glue:*:<accountid>:catalog",
            "arn:aws:glue:*:<accountid>:database/<database-name>"
         ]
      }
   ]
}

备注

  • 您可以修改此策略的 Resource 元素以进一步限制允许的资源(例如,目录、数据库或表)。有关更多信息,请参阅 AWS Glue 定义的资源类型 (https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsglue.html#awsglue-resources-for-iam-policies)。

  • 如果您对 AWS Glue 使用加密,则必须修改策略以添加 AWS 密钥管理服务 (AWS KMS) 权限。有关更多信息,请参阅`在 AWS Glue 中设置加密<https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html (https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html)>`_。

读写入示例策略

以下示例策略(采用 JSON 格式)提供了对所有数据库中所有表的读写访问所需权限。如需 为外部管理表配置写入访问权限,可将此策略作为示例使用。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGlueCatalogTableAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "glue:GetCatalog",
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:CreateDatabase",
        "glue:DeleteDatabase",
        "glue:GetTable",
        "glue:GetTables",
        "glue:CreateTable",
        "glue:UpdateTable",
        "glue:DeleteTable"
      ],
      "Resource": [
        "arn:aws:glue:*:<accountid>:table/*/*",
        "arn:aws:glue:*:<accountid>:catalog",
        "arn:aws:glue:*:<accountid>:database/*",
        "arn:aws:s3:<external_volume_path>"
      ]
    }
  ]
}

备注

  • 策略必须提供对存储位置的访问权限,以便 AWS Glue 目录能将元数据写入表位置。

  • 此策略 Resource 元素中的 "arn:aws:glue:*:<accountid>:database/*" 行指定了所有数据库。如果希望通过 Snowflake 使用 CREATE SCHEMA 命令在 Glue 中创建新数据库,此设置为必需项。要限制对单个数据库的访问,可按名称指定数据库。有关定义资源的详细信息,请参阅 AWS Glue定义的资源类型 (https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsglue.html#awsglue-resources-for-iam-policies)。

  • 如果您对 AWS Glue 使用加密,则必须修改策略以添加 AWS 密钥管理服务 (AWS KMS) 权限。有关更多信息,请参阅`在 AWS Glue 中设置加密<https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html (https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html)>`_。

(可选)配置 Lake Formation 访问控制

如果您使用 AWS Lake Formation 进行精细访问控制,请确保您的 Lake Formation 配置允许 Snowflake 访问目录对象及其底层数据。

在上一步中创建的 IAM 角色(即在 Snowflake 创建目录集成时指定的角色)必须具备 lakeformation:GetDataAccess IAM 权限。此权限授予对基础数据的读写访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lakeformation:GetDataAccess",
            "Resource": "*"
        }
    ]
}

有关更多信息,请参阅 Lake Formation 文档中的 基础数据访问控制 (https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)。

You must also grant data permissions to the IAM role. The method that you use to grant data permissions depends on your Lake Formation setup. For example, you might use the named resources method to grant permissions to AWS Glue objects, or you might use tag-based access control. For more information and instructions, see the AWS Lake Formation documentation (https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html).

第 2 步:在 Snowflake 中创建目录集成

使用 ` 命令为 AWSREST Glue Iceberg <https://docs.aws.amazon.com/glue/latest/dg/connect-glu-iceberg-rest.html (https://docs.aws.amazon.com/glue/latest/dg/connect-glu-iceberg-rest.html)> 端点 _:doc:/sql-reference/sql/create-catalog-integration-rest` 创建目录集成。指定您配置的 IAM 角色。对于 CATALOG_NAME,请使用 AWS 账户 ID。

CREATE CATALOG INTEGRATION glue_rest_catalog_int
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'rest_catalog_integration'
  REST_CONFIG = (
    CATALOG_URI = 'https://glue.us-west-2.amazonaws.com/iceberg'
    CATALOG_API_TYPE = AWS_GLUE
    CATALOG_NAME = '123456789012'
  )
  REST_AUTHENTICATION = (
    TYPE = SIGV4
    SIGV4_IAM_ROLE = 'arn:aws:iam::123456789012:role/my-role'
    SIGV4_SIGNING_REGION = 'us-west-2'
  )
  ENABLED = TRUE;

其中:

  • CATALOG_URI 是 AWS Glue Iceberg REST 目录的服务端点。

  • CATALOG_NAME 是 AWS 账户的 ID。

有关更多信息,请参阅 CREATE CATALOG INTEGRATION (Apache Iceberg™ REST),其中包括为 AWS Glue 配置目录集成的说明。

第 3 步:检索 Snowflake 账户的 AWS IAM 用户和外部 ID

要检索有关您的 Snowflake 账户的 AWS IAM 用户及外部 ID 信息,请运行 DESCRIBE CATALOG INTEGRATION 命令。在下一步中,您将这些信息提供给 AWS 以建立信任关系。

DESCRIBE CATALOG INTEGRATION glue_rest_catalog_int;

记录以下值:

描述

GLUE_AWS_IAM_USER_ARN

为 Snowflake 账户创建的 AWS IAM 用户,例如 arn:aws:iam::123456789001:user/abc1-b-self1234。Snowflake 会为整个 Snowflake 账户配置单一 IAM 用户。您账户中的所有 Glue 目录集成都使用该 IAM 用户。

GLUE_AWS_EXTERNAL_ID

用于建立信任关系的外部 ID。

第 4 步:授予 IAM 用户访问 AWS Glue 数据目录的权限

更新与创建目录集成 (GLUE_AWS_ROLE_ARN) 时用 ARN 指定的 相同 IAM 角色的信任策略。将您在上一步中记录的值添加到信任策略中。

有关说明,请参阅 修改信任策略 (https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)。

以下示例策略显示了在何处指定 GLUE_AWS_IAM_USER_ARNGLUE_AWS_EXTERNAL_ID 值:

{
   "Version": "2012-10-17",
   "Statement": [
      {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
         "AWS": "<glue_iam_user_arn>"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
         "StringEquals": {
            "sts:ExternalId": "<glue_aws_external_id>"
         }
      }
      }
   ]
}

其中:

  • glue_iam_user_arn 是您记录的 GLUE_IAM_USER_ARN 值。

  • glue_aws_external_id 是您记录的 GLUE_AWS_EXTERNAL_ID 值。

备注

  • 出于安全原因,如果您创建新的目录集成(或使用 CREATE OR REPLACE CATALOG INTEGRATION 语法重新创建现有目录集成),新的目录集成将具有不同的外部 ID,并且无法解析信任关系,除非您使用新的外部 ID 修改信任策略。

  • 为了验证权限配置是否正确,请使用这个目录集成 创建一个 Iceberg 表。在您创建引用此目录集成的 Iceberg 表之前,Snowflake 不会验证权限设置是否正确。

后续步骤

为 AWS Glue Iceberg REST 配置目录集成后,可以:doc:创建一个与目录关联的数据库 </user-guide/tables-iceberg-catalog-linked-database>。在创建该数据库时,将目录集成名称指定为目录即可。

与目录关联的数据库通过自动发现远程 Iceberg REST 目录中的命名空间和表,并保持同步,将外部数据引入 Snowflake。