スキップしてコンテンツを表示

API Gateway への IAM 認証で SigV4 署名付きリクエストを行う際の署名不一致エラーのトラブルシューティング方法を教えてください。

所要時間3分
0

AWS Identity and Access Management (IAM) 認証を使用して Amazon API Gateway に対して Signature Version 4 (SigV4) 署名付きリクエストを行うと、403 エラーが発生します。

解決策

IAM 認証を使用する API Gateway エンドポイントは、いくつかの理由により 403 エラーを返します。次のセクションを使用して、受信したエラーメッセージに基づいて原因を特定し、エラーを解決します。

IAM 認証を確認する

IAM 認証を使用する API リクエストが SigV4 で署名されていることを確認します。リクエストに署名するには、SigV4 署名プロセスに従ってください。API リクエストが署名されていない場合、次のエラーが表示されます。

"Missing Authentication Token."

このエラーを解決するには、不足している署名を追加してリクエストを再送信してください。

IAM 認証情報を確認する

アクセスキーとシークレットキーが正しいことを確認します。認証情報を確認するには、次の手順を実行します。

  1. IAM コンソールを開く。
  2. ナビゲーションペインで [Users] (ユーザー) を選択する。
  3. 該当するユーザーを選択する。
  4. [Security credentials] (セキュリティ認証情報) タブを選択して、アクセスキーを確認する。

アクセスキーが正しくない場合は、次のエラーが表示されます。

"The security token included in the request is invalid."

このエラーを解決するには、リクエストの署名に使用された IAM エンティティに execute-api:Invoke アクセス許可があることを確認してください。アクセス許可を追加するには、execute-api:Invoke アクションを含む IAM ポリシーを IAM エンティティにアタッチしてください。ポリシーの例については、『API 実行アクセス許可の IAM ポリシーの例』を参照してください。

execute-api:Invoke アクセス許可が不足している場合、リクエストは次のエラーで失敗します。

<region><api-id>"User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api::xxxxxxxxxxxx:/stage/method/path because no identity-based policy allows the execute-api:Invoke action."

署名の不一致の解決

**注: ** AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行時にエラーが発生する場合は、『AWS CLI のエラーのトラブルシューティング』を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

シークレットアクセスキーが正しくない場合は、次のエラーが表示されます。

"The request signature we calculated does not match the signature you provided."

シークレットアクセスキーとアクセスキーはペアになっています。シークレットアクセスキーとアクセスキーを検証し、署名プロセス中の潜在的な問題を切り分けるには、curl コマンドを使用してリクエストをテストしてください。

IAM ユーザーの場合は、次の curl コマンドを実行します。

curl -v --aws-sigv4 'aws:amz:REGION:execute-api' --user 'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY' API_Gateway_endpoint

**注: ** REGION を AWS リージョンに置き換えてください。AWS_ACCESS_KEY_ID を IAM ユーザーのアクセスキー ID に置き換えてください。AWS_SECRET_ACCESS_KEY を IAM ユーザーのシークレットアクセスキーに置き換えてください。API_Gateway_endpoint を API Gateway エンドポイント URL に置き換えてください。

IAM ロールの場合は、まず次の AWS CLI コマンド assume-role を実行して一時認証情報を取得してください。

aws sts assume-role --role-arn ROLE_ARN --role-session-name SESSION_NAME

**注: ** ROLE_ARN を引き継げる IAM ロールの Amazon リソースネーム (ARN) に置き換えてください。SESSION_NAME をセッションを識別するための名前に置き換えてください。

次に、前のアクションで返された一時認証情報を使用して、次のコマンドを実行してください。

curl -v --aws-sigv4 'aws:amz:REGION:execute-api' --user 'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY' --header "x-amz-security-token: AWS_SESSION_TOKEN" API_Gateway_endpoint

**注: ** REGION を AWS リージョンに置き換えてください。AWS_ACCESS_KEY_ID を assume-role 出力のアクセスキー ID に置き換えてください。AWS_SECRET_ACCESS_KEY を assume-role 出力のシークレットアクセスキーに置き換えてください。AWS_SESSION_TOKEN を assume-role 出力のセッショントークンに置き換えてください。API_Gateway_endpoint を API Gateway エンドポイント URL に置き換えてください。

API Gateway は署名付きリクエストを受信すると、署名を再計算します。リクエストパラメータまたはペイロードが元の署名を生成したものと異なる場合、API Gateway は異なる結果を得ます。

署名プロセスから取得した正規リクエストおよび署名対象の文字列を、エラーメッセージで返された値と比較します。相違点がある場合は、署名プロセスを変更してください。署名プロセスの修正に関するガイダンスについては、『AWS API リクエストの Signature Version 4 署名をトラブルシューティングする』を参照してください。

正規リクエストとエラーメッセージで返された値の比較について、次の例を参照してください。

GET                                                      -------- HTTP method
/                                                        -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path}
                                                         -------- Query string key-value pair. Leave it blank if the request doesn't have any query string
content-type:application/json                            -------- Header key-value pair. One header per line
host:0123456789.execute-api.us-east-1.amazonaws.com      -------- Host and x-amz-date are required headers for all signed requests
x-amz-date:20220806T024003Z
content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- Hash of the payload

次は正規エラーレスポンスの例です。

<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
=AKIAIOSFODNN7EXAMPLE%2F20120223%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host
host:iam.amazonaws.com
host
<hashed-value>'
The String-to-Sign should have been
'AWS4-HMAC-SHA256
20120223T063000Z
20120223/us-east-1/iam/aws4_request
<hashed-value>'
</Message>
  </Error>
  <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId>
</ErrorResponse>

**注: ** API Gateway ヘッダーでは、host ヘッダーと x-amz-date ヘッダーのみが必須です。

API リクエストヘッダーの修正

SigV4 認可ヘッダーの形式が正しいことを確認します。ヘッダーは次のようになっている必要があります。

Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,
SignedHeaders=host;range;x-amz-date,
Signature=example-generated-signature

形式が正しくないか、パラメータが欠落している場合は、署名コードの認可ヘッダーを更新して、次のパラメータを含めてください。

  • Credential
  • SignedHeaders
  • Signature

パラメータが欠落しているか正しくない場合、次のエラーが発生します。

  • "Authorization header requires 'Credential' parameter."
  • "Authorization header requires 'Signature' parameter."
  • "Authorization header requires 'SignedHeaders' parameter."

SigV4 認可リクエストにリクエストの日付が含まれていることを確認してください。日付を追加するには、HTTP Date ヘッダーまたは x-amz-date ヘッダーのいずれかをリクエストに含めてください。詳細については、『署名付き AWS API リクエストを作成する』を参照してください。date ヘッダーが欠落している場合、次のエラーが表示されます。

"Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header."

AWS公式更新しました 6ヶ月前
1コメント

This article was reviewed and updated on 2026-02-27.

エキスパート

応答済み 6日前

関連するコンテンツ