API Gateway からの HTTP 403 エラーをトラブルシューティングする方法を教えてください。
Amazon API Gateway API を呼び出すと、403 エラーが表示されます。
簡単な説明
クライアントが有効な URL にアクセスできない場合、"HTTP 403" ステータスコードエラーが表示されます。サーバーは要求を理解しますが、クライアント側の問題によりサーバーは要求を処理できません。
API Gateway API は、次の理由により "HTTP 403" エラーを返す場合があります。
| 問題 | レスポンスヘッダー | エラーメッセージ | 根本原因 |
| アクセス拒否 | "x-amzn-errortype" = "AccessDeniedException" | "User is not authorized to access this resource with an explicit deny in an identity-based policy" | API が使用する API Gateway Lambda オーソライザーが、呼び出し元を認証しません。 |
| アクセス拒否 | "x-amzn-errortype" = "AccessDeniedException" | "User: user-arn is not authorized to perform: execute-api:Invoke on resource: api-resource-arn with an explicit deny" | API が使用する AWS Identity and Access Management (IAM) 認証が、呼び出し元を承認しません。または、API にアタッチされているリソースポリシーが、呼び出し元へのアクセスを明示的に拒否しています。詳細については、「IAM 認証とリソースポリシー」を参照してください。 |
| アクセス拒否 | "x-amzn-errortype" = "AccessDeniedException" | "User: anonymous is not authorized to perform: execute-api:Invoke on resource:api-resource-arn" | API が使用する IAM 認証が、呼び出し元を認証しません。または、API にアタッチされているリソースポリシーが、呼び出し元が API を呼び出すことを明示的に許可していません。詳細については、「IAM 認証とリソースポリシー」を参照してください。 |
| アクセス拒否 | "x-amzn-errortype" = "AccessDeniedException" | "The security token included in the request is invalid." | 呼び出し元が、IAM 認証を使用する API へのアクセスで無効な IAM キーを使用しました。 |
| API キーが無効 | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | 呼び出し元が、API キーを必要とするメソッドに対して正しくない API キーを使用しました。または、ステージに接続する使用量プランに API キーを関連付けていません。または、API キーをオフにしたか、キーが存在しません。 |
| AWS WAF によるフィルタリング | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | API で AWS WAF をアクティブにするときに、リクエストがウェブアプリケーションファイアウォールのフィルタリングによってブロックされています。 |
| プライベート API を呼び出すためのパブリック DNS 名の使用方法に誤りがある | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | Amazon Virtual Private Cloud (Amazon VPC) 内からプライベート API を呼び出すためのパブリック DNS 名の使用方法に誤りがあります。例: リクエストに Host または x-apigw-api-id ヘッダーがない場合。詳細については、「エンドポイント固有のパブリック DNS ホスト名 を使用してプライベート API を呼び出す」を参照してください。 |
| ベースパスマッピングなしでの、カスタムドメイン名の呼び出し | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | 呼び出し側はカスタムドメインを呼び出しており、ベースパスが API にマップされていません。詳細については、「API Gateway での パブリック REST API のカスタムドメイン名」を参照してください。 |
| プライベートカスタムドメイン名を呼び出している | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | プライベートカスタムドメイン名が VPC エンドポイントに関連付けられていません。 |
| リクエスト URL のステージが無効 | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | 呼び出し元のリクエスト URL に、存在しないステージが含まれています。詳細については、「API Gateway で REST API を呼び出す」を参照してください。 |
| 無効なクライアント証明書を使用して、相互 TLS を必要とする API Gateway カスタムドメイン名を呼び出している | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | カスタムドメイン名のトラストストアが API リクエストに含まれるクライアント証明書を発行していないか、証明書が無効です。詳細については、「相互 TLS を必要とする API Gateway カスタムドメイン名からの HTTP 403 Forbidden エラーをトラブルシューティングする方法を教えてください」を参照してください。 |
| デフォルトの execute-api エンドポイントを使用して、カスタムドメイン名を持つ REST API を呼び出している | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | デフォルトのエンドポイントを無効にすると、呼び出し元はデフォルトの execute-api エンドポイントを使用して REST API を呼び出します。詳細については、「REST API のデフォルトのエンドポイントを無効にする」を参照してください。 |
| カスタムドメイン名を含むルーティングルールを使用している | "x-amzn-errortype" = "ForbiddenException" | "Forbidden" | カスタムドメイン名と一致するルーティングルールを設定していません。詳細については、「ルーティングルールに関する問題のトラブルシューティング」を参照してください。 |
| リソースパスが存在しない | "x-amzn-errortype" = "IncompleteSignatureException" | "Authorization header requires 'Credential' parameter.Authorization header requires 'Signature' parameter.Authorization header requires 'SignedHeaders' parameter.Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header.Authorization=allow" | Authorization ヘッダーがあるリクエストが、存在しない API リソースパスに送信されています。 |
| 認証トークンの有効期限が切れている | "x-amzn-errortype" = "InvalidSignatureException" | "Signature expired" | リクエストの認証トークンの有効期限が切れました。 |
| 署名が無効である | "x-amzn-errortype" = "InvalidSignatureException" | "The request signature we calculated does not match the signature you provided.Check your AWS Secret Access Key and signing method." | 呼び出し側が IAM 認証を使用する API にアクセスするときの、リクエストの署名がサーバー上の署名と一致していません。 |
| ドメイン URL にステージが含まれている場合に、カスタムドメインを有効にした API を呼び出す | "x-amzn-errortype" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | API マッピングでは、API、ステージ、およびマッピングに使用するオプションパスを指定します。API のステージをカスタムドメインにマップする場合、URL にステージを含める必要はありません。詳細については、「API マッピングを使用して、API ステージを REST API のカスタムドメイン名に接続します」を参照してください。 |
| 認証トークンが見つからない | "x-amzn-errortype" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | リクエストには認証トークンがありません。 |
| 認証トークンが見つからない | "x-amzn-errortype" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | API に存在しない API メソッドにリクエストを送信しました。 |
| 認証トークンが見つからない | "x-amzn-errortype" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | API に存在しない API リソースにリクエストを送信しました。 |
| リソースパスが存在しない | "x-amzn-errortype" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | Authorization ヘッダーのないリクエストが、存在しない API リソースパスに送信されています。詳細については、「API Gateway REST API エンドポイントで発生する、"Missing Authentication Token" という 403 エラーのトラブルシューティング方法を教えてください」を参照してください。 |
解決策
要求されたリソースが API 定義に存在することを確認する
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
API Gateway コンソールまたは AWS CLI を使用して、次の設定を確認します。
- API が最新の API 定義でデプロイされている。
- 要求されたリソースが API 定義に存在する。
エラーの原因を特定する
エラーの原因を特定するには、API に Amazon CloudWatch アクセスログ記録を設定します。次に、CloudWatch で API のログイベントを確認し、リクエストが API Gateway API に到達しているかどうかを判断します。リクエストが API Gateway API に到達し、ログにエラーメッセージがある場合は、API Gateway のトラブルシューティングを続行できます。リクエストが他のリソースに到達した場合、他のプロキシまたはサービスがエラーの原因である可能性があります。
注: HTTP API は実行ログ記録をサポートしていません。
エラーを再現できる場合は、curl -v コマンドを使用するとクライアントと API 間の詳細な通信情報を取得できます。
curl -X HTTP_VERB -v https://api-id.execute-api.region.amazonaws.com/stage
注: サンプル URL を API の呼び出し URL に置き換えます。
REST API を検証して API マッピングを再ルーティングする
相互 TLS を必要とするカスタムドメイン名を使用して HTTP API を呼び出すと、403 エラーが表示されることがあります。
新しい API マッピングを作成して、カスタムドメイン名の REST API 呼び出しをテストします。エラーの原因を特定するには、CloudWatch で REST API のログイベントを確認します。エラーを特定して解決したら、API マッピングを HTTP API に再ルーティングします。
リクエストヘッダーが正しいことを確認する
無効な API キーがエラーの原因である場合は、リクエストで "x-api-key" ヘッダーが送信されたことを確認してください。ヘッダーを含めなかった場合、またはヘッダーが正しくない場合は、リクエストヘッダーを更新してください。
インターフェイス Amazon VPC エンドポイントの DNS 設定が正しく設定されていることを確認する
注: 次のタスクは、インターフェイス VPC エンドポイントのみを持つ Amazon VPC から呼び出す API に適用されます。
インターフェイスエンドポイントの DNS 設定を、使用する API のタイプに基づいて正しく設定したことを確認します。
Amazon VPC 内から AWS リージョン API を呼び出すには、インターフェイスエンドポイントでプライベート DNS 名を無効にします。こうすることで、パブリック DNS がエンドポイントのホスト名を解決できます。詳細については、「プライベート API の作成」を参照してください。
API のプライベート DNS 名を使用して Amazon VPC 内からプライベート API を呼び出すには、エンドポイントでプライベート DNS 名を有効にします。こうすることで、Amazon VPC ローカルサブネットリソースは、インターフェイスエンドポイントのホスト名を解決できます。
注: プライベート DNS を有効にしてデフォルト URI を使用する場合、プライベート API のパブリック DNS 名や Amazon Route 53 エイリアスを設定する必要はありません。
API のリソースポリシーを確認する
API のリソースポリシーで、次の設定を確認します。
- インターフェイス VPC エンドポイントを使用して VPC から呼び出す API の場合、API のリソースポリシーが VPC またはインターフェイス VPC エンドポイントへのアクセスを許可する必要がある。
- リソースポリシーのリソース定義と書式は正しい。
注: リソースポリシーを保存しても、API Gateway は ARN 仕様を検証しません。例については、「API Gateway リソースポリシーの例」を参照してください。 - API Gateway では、呼び出し元が、API に定義した認証タイプ別に API エンドポイントを呼び出すことができる。API Gateway は、リソースポリシーと認証タイプを評価してリクエストを許可または拒否します。
HTTP リクエストとレスポンスメッセージを確認する
ウェブブラウザでエラーを再現します。ブラウザのネットワークツールで HTTP リクエストメッセージとレスポンスメッセージを取得し、それらを分析してエラーが発生した場所を特定します。
注: オフライン分析では、HTTP アーカイブ (HAR) ファイルにメッセージを保存します。
関連情報
Common errors (よくあるエラー)
特定の IP アドレスのみが API Gateway REST API にアクセスできるようにする方法を教えてください。
API Gateway のプライベート API エンドポイントへの接続時に発生する問題をトラブルシューティングする方法を教えてください。
API Gateway REST API または WebSocket API のトラブルシューティング用に、CloudWatch Logs を有効にする方法を教えてください。
curl のウェブサイトの curl

