

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# 簽署 HTTP 請求
<a name="amazon-redshift-signing-requests"></a>

Amazon Redshift 要求您傳送至管理 API 的每個請求都必須經過簽章驗證。本主題將說明如何簽署請求。

如果您使用的是其中一個AWS軟體開發套件 (SDKs) 或 AWS Command Line Interface，系統會自動處理請求簽署，您可以略過本節。如需使用 AWSSDKs的詳細資訊，請參閱 [使用佈建叢集的 Amazon Redshift 管理介面](using-aws-sdk.md)。如需使用 Amazon Redshift 命令列界面的相關資訊，請前往 [Amazon Redshift 命令列參考](https://docs.aws.amazon.com/cli/latest/reference/redshift/index.html)。

若要簽署請求，請使用加密雜湊函數來計算數位簽章。加密雜湊是一個函數，其根據輸入傳回一個唯一的雜湊值。此雜湊函數的輸入包含請求和私密存取金鑰 (可從暫時憑證取得) 的文字。雜湊函數會傳回一個雜湊值，您將此值包含在請求中做為簽章。該簽章是請求 `Authorization` 標頭中的一部分。

**注意**  
如果使用者想要與 AWS外部互動，則需要程式設計存取AWS 管理主控台。授予程式設計存取權的方式取決於正在存取的使用者類型AWS。  
若要授予使用者程式設計存取權，請選擇下列其中一個選項。  


****  

| 哪個使用者需要程式設計存取權？ | 到 | 根據 | 
| --- | --- | --- | 
| IAM | （建議） 使用主控台登入資料做為臨時登入資料，以簽署對 AWS CLI、AWSSDKs程式設計請求。AWSAPIs |  請依照您要使用的介面所提供的指示操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 
|  人力資源身分 (IAM Identity Center 中管理的使用者)  | 使用暫時登入資料簽署對 AWS CLI、AWSSDKs程式設計請求。 AWSAPIs |  請依照您要使用的介面所提供的指示操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 
| IAM | 使用暫時登入資料簽署對 AWS CLI、AWSSDKs程式設計請求。 AWSAPIs | 遵循《IAM 使用者指南》中[將臨時登入資料與AWS資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)搭配使用的指示。 | 
| IAM | (不建議使用)使用長期登入資料來簽署對 AWS CLI、AWSSDKs程式設計請求。AWSAPIs |  請依照您要使用的介面所提供的指示操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 

Amazon Redshift 收到請求後，其會使用您原先用來簽署請求的相同雜湊函數與輸入來重新計算簽章。若產生的簽章與請求中的簽章相符，Amazon Redshift 會處理該請求，否則請求會遭到拒絕。

Amazon Redshift 支援使用 [AWS Signature 第 4 版](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)進行身分驗證。計算簽章的程序由三個任務組成。這些任務如下圖說明。
+   [任務 1：建立標準請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#create-canonical-request)

  將 HTTP 請求重新編排為正式格式。必須使用正式格式，因為 Amazon Redshift 在比較您傳送的簽章來建立簽章時會使用相同的正式格式。
+   [任務 2：建立登入字串](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#create-string-to-sign)

  建立一個字串，您會使用此字串做為密碼編譯雜湊函數的其中一個輸入值。此字串，稱為*登入字串*，是雜湊演算法的名稱、請求日期、*登入資料範圍*字串和前一個任務的正式請求的串連。*登入資料範圍*字串本身是日期、區域和服務資訊的串連。
+   [任務 3：計算簽章](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#calculate-signature)

  使用接受兩個輸入字串的密碼編譯雜湊函數來計算請求的簽章：您的登入字串和*衍生金鑰*。藉由從您的私密存取金鑰開始來計算此衍生金鑰和使用登入資料範圍字串來建立一系列雜湊型訊息身分驗證代碼 (HMAC-SHA256)。

## 範例簽章計算
<a name="example-signature-calculation"></a>

下列範例會逐步解說如何建立 [CreateCluster](https://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateCluster.html) 請求之簽章的詳細資訊。您可以使用此範例做為檢查自身簽章計算方法的參考。其他參考計算包含在《IAM 使用者指南》的[請求簽章範例章節](https://docs.aws.amazon.com/IAM/latest/UserGuide/signature-v4-examples.html)中。

您可以使用 GET 或 POST 請求，將請求傳送至 Amazon Redshift。此兩者的差異在於，若是 GET 要求，會以查詢字串參數的形式來傳送您的參數。若是 POST 請求，它們會包含在請求的內文中。下列範例說明 POST 請求。

該範例假設如下：
+ 請求的時間戳記為 `Fri, 07 Dec 2012 00:00:00 GMT`。
+ 端點是美國東部 (維吉尼亞北部) 區域 (`us-east-1`)。

一般的請求語法是：

```
https://redshift.us-east-1.amazonaws.com/
   ?Action=CreateCluster
   &ClusterIdentifier=examplecluster
   &MasterUsername=masteruser
   &MasterUserPassword=12345678Aa
   &NumberOfNode=2
   &NodeType=dc2.large
   &Version=2012-12-01
   &x-amz-algorithm=AWS4-HMAC-SHA256
   &x-amz-credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request
   &x-amz-date=20121207T000000Z
   &x-amz-signedheaders=content-type;host;x-amz-date
```

對於[任務1：建立正式請求](#SignatureCalculationTask1)計算的請求的正式形式是：

```
POST
/

content-type:application/x-www-form-urlencoded; charset=utf-8
host:redshift.us-east-1.amazonaws.com
x-amz-date:20121207T000000Z

content-type;host;x-amz-date
55141b5d2aff6042ccd9d2af808fdf95ac78255e25b823d2dbd720226de1625d
```

正式請求的最後一行是請求內文的雜湊值。正式請求中的第三行是空的，因為此 API 沒有查詢參數。

「[任務 2：建立登入字串](#SignatureCalculationTask2)」的登入字串是：

```
AWS4-HMAC-SHA256
20121207T000000Z
20121207/us-east-1/redshift/aws4_request
06b6bef4f4f060a5558b60c627cc6c5b5b5a959b9902b5ac2187be80cbac0714
```

*登入字串*的第一行是演算法，第二行是時間戳記，第三行是*登入資料範圍*，最後一行是來自[任務 1：建立正式請求](#SignatureCalculationTask1)的正式請求的雜湊。在憑證範圍內使用的服務名稱是 `redshift`。

對於[任務 3：計算簽章](#SignatureCalculationTask3)，衍生金鑰可以表示為：

```
derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20121207"),"us-east-1"),"redshift"),"aws4_request")
```

衍生金鑰是以湊雜函數的方式計算。從上述公式中的內部 HMAC 陳述式開始，您可以串連片語 **AWS4** 與私密存取金鑰並使用此做為金鑰來對資料 "us-east-1" 進行雜湊。此雜湊的結果都會變成下一個雜湊函數的金鑰。

在計算衍生金鑰後，您會在雜湊函數中使用它，該函數會接受兩個輸入字串：您的登入字串和衍生金鑰。例如，如果您使用私密存取金鑰 `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` 和先前提供的登入字串，則已計算的簽章如下：

```
9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920
```

最後步驟是建立 `Authorization` 標頭。對於示範存取金鑰 `AKIAIOSFODNN7EXAMPLE`，標頭 (為了可讀性而新增了換行) 是：

```
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request, 
SignedHeaders=content-type;host;x-amz-date, 
Signature=9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920
```