API ゲートウェイからの HTTP 403 エラーをトラブルシューティングする方法を教えてください。

所要時間4分
0

Amazon API Gateway API を呼び出すと、403 エラーが表示されます。

簡単な説明

クライアントが有効な URL にアクセスできない場合、HTTP 403 応答コードが返されます。サーバーはリクエストを理解していますが、クライアント側の問題が原因で、サーバーがリクエストに対応できません。
API Gateway API が 403 レスポンスを返す要因を次に示します。

問題レスポンスヘッダーエラーメッセージ根本原因
アクセス拒否"x-amzn-errortype" = "AccessDeniedException"「明示的に拒否されているため、ユーザーはこのリソースにアクセスできません」呼び出し元には、API Gateway Lambda オーソライザーを使用している API にアクセスする権限がありません。
アクセス拒否"x-amzn-errortype" = "AccessDeniedException"「ユーザー: <user-arn> execute-api:呼び出しをリソースで実行することが認められていません: <api-resource-arn> 明示的な拒否が発生」呼び出し元には、AWS Identity and Access Management (IAM) 認証を使用する API へのアクセスが許可されていません。または、API に、呼び出し元へのアクセスを明示的に拒否するリソースポリシーがアタッチされています。詳細については、「IAM 認証とリソースポリシー」を参照してください。
アクセス拒否"x-amzn-errortype" = "AccessDeniedException""User: anonymous is not authorized to perform: execute-api:Invoke on resource:<api-resource-arn>呼び出し元には、IAM 認証を使用する API へのアクセスが許可されていません。または、API に、呼び出し元が API を呼び出すことを明示的に許可していないリソースポリシーがアタッチされています。詳細については、「IAM 認証とリソースポリシー」を参照してください。
アクセス拒否"x-amzn-errortype" = "AccessDeniedException"「リクエストに含まれるセキュリティトークンが無効です。」呼び出し元が、IAM 認証 を使用する API へのアクセスで無効な IAM キーを使用しました。
認証トークンの欠落"x-amzn-errortype" = "MissingAuthenticationTokenException"「認証トークンが見つかりません」リクエストに認証トークンが見つかりませんでした。
認証トークンの有効期限が切れました"x-amzn-errortype" = "InvalidSignatureException"「署名の有効期限が切れています」リクエストの認証トークンの有効期限が切れています。
無効な API キー"x-amzn-errortype" = "ForbiddenException"「禁止」呼び出し元が API キーを必要とするメソッドに対して API キーを使用しましたが、その API キーが正しくありません。または、API キーがステージに関連付けられている使用量プランに関連付けられていません。または、API キーが無効になっているか、存在しません。
無効な署名"x-amzn-errortype" = "InvalidSignatureException"「計算したリクエストの署名が、提供された署名と一致しません。AWS シークレットアクセスキーと署名方法を確認してください」呼び出し側が IAM 認証を使用する API にアクセスするときの、リクエストの署名がサーバー上の署名と一致しません。
AWS WAF によるフィルタリング"x-amzn-errortype" = "ForbiddenException"「禁止」API で AWS WAF をアクティブにするときに、リクエストがウェブアプリケーションファイアウォールのフィルタリングによってブロックされています。
リソースパスが存在しない"x-amzn-errortype" = "MissingAuthenticationTokenException"「認証トークンが見つかりません」"Authorization" ヘッダーのないリクエストが、存在しない API リソースパスに送信されています。詳細については、「API Gateway REST API エンドポイントの 403 エラー Missing Authentication Token (認証トークンの欠落) に関連するエラーをトラブルシューティングする方法を教えてください」を参照してください。
リソースパスが存在しない"x-amzn-errortype" = "IncompleteSignatureException"『認証ヘッダーには 'Credential' パラメーターが必要です。認証ヘッダーには 'Signature' パラメーターが必要です。認証ヘッダーには 'SignedHeaders' パラメーターが必要です。認証ヘッダーには 'X-Amz-Date' または 'Date' ヘッダーが必要です。Authorization=allow""Authorization" ヘッダーがあるリクエストが、存在しない API リソースパスに送信されています。
プライベート API を呼び出すためのパブリック DNS 名の使用方法に誤りがある"x-amzn-errortype" = "ForbiddenException"「禁止」Amazon Virtual Private Cloud (Amazon VPC) 内からプライベート API を呼び出すためのパブリック DNS 名の使用方法に誤りがあります。例: リクエストに Host または x-apigw-api-id ヘッダーがない場合。詳細については、「エンドポイント固有のパブリック DNS ホスト名 を使用してプライベート API を呼び出す」を参照してください。
デフォルトの execute-api エンドポイントを使用して、カスタムドメイン名を持つ REST API を呼び出している"x-amzn-errortype" = "ForbiddenException"「禁止」デフォルトのエンドポイントを無効にすると、呼び出し元はデフォルトの execute-api エンドポイントを使用して REST API を呼び出します。詳細については、「REST API でデフォルトエンドポイントを無効にする」を参照してください。
無効なクライアント証明書を使用して、相互 TLS を必要とする API Gateway カスタムドメイン名を呼び出している"x-amzn-errortype" = "ForbiddenException"「禁止」カスタムドメイン名のトラストストアが API リクエストに含まれるクライアント証明書を発行していないか、証明書が無効です。詳細については、「相互 TLS を必要とする API Gateway カスタムドメイン名からの HTTP 403 Forbidden エラーをトラブルシューティングする方法を教えてください」を参照してください。
ベースパスマッピングなしでの、カスタムドメイン名の呼び出し"x-amzn-errortype" = "ForbiddenException"「禁止」呼び出し側はカスタムドメインを呼び出しており、ベースパスが API にマップされていません。詳細については、「API Gateway での REST API のカスタムドメイン名」を参照してください。
ドメイン URL にステージが含まれている場合の、カスタムドメインを有効にした API の呼び出し"x-amzn-errortype" = "MissingAuthenticationTokenException"「認証トークンが見つかりません」API マッピングでは、API、ステージ、およびマッピングに使用するオプションパスを指定します。そのため、API のステージをカスタムドメインにマッピングするときに、URL にステージを含める必要はありません。詳細については、「API ステージを REST API のカスタムドメイン名にマッピングする」を参照してください。
無効なリクエスト URL のステージ"x-amzn-errortype" = "ForbiddenException"「禁止」呼び出し元のリクエスト URL に、存在しないステージが含まれています。詳細については、「API Gateway で REST API を呼び出す」を参照してください。

解決策

エラーの原因を特定する

次の例のように、他のリソースから 403 エラーが報告された場合は、エラーの原因が他にある可能性があります。

  • ウェブブラウザでエラーが報告された場合、プロキシ設定の誤りが原因で、HTTP アクセスが許可されていない可能性があります。
  • API の前に別の AWS サービス (Amazon CloudFront など) がある場合、そのサービスがリクエストを拒否している場合があります。

エラーの原因を特定するには、API に Amazon CloudWatch アクセスログ記録を設定します。次に、CloudWatch で API のログイベントを確認し、リクエストが API に到達しているかどうかを判断します。

注: HTTP API は実行ログをサポートしていません

相互 TLS を必要とし、HTTP APIを呼び出すカスタムドメイン名によって返される 403 エラーをトラブルシューティングするには、次のステップを実行します。

  1. 新しい API マッピングを作成して、カスタムドメイン名の REST API 呼び出しをテストします。
  2. エラーの原因を特定するには、CloudWatch で REST API のログイベントを確認します。
  3. エラーを特定して解決したら、API マッピングを HTTP API に再ルーティングします。

要求されたリソースが API 定義に存在することを確認する

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

API Gateway コンソールまたは AWS CLI を使用して、次の設定を確認します。

  • API が最新の API 定義でデプロイされている。
  • 要求されたリソースが API 定義に存在する。

curl でリクエストとレスポンスの詳細を取得する

エラーを再現できる場合は、curl-v コマンドを使用するとクライアントと API 間の詳細情報を取得できます。

curl -X HTTP_VERB -v https://{api_id}.execute-api.{region}.amazonaws.com/{stage_name}/{resource_name}

リクエストヘッダーが正しいことを確認する

無効な API キーがエラーの原因である場合は、リクエストで "x-api-key" ヘッダーが送信されたことを確認してください。そのヘッダーが含まれていないか、正しくない場合は、リクエストヘッダーを更新してください。

すべてのインターフェイス Amazon VPC エンドポイントで、DNS 設定が正しく設定されていることを確認してください。

注: 次のタスクは、インターフェイス VPC エンドポイントのみを持つ Amazon VPC から呼び出す API に適用されます。

インターフェイスエンドポイントの DNS 設定が、使用する API のタイプに基づいて正しく設定されていることを確認します。

Amazon VPC 内からリージョン API を呼び出すには、インターフェイスエンドポイントでプライベート DNS 名を無効にする必要があります。こうすることで、パブリック DNS がエンドポイントのホスト名を解決できます。詳細については、「プライベート API を作成する」を参照してください。

API のプライベート DNS 名を使用して Amazon VPC 内からプライベート API を呼び出すには、エンドポイントでプライベート DNS 名を有効にします。こうすることで、Amazon VPC ローカルサブネットリソースは、インターフェイスエンドポイントのホスト名を解決できます。

注: 次のオプションのいずれかによってプライベート API を呼び出す場合、プライベート API のパブリック DNS 名Amazon Route 53 エイリアスを設定する必要はありません。

API のリソースポリシーを確認する

API のリソースポリシーで、次の設定を確認します。

HTTP リクエストとレスポンスメッセージを確認する

ウェブブラウザでエラーを再現します。ブラウザのネットワークツールで HTTP リクエストメッセージとレスポンスメッセージを取得し、それらを分析してエラーが発生した場所を特定します。

**注:**オフライン分析では、HTTP アーカイブ (HAR) ファイルにメッセージを保存します。

関連情報

よくあるエラー

特定の IP アドレスのみが API Gateway REST API にアクセスできるようにする方法を教えてください

API Gateway プライベート API エンドポイントへの接続時に発生した問題をトラブルシューティングする方法を教えてください

API Gateway REST API または WebSocket API のトラブルシューティング用に CloudWatch Logs を有効にする方法を教えてください

Curl プロジェクト (curl のウェブサイト)

コメントはありません

関連するコンテンツ