为 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) 创建目录集成。
第 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)。
您还必须向 IAM 角色授予数据权限。授予数据权限的方法取决于您的 Lake Formation 设置。例如,您可以使用命名资源方法向 AWS Glue 对象授予权限,或使用基于标签的访问控制。有关更多信息和说明,请参阅 AWS Lake Formation 文档 (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_ARN
和 GLUE_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 配置目录集成后,您可以 创建 Iceberg 表。