

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon Athena Snowflake 連接器
<a name="connectors-snowflake"></a>

適用於 [Snowflake](https://www.snowflake.com/) 的 Amazon Athena 連接器可讓 Amazon Athena 使用 JDBC 對存放在 Snowflake SQL 資料庫或 RDS 執行個體中的資料執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-snowflake-prerequisites"></a>

使用 Athena 主控台或 `CreateDataCatalog` API 操作，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱[建立資料來源連線](connect-to-a-data-source.md)。

## 限制
<a name="connectors-snowflake-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 只有舊版連線支援多工器設定。
+ 目前支援採用單一分割方式的 Snowflake 檢視。
+  在 Snowflake 中，物件名稱區分大小寫。Athena 在 DDL 和 DML 查詢中接受混合大小寫，但在預設情況下，會在執行查詢時[接受](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#table-names-and-table-column-names-in-ate-must-be-lowercase)物件名稱。使用 Glue Catalog/Lake Formation 時，Snowflake 連接器僅支援小寫。使用 Athena Catalog 時，客戶可以使用 `casing_mode` Lambda 環境變數控制大小寫行為，其可能的值列於 [Parameters](#connectors-snowflake-parameters)區段 （例如 `key=casing_mode, value = CASE_INSENSITIVE_SEARCH`)。

## 條款
<a name="connectors-snowflake-terms"></a>

下列術語與 Snowflake 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-snowflake-parameters"></a>

使用本節中的參數來設定 Snowflake 連接器。

### Glue 連線 (建議)
<a name="snowflake-gc"></a>

我們建議您使用 Glue 連線物件來設定 Snowflake 連接器。為此，請將 Snowflake 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type SNOWFLAKE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **NONE** – 請勿變更指定結構描述和資料表名稱的大小寫 （對 Snowflake 執行查詢）。這是未指定 **casing\$1mode** 時的預設值。
  + **UPPER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的大寫。
  + **LOWER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的較小大小寫。
  + **CASE\$1INSENSITIVE\$1SEARCH** – 針對 Snowflake 中的結構描述和資料表名稱執行不區分大小寫的搜尋。例如，當您有類似 的查詢，`SELECT * FROM EMPLOYEE`且 Snowflake 包含名為 的資料表時，您可以使用此模式`Employee`。不過，在出現名稱衝突的情況下，例如在 Snowflake `Employee`中有一個名為 的資料表`EMPLOYEE`和另一個名為 的資料表，查詢將會失敗。

**注意**  
使用 Glue 連線建立的 Snowflake 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Snowflake 連接器僅支援 `ConnectionSchemaVersion` 2。

**儲存登入資料**

使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。如需詳細資訊，請參閱[使用 Snowflake 進行身分驗證](connectors-snowflake-authentication.md)。

### 舊版連線
<a name="snowflake-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **default** – 用來連線至 Snowflake 資料庫執行個體的 JDBC 連線字串。例如 `snowflake://${jdbc_connection_string}`
+ **catalog\$1connection\$1string** – 由多工處理常式使用 (使用 Glue 連線時不支援)。資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysnowflakecatalog，則環境變數名稱為 mysnowflakecatalog\$1connection\$1string。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **NONE** – 請勿變更指定結構描述和資料表名稱的大小寫 （對 Snowflake 執行查詢）。這是未指定 **casing\$1mode** 時的預設值。
  + **UPPER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的大寫。
  + **LOWER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的較小大小寫。
  + **CASE\$1INSENSITIVE\$1SEARCH** – 針對 Snowflake 中的結構描述和資料表名稱執行不區分大小寫的搜尋。例如，當您有類似 的查詢，`SELECT * FROM EMPLOYEE`且 Snowflake 包含名為 的資料表時，您可以使用此模式`Employee`。不過，在出現名稱衝突的情況下，例如在 Snowflake `Employee`中有一個名為 的資料表`EMPLOYEE`和另一個名為 的資料表，查詢將會失敗。
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

#### 連接字串
<a name="connectors-snowflake-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
snowflake://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-snowflake-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | SnowflakeMuxCompositeHandler | 
| 中繼資料處理常式 | SnowflakeMuxMetadataHandler | 
| 記錄處理常式 | SnowflakeMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-snowflake-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysnowflakecatalog，則環境變數名稱為 mysnowflakecatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Snowflake MUX Lambda 函數：`snowflake1` (預設) 和 `snowflake2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | snowflake://jdbc:snowflake://snowflake1.host:port/?warehouse=warehousename&db=db1&schema=schema1&\$1\$1Test/RDS/Snowflake1\$1 | 
| snowflake\$1catalog1\$1connection\$1string | snowflake://jdbc:snowflake://snowflake1.host:port/?warehouse=warehousename&db=db1&schema=schema1\$1\$1Test/RDS/Snowflake1\$1 | 
| snowflake\$1catalog2\$1connection\$1string | snowflake://jdbc:snowflake://snowflake2.host:port/?warehouse=warehousename&db=db1&schema=schema1&user=sample2&password=sample2 | 

##### 提供憑證
<a name="connectors-snowflake-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/Snowflake1}`。

```
snowflake://jdbc:snowflake://snowflake1.host:port/?warehouse=warehousename&db=db1&schema=schema1${Test/RDS/Snowflake1}&... 
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
snowflake://jdbc:snowflake://snowflake1.host:port/warehouse=warehousename&db=db1&schema=schema1&user=sample2&password=sample2&... 
```

目前，Snowflake 可辨識 `user` 和 `password` JDBC 屬性。它也接受格式為 *username*`/`*password* 的使用者名稱和密碼，而不使用金鑰 `user` 或 `password`。

#### 使用單一連接處理常式
<a name="connectors-snowflake-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Snowflake 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | SnowflakeCompositeHandler | 
| 中繼資料處理常式 | SnowflakeMetadataHandler | 
| 記錄處理常式 | SnowflakeRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-snowflake-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Snowflake 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | snowflake://jdbc:snowflake://snowflake1.host:port/?secret=Test/RDS/Snowflake1 | 

#### 溢出參數
<a name="connectors-snowflake-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-snowflake-data-type-support"></a>

下表顯示 JDBC 和 Apache Arrow 的相應資料類型。


****  

| JDBC | Arrow | 
| --- | --- | 
| Boolean | 位元 | 
| Integer | Tiny | 
| Short | Smallint | 
| Integer | Int | 
| Long | Bigint | 
| float | Float4 | 
| Double | Float8 | 
| Date | DateDay | 
| 時間戳記 | DateMilli | 
| String | Varchar | 
| 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | 
| ARRAY | 清單 | 

## 資料類型轉換
<a name="connectors-snowflake-data-type-conversions"></a>

除了 JDBC 到 Arrow 轉換之外，連接器還會執行一些其他轉換，以使 Snowflake 來源和 Athena 資料類型相容。這些轉換有助於確保成功執行查詢。下表顯示了這些轉換。


****  

| 來源資料類型 (Snowflake) | 轉換後的資料類型 (Athena) | 
| --- | --- | 
| TIMESTAMP | TIMESTAMPMILLI | 
| DATE | TIMESTAMPMILLI | 
| INTEGER | INT | 
| DECIMAL | BIGINT | 
| TIMESTAMP\$1NTZ | TIMESTAMPMILLI | 

所有其他不受支援的資料類型都會轉換為 `VARCHAR`。

## 分割區和分隔
<a name="connectors-snowflake-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

若要建立此合成資料欄和分割區，Athena 需要定義主索引鍵。不過，由於 Snowflake 不會強制執行主索引鍵限制，您必須自行強制執行唯一性。否則，Athena 會預設為單一分割。

## 效能
<a name="connectors-snowflake-performance"></a>

為了獲得最佳效能，請盡可能在查詢中使用篩選條件。此外，我們強烈建議使用原生分割來擷取具有統一分割區分佈的龐大資料集。選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。Snowflake 連接器由於並行而對限流保有彈性。

Athena Snowflake 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行期。

### LIMIT 子句
<a name="connectors-snowflake-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-snowflake-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Snowflake 連接器可以合併這些表達式，並將其直接推送至 Snowflake，以增強功能並減少掃描的資料量。

下列 Athena Snowflake 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-snowflake-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

# 使用 Snowflake 進行身分驗證
<a name="connectors-snowflake-authentication"></a>

您可以設定 Amazon Athena Snowflake 連接器，讓其使用金鑰對身分驗證或 OAuth 身分驗證方法來連線至 Snowflake 資料倉儲。這兩種方法都能安全存取 Snowflake，而無需在連線字串中存放密碼。
+ **金鑰對身分驗證** – 此方法使用 RSA 公有或私有金鑰對，以進行 Snowflake 的身分驗證。當對應的公有金鑰在 Snowflake 中註冊以進行驗證時，私有金鑰會以數位方式簽署身分驗證請求。此方法無需密碼儲存。
+ **OAuth 身分驗證** –此方法使用授權權杖和重新整理權杖，以進行 Snowflake 的身分驗證。此方法支援自動權杖重新整理，因此適用於長時間執行的應用程式。

如需詳細資訊，請參閱《Snowflake 使用者指南》中的[金鑰對身分驗證](https://docs.snowflake.com/en/user-guide/key-pair-auth)和 [OAuth 身分驗證](https://docs.snowflake.com/en/user-guide/oauth-custom)。

## 先決條件
<a name="connectors-snowflake-authentication-prerequisites"></a>

開始之前，請先完成以下先決條件：
+ 擁有管理權限的 Snowflake 帳戶存取。
+ 專屬於 Athena 連接器的 Snowflake 使用者帳戶。
+ OpenSSL 或同等金鑰產生工具，以進行金鑰對身份驗證。
+ AWS Secrets Manager 建立和管理秘密的存取權。
+ Web 瀏覽器，以完成進行 OAuth 身分驗證的 OAuth 流程。

## 設定金鑰對身分驗證
<a name="connectors-snowflake-keypair-authentication"></a>

此程序包括產生 RSA 金鑰對、使用公有金鑰設定 Snowflake 帳戶，以及將私有金鑰安全地存放在 AWS Secrets Manager中。下列步驟將引導您建立密碼編譯金鑰、設定必要的 Snowflake 許可，以及設定 AWS 登入資料以進行無縫身分驗證。

1. **產生 RSA 金鑰對**

   使用 OpenSSL 產生私有和公有金鑰對。
   + 若要產生未加密版本，請在本機命令列應用程式中使用下列命令。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
     ```
   + 若要產生加密版本，請使用下列命令，而這會省略 `-nocrypt`。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
     ```
   + 從私有金鑰產生公有金鑰。

     ```
     openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
     # Set appropriate permissions (Unix/Linux)
     chmod 600 rsa_key.p8
     chmod 644 rsa_key.pub
     ```
**注意**  
請勿共用您的私有金鑰。只有需要進行 Snowflake 身分驗證的應用程式才能存取私有金鑰。

1. **擷取 Snowflake 的公有金鑰內容 (不含分隔符號)**

   ```
   # Extract public key content (remove BEGIN/END lines and newlines)
   cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'
   ```

   儲存此輸出，因為您在後續步驟中需要此輸出。

1. **設定 Snowflake 使用者**

   依照以下步驟，設定 Snowflake 使用者。

   1. 如果 Athena 連接器尚未存在，請為其建立專用使用者。

      ```
      -- Create user for Athena connector
      CREATE USER athena_connector_user;
      
      -- Grant necessary privileges
      GRANT USAGE ON WAREHOUSE your_warehouse TO ROLE athena_connector_role;
      GRANT USAGE ON DATABASE your_database TO ROLE athena_connector_role;
      GRANT SELECT ON ALL TABLES IN DATABASE your_database TO ROLE athena_connector_role;
      ```

   1. 授予身分驗證權限。若要將公有金鑰指派給使用者，您必須擁有下列其中一個角色或權限。
      + 使用者的 `MODIFY PROGRAMMATIC AUTHENTICATION METHODS` 或 `OWNERSHIP` 權限。
      + `SECURITYADMIN` 角色或更高權限。

      授予必要權限，以使用下列命令指派公有金鑰。

      ```
      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER athena_connector_user TO ROLE your_admin_role;
      ```

   1. 使用下列命令，將公有金鑰指派給 Snowflake 使用者。

      ```
      ALTER USER athena_connector_user SET RSA_PUBLIC_KEY='RSAkey';
      ```

      使用以下命令，驗證公有金鑰是否已成功指派給使用者。

      ```
      DESC USER athena_connector_user;
      ```

1. **在 中存放私有金鑰 AWS Secrets Manager**

   1. 將您的私有金鑰轉換為連接器所需的格式。

      ```
      # Read private key content
      cat rsa_key.p8
      ```

   1.  AWS Secrets Manager 使用下列結構在 中建立秘密。

      ```
      {
        "sfUser": "your_snowflake_user",
        "pem_private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----",
        "pem_private_key_passphrase": "passphrase_in_case_of_encrypted_private_key(optional)"
      }
      ```
**注意**  
標頭和頁尾為選用項。
私有金鑰必須以 `\n` 分隔。

## 設定 OAuth 身分驗證
<a name="connectors-snowflake-oauth-authentication"></a>

此身分驗證方法可利用自動憑證重新整理功能，啟用對 Snowflake 的安全權杖型存取。組態程序包括在 Snowflake 中建立安全整合、擷取 OAuth 用戶端憑證、完成授權流程以取得存取碼，以及將 OAuth 憑證存放在 AWS Secrets Manager 中以供連接器使用。

1. **在 Snowflake 中建立安全整合**

   在 Snowflake 中執行下列 SQL 命令，以建立 Snowflake OAuth 安全整合。

   ```
   CREATE SECURITY INTEGRATION my_snowflake_oauth_integration_a
     TYPE = OAUTH
     ENABLED = TRUE
     OAUTH_CLIENT = CUSTOM
     OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
     OAUTH_REDIRECT_URI = 'https://localhost:8080/oauth/callback'
     OAUTH_ISSUE_REFRESH_TOKENS = TRUE
     OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;
   ```

   **組態參數**
   + `TYPE = OAUTH` – 指定 OAuth 身分驗證類型。
   + `ENABLED = TRUE` – 啟用安全整合。
   + `OAUTH_CLIENT = CUSTOM` – 使用自訂 OAuth 用戶端組態。
   + `OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'` – 設定安全應用程式的用戶端類型。
   + `OAUTH_REDIRECT_URI` – OAuth 流程的回呼 URL。其可設為 localhost 以用於測試。
   + `OAUTH_ISSUE_REFRESH_TOKENS = TRUE` – 啟用重新整理權杖產生。
   + `OAUTH_REFRESH_TOKEN_VALIDITY = 7776000` – 設定重新整理權杖有效性 (90 天，以秒為單位)。

1. **擷取 OAuth 用戶端秘密**

   1. 請執行下列 SQL 命令，以取得用戶端憑證。

      ```
      DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A';
      ```

   1. 擷取 OAuth 用戶端秘密。

      ```
      SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('MY_SNOWFLAKE_OAUTH_INTEGRATION_A');
      ```

      **回應範例**

      ```
      {
        "OAUTH_CLIENT_SECRET_2": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "OAUTH_CLIENT_SECRET": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY,
        "OAUTH_CLIENT_ID": "AIDACKCEVSQ6C2EXAMPLE"
      }
      ```
**注意**  
保護這些憑證的安全，切勿共用。這些將用於設定 OAuth 用戶端。

1. **授權使用者並擷取授權碼**

   1. 在瀏覽器中開啟下列 URL。

      ```
      https://<your_account>.snowflakecomputing.com/oauth/authorize?client_id=<OAUTH_CLIENT_ID>&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
      ```

   1. 完成授權流程。

      1. 使用您的 Snowflake 憑證登入。

      1. 授予所需的許可。您會被重新導向至具有授權碼的回呼 URI。

   1. 從重新導向 URL 複製程式碼參數，擷取授權碼。

      ```
      https://localhost:8080/oauth/callback?code=<authorizationcode>
      ```
**注意**  
授權碼有效期限有限，且只能使用一次。

1. **在 中存放 OAuth 登入資料 AWS Secrets Manager**

    AWS Secrets Manager 使用下列結構在 中建立秘密。

   ```
   {
     "redirect_uri": "https://localhost:8080/oauth/callback",
     "client_secret": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY",
     "token_url": "https://<your_account>.snowflakecomputing.com/oauth/token-request",
     "client_id": "AIDACKCEVSQ6C2EXAMPLE,
     "username": "your_snowflake_username",
     "auth_code": "authorizationcode"
   }
   ```

   **必要欄位**
   + `redirect_uri` – 您從步驟 1 取得的 OAuth 重新導向 URI。
   + `client_secret` – 您從步驟 2 取得的 OAuth 用戶端秘密。
   + `token_url` – Snowflake OAuth 權杖端點。
   + `client_id` – 從步驟 2 取得的 OAuth 用戶端 ID。
   + `username` – 連接器的 Snowflake 使用者名稱。
   + `auth_code` – 您從步驟 3 取得的授權碼。

建立秘密後，您即會取得秘密 ARN，並且您可以在[建立資料來源連線](connect-to-a-data-source.md)時，於 Glue 連線中使用該 ARN。

## 傳遞查詢
<a name="connectors-snowflake-passthrough-queries"></a>

Snowflake 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Snowflake 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Snowflake 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-snowflake-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-snowflake/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-snowflake/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-snowflake-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Snowflake 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-snowflake/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-snowflake)。