

 Amazon Redshift は、パッチ 198 以降、新しい 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 SDK の使用方法の詳細については、「[プロビジョニングされたクラスター用の Amazon Redshift 管理インターフェイスの使用](using-aws-sdk.md)」を参照してください。Amazon Redshift Command Line Interface の使用に関する詳細については、[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/ja_jp/redshift/latest/mgmt/amazon-redshift-signing-requests.html)  | 
|  ワークフォースアイデンティティ (IAM アイデンティティセンターで管理されているユーザー)  | 一時的な認証情報を使用して、AWS CLI、AWS SDK、または AWS API へのプログラムによるリクエストに署名します。 |  使用するインターフェイスの指示に従ってください。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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/ja_jp/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) を使用した認証がサポートされています。署名を計算するプロセスは 3 つのタスクで構成されます。これらのタスクをこの後の例に示します。
+   [タスク 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)

  暗号化ハッシュ関数への入力値の 1 つとして使用する文字列を作成します。*署名文字列*と呼ばれる文字列は、ハッシュアルゴリズムの名前、要求日付、*認証情報スコープ*の文字列、および前のタスクで正規化されたリクエストを結合したものです。*認証情報スコープ*の文字列自体は、日付、リージョン、およびサービス情報を結合したものです。
+   [タスク 3: 署名を計算する](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#calculate-signature)

  2 つの入力文字列 (署名文字列と*派生キー*) を受け取る暗号化ハッシュ関数を使用して、リクエストの署名を計算します。シークレットアクセスキーから、認証情報スコープの文字列を使用して一連のハッシュベースのメッセージ認証コード (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 に送信できます。この 2 つの違いとして、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 にはクエリパラメータがないため、正規リクエストの 3 行目は空です。

「[タスク 2: 署名する文字列を作成する](#SignatureCalculationTask2)」で署名する文字列は次のとおりです。

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

*署名する文字列*の最初の行はアルゴリズム、2 行目はタイムスタンプ、3 行目は*認証情報スコープ*、最後の行は「[タスク 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」データをハッシュします。このハッシュの結果が次のハッシュ関数のキーになります。

派生キーを計算した後、署名する文字列と派生キーという 2 つの入力文字列を受け取るハッシュ関数でそのキーを使用します。例えば、シークレットアクセスキー `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
```