

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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 开发工具包 (SDK) 之一或 AWS Command Line Interface，将自动为请求签名，因此您可以跳过本节。有关如何使用 AWS 开发工具包的更多信息，请参阅[使用预置集群的 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、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 
|  人力身份 （在 IAM Identity Center 中管理的用户）  | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 
| IAM | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 | 按照《IAM 用户指南》中[将临时凭证用于 AWS 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)中的说明进行操作。 | 
| IAM | （不推荐使用）使用长期凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 

Amazon Redshift 收到您的请求后，它将使用您在为请求签名时使用的相同哈希函数和输入来重新计算签名。如果得出的签名与请求中的签名相匹配，Amazon Redshift 会处理请求；否则请求将被拒绝。

Amazon Redshift 支持使用 [AWS 签名版本 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
```