

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在亚马逊中将 Snowflake 作为数据源进行连接 DataZone
<a name="snowflake-data-source"></a>

亚马逊 DataZone 支持 Snowflake 作为第三方数据源。将 Snowflake 连接到亚马逊 DataZone 项目后，该目录可以索引您的 Snowflake 数据库和架构，从 Snowflake 的查询历史记录中捕获列级谱系，并允许您通过联合来查询 Snowflake 表。本页将引导您使用 CLI AWS 创建 Snowflake 连接。

## 先决条件
<a name="snowflake-data-source-prerequisites"></a>

在开始之前，请确认以下内容已准备就绪：
+ 一个 Amazon DataZone 域名和一个你想要将 Snowflake 数据编入目录的项目。请参阅[Amazon 中的域名和用户访问权限 DataZone](working-with-domains-users.md)和[Amazon DataZone 项目和环境](working-with-projects.md)。
+ 一个 Snowflake 帐户，具有在要编目的数据库、架构和仓库中创建角色和授予权限的权限。
+ 使用与您 AWS Secrets Manager 的 Amazon DataZone 域名相同的 AWS 账户进行访问。
+ 如果您打算从中查询 Snowflake 数据，则可以使用 Amazon S3 存储桶进行查询泄露。

您将按以下顺序执行以下步骤：创建 Snowflake 角色，将 Snowflake 凭证存储在中， AWS Secrets Manager找到您的亚马逊 DataZone 项目环境 ID，然后致电。`aws datazone create-connection`

## 第 1 步：为亚马逊创建 Snowflake 角色 DataZone
<a name="snowflake-data-source-step1"></a>

亚马逊使用您创建并向其授予特定权限的角色 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
<a name="snowflake-data-source-step2"></a>

在 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
<a name="snowflake-data-source-step3"></a>

`create-connection`API 调用需要连接所在的项目环境的 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 连接
<a name="snowflake-data-source-step4"></a>

运行以下 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"
        }
      }
    }'
```

### 连接属性参考
<a name="snowflake-data-source-connection-properties"></a>


| 属性 | 说明 | 
| --- | --- | 
| 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。 | 

## 验证连接
<a name="snowflake-data-source-verify"></a>

`aws datazone get-connection`使用您的域名 ID 和返回的连接标识符进行呼叫`create-connection`。首次运行元数据同步后，已编目的 Snowflake 表将出现在该项目的亚马逊 DataZone 目录中。