本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在亚马逊中将 Snowflake 作为数据源进行连接 DataZone
亚马逊 DataZone 支持 Snowflake 作为第三方数据源。将 Snowflake 连接到亚马逊 DataZone 项目后,该目录可以索引您的 Snowflake 数据库和架构,从 Snowflake 的查询历史记录中捕获列级谱系,并允许您通过联合来查询 Snowflake 表。本页将引导您使用 CLI AWS 创建 Snowflake 连接。
先决条件
在开始之前,请确认以下内容已准备就绪:
-
一个 Amazon DataZone 域名和一个你想要将 Snowflake 数据编入目录的项目。请参阅Amazon 中的域名和用户访问权限 DataZone和Amazon DataZone 项目和环境。
-
一个 Snowflake 帐户,具有在要编目的数据库、架构和仓库中创建角色和授予权限的权限。
-
使用与您 AWS Secrets Manager 的 Amazon DataZone 域名相同的 AWS 账户进行访问。
-
如果您打算从中查询 Snowflake 数据,则可以使用 Amazon S3 存储桶进行查询泄露。
您将按以下顺序执行以下步骤:创建 Snowflake 角色,将 Snowflake 凭证存储在中, AWS Secrets Manager找到您的亚马逊 DataZone 项目环境 ID,然后致电。aws datazone create-connection
第 1 步:为亚马逊创建 Snowflake 角色 DataZone
亚马逊使用您创建并向其授予特定权限的角色 DataZone 连接到 Snowflake。角色授权分为四类:
-
元数据同步 — Amazon DataZone 读取您的表和视图的结构以填充目录。
-
血统同步 — 亚马逊 DataZone 读取 Snowflake 的 QUERY_HISTORY 和 ACCESS_HISTORY 来推导列级血统。
-
查询权限 — 通过 Amazon DataZone 发出的查询(包括来自)的查询是必需的。
-
仓库使用情况-角色执行的任何查询都需要使用。
在 Snowflake 中运行以下语句,将占位符替换为你的值:
CREATE ROLE <role_name>; -- Metadata: database and schema access GRANT USAGE ON DATABASE <database_name> TO ROLE <role_name>; GRANT USAGE ON SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; -- Metadata: table and view structure (no data access) GRANT REFERENCES ON ALL TABLES IN SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; GRANT REFERENCES ON ALL VIEWS IN SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; GRANT REFERENCES ON FUTURE TABLES IN SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; GRANT REFERENCES ON FUTURE VIEWS IN SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; -- Lineage: access to QUERY_HISTORY and ACCESS_HISTORY GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE TO ROLE <role_name>; -- Query access GRANT SELECT ON ALL TABLES IN SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; -- Optional: include tables created after the role is granted GRANT SELECT ON FUTURE TABLES IN SCHEMA <database_name>.<schema_name> TO ROLE <role_name>; -- Warehouse access GRANT USAGE ON WAREHOUSE <warehouse_name> TO ROLE <role_name>; -- Assign the role to the Snowflake user whose credentials DataZone will use GRANT ROLE <role_name> TO USER <snowflake_username>;
重要
GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE是血统所必需的。如果没有它,元数据同步就会成功,但不会捕获任何世系记录。
第 2 步:将 Snowflake 凭据存储在 AWS Secrets Manager
在 AWS Secrets Manager与您的 Amazon DataZone 域名相同的 AWS 账户中创建密钥。Amazon DataZone 支持两种身份验证方法:用户名和密码或密钥对。
要进行用户名和密码身份验证,请使用以下 JSON 正文:
{ "username": "<snowflake_username>", "password": "<snowflake_password>" }
要进行密钥对身份验证,请使用以下 JSON 正文:
{ "sfUser": "<snowflake_username>", "pem_private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----" }
给秘密加标签,这样 Amazon DataZone 就可以发现它。这两个标签都是必需的:
| 标签键 | 值 |
|---|---|
AmazonDataZoneDomain |
您的亚马逊 DataZone 域名 |
AmazonDataZoneProject |
您的亚马逊 DataZone 项目 ID |
请注意密钥的 ARN。您将在步骤 4 create-connection 中将其传递给。
第 3 步:查找您的项目环境 ID
create-connectionAPI 调用需要连接所在的项目环境的 ID。你可以从项目用户角色 ARN 中推导出来。
项目用户角色 ARN 遵循以下模式:
arn:aws:iam::<account_id>:role/datazone_usr_role_<project_id>_<environment_id>
最后一个下划线之后的最后一段是环境 ID。例如,在:
arn:aws:iam::123456789012:role/datazone_usr_role_a1b2c3dfadsf_58cjkfdsjfd
58cjkfdsjfd 是环境 ID。这是要传递的值,如步骤 4 --environment-identifier 所示。环境 ID 对应于您项目的工具环境。
步骤 4:创建 Snowflake 连接
运行以下 AWS CLI 命令,用您的值替换占位符:
aws datazone create-connection \ --domain-identifier <domain_id> \ --environment-identifier <environment_id> \ --name "<connection_name>" \ --description "<optional_description>" \ --props '{ "snowflakeProperties": { "connectivityProperties": { "connectionProperties": { "HOST": "<account>.snowflakecomputing.com", "PORT": "443", "DATABASE": "<database_name>", "WAREHOUSE": "<warehouse_name>", "SCHEMA": "<schema_name>", "ROLE_ARN": "<project_user_role_arn>", "CATALOG_CASING_FILTER": "UPPERCASE_ONLY" }, "athenaProperties": { "spill_bucket": "<project_s3_bucket_name>", "spill_prefix": "<domain_id>/<project_id>/dev/sys/athena" }, "authenticationConfiguration": { "authenticationType": "BASIC", "secretArn": "<secret_arn_from_step_2>" } }, "snowflakeRole": "<role_name_from_step_1>", "identityMapping": { "usernameAttribute": "EMAIL" } } }'
连接属性参考
| 属性 | 说明 |
|---|---|
HOST |
你的 Snowflake 账号网址。 |
PORT |
Snowflake 端口。使用 443。 |
DATABASE |
要编目的 Snowflake 数据库。 |
WAREHOUSE |
亚马逊 DataZone 用来运行查询的 Snowflake 仓库。 |
SCHEMA |
要编目的 Snowflake 架构。 |
ROLE_ARN |
项目用户角色 ARN(参见步骤 3)。 |
CATALOG_CASING_FILTER |
控制已编目标识符的大小写标准化。有效值为 UPPERCASE_ONLY 和 LOWERCASE_ONLY。如果省略,则默认为UPPERCASE_ONLY。 |
spill_bucket |
查询泄漏的 S3 存储桶名称。从中查询 Snowflake 时为必填项。 |
spill_prefix |
S3 泄漏前缀,格式为<domain_id>/<project_id>/dev/sys/athena。 |
authenticationType |
BASIC用于 username/password 或密钥对身份验证。 |
secretArn |
在步骤 2 中创建的密钥的 ARN。 |
snowflakeRole |
步骤 1 中的 Snowflake 角色名称。 |
identityMapping.usernameAttribute |
设置为 EMAIL。 |
验证连接
aws datazone get-connection使用您的域名 ID 和返回的连接标识符进行呼叫create-connection。首次运行元数据同步后,已编目的 Snowflake 表将出现在该项目的亚马逊 DataZone 目录中。