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

最終更新日:2021-12-16

Amazon API Gateway API を呼び出すと、403エラーが発生します。API Gateway からの 403 エラーのトラブルシューティング方法を教えてください。

簡単な説明

HTTP 403 応答コードは、クライアントが有効な URL へのアクセスを禁止されていることを意味します。サーバーはリクエストを理解していますが、クライアント側の問題のためにリクエストに対応できません。

API Gateway APIは、次のいずれかの理由で403応答を返す可能性があります:

問題 応答ヘッダー エラーメッセージ 根本原因
アクセスが拒否されました 「x-amzn-errortype」=「AccessDeniedException」 「ユーザーは明示的な拒否でこのリソースにアクセスする権限がありません」 発信者に、Lambda オーソライザーを使用している API にアクセスする権限がありません。
アクセスが拒否されました 「x-amzn-errortype」=「AccessDeniedException」 「ユーザー:<user-arn>は実行を許可されていません:execute-api:Invoke on resource:<api-resource-arn> with明示的な拒否」

発信者は、AWS Identity and Access Management (IAM) 認証を使用しているAPIにアクセスすることを許可されていませんまたは、発信者へのアクセスを明示的に拒否するリソースポリシーが API にアタッチされています。

詳細については、「IAM 認証とリソースポリシー」をご参照ください。

アクセスが拒否されました 「x-amzn-errortype」=「AccessDeniedException」 「User:anonymous is 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キーを使用しました。 
署名が無効です 「x-amzn-errortype」=「InvalidSignatureException」 「The request signature we calculated does not match the signature you provided.AWS シークレットアクセスキーと署名方法を確認してください。 リクエストの署名が、IAM 認証を使用している API にアクセスするときのサーバー上の署名と一致しません。
フィルタリングされた AWS WAF "x-amzn-errortype" = "ForbiddenException" 「禁止されています」 AWS WAF が API で有効になっている場合、リクエストはウェブアプリケーションファイアウォールのフィルタリングによってブロックされます。
リソースパスが存在しません 「x-amzn-errortype」=「MissingAuthenticationTokenException」 「認証トークンが見つかりません」 「認証」ヘッダーのないリクエストが、存在しない API リソースパスに送信されています。
リソースパスが存在しません 「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」(認可ヘッダーには「Credential」パラメータが必要です。認可ヘッダーには「Signature」パラメータが必要です。認可ヘッダーには「SignedHeaders」パラメータが必要です。認可ヘッダーには「X-Amz-Date」または「Date」ヘッダーが存在している必要があります。Authorization=allow) 「認可」ヘッダーを含むリクエストが、存在しない API リソースパスに送信されています。
パブリック DNS 名を誤って使用してプライベート API を呼び出しています "x-amzn-errortype" = "ForbiddenException" 「禁止されています」

パブリック DNS 名を誤って使用して Amazon Virtual Private Cloud (Amazon VPC) 内からプライベート API を呼び出す。たとえば、リクエストに「Host」 または「x-apigw-api-id」 ヘッダーがリクエストにありません。。

詳細については、「エンドポイント固有のパブリック DNS ホスト名を使用したプライベート API の呼び出し」を参照してください。

デフォルトの execute-api エンドポイントを使用してカスタムドメイン名を持つ REST API を呼び出します。

"x-amzn-errortype" = "ForbiddenException" 「禁止されています」

発信者は、デフォルトの execute-api エンドポイントを使用して、デフォルトのエンドポイントを非アクティブ化した後、REST APIを呼び出します。

詳細については、「Disabling the default endpoint for a REST API ( REST API のデフォルトエンドポイントの無効化) 」を参照してください。

無効なクライアント証明書を使用して、相互Transport Layer Security (TLS) を必要とする API Gateway カスタムドメイン名を呼び出す。 "x-amzn-errortype" = "ForbiddenException" 「禁止されています」

API リクエストで提示されたクライアント証明書が、カスタムドメイン名のトラストストアによって発行されていないか、有効ではありません。

詳細については相互 TLS を必要とする API Gateway カスタムドメイン名からの HTTP 403 Forbidden エラーをトラブルシューティングする方法を教えてください。

解決方法

エラーの原因を検討する

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

  • エラーがウェブブラウザで報告された場合、間違ったプロキシ設定が原因である可能性があります。HTTP アクセスが許可されていない場合、プロキシサーバーは 403 エラーを返します。
  • API の前に別の AWS のサービスがある場合、そのサービスは応答に 403 エラーを含めてリクエストを拒否できます。例:Amazon CloudFront。

エラーの原因を特定する

API の Amazon CloudWatch アクセスログをまだ設定していない場合は、設定します。次に、 CloudWatch で API の実行ログを表示して、リクエストが API に到達しているかどうかを確認します。

注:: HTTP API は実行ログをサポートしていません。 相互TLSを必要とし、HTTP APIを呼び出すカスタムドメイン名によって返される403エラーのトラブルシューティングを行うには、次の手順を実行する必要があります。

1.    テスト用に REST API を呼び出すカスタムドメイン名の新しい API マッピングを作成します。

2.    CloudWatch で REST API の実行ログを表示し、エラーの原因を特定します。

3.    エラーを特定して解決したら、カスタムドメイン名の API マッピングを HTTP API に再ルーティングします。

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

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

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

  • APIは、最新のAPI定義を使用してデプロイされます
  • 要求されたリソースはAPI定義に存在します。

curl を使用してリクエストと応答の詳細を取得します。

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

curl-v コマンドの例

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

注:詳細については、curl プロジェクトのウェブサイトを参照してください。 

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

エラーが無効なAPIキーの結果である場合は、リクエストで「x-api-key」 ヘッダーが送信されたことを確認します。

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

注:インターフェイス VPC エンドポイントのみを持つ Amazon VPC から呼び出された API については、次の点を確認してください。

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

以下の点にご注意ください。

API のリソースポリシーを確認します。

API のリソースポリシーを確認して、以下を確認します。

HTTP リクエストと応答メッセージを分析する

可能であれば、Web ブラウザでエラーを再現します。次に、ブラウザのネットワークツールを使用して HTTP 要求メッセージと応答メッセージをキャプチャし、それらを分析してエラーが発生した場所を特定します。

注:オフライン分析の場合、これらのメッセージを HTTP アーカイブ (HAR) ファイルに保存します。