Lambda オーソライザーで API Gateway の REST API を使用する場合に発生する、HTTP 403 Forbidden エラーのトラブルシューティング方法を教えてください。

最終更新日: 2020 年 5 月 14 日

Lambda オーソライザーを作成した後、Amazon API Gateway の REST API を呼び出すと、403 Forbidden エラーが発生します。このエラーのトラブルシューティング方法を教えてください。

簡単な説明

注: API Gateway は、さまざまな理由から 403 Forbidden エラーを返すことがあります。この記事では、REST API 用に設定された Lambda オーソライザーに関連する 403 エラーの対処法のみを記載しています。

Lambda オーソライザーを使用する API Gateway REST API が 403 エラーを返す場合、通常、次のいずれかの理由が考えられます。

解決方法

以下のトラブルシューティング手順に従って、エラーの原因を特定しそれを解決します。

エラーの原因を特定する

1.    API Gateway からのレスポンスでエラーメッセージを確認します。

API への呼び出しに無効なトークンまたは ID ソースが含まれている場合は、次のようなエラーメッセージが表示されます。

{
    errorMessage: Unauthorized
}

Lambda オーソライザー関数が明示的な拒否を含む IAM ポリシードキュメントを返している場合は、次のようなエラーメッセージが表示されます。

{
    errorMessage: User is not authorized to access this resource with an explicit deny
}

API に、呼び出し元に対しアクセスを暗黙的または明示的に拒否するリソースポリシーがアタッチされている場合は、次のようなエラーメッセージが表示されます。

{
 Message: "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn>"
}

2.    CloudWatch で API Gateway の実行ログを表示 して、認証ワークフローを確認します。これにより、Lambda オーソライザーの出力 と、API Gateway のリソースポリシー評価の結果を確認できます。

注: Amazon CloudWatch Logs で、API Gateway に関するログ記録をまだ有効にしていない場合は、「API Gateway REST API または WebSocket API をトラブルシューティングするために CloudWatch Logs を有効にする方法を教えてください。」をご参照ください。

必要なトークンがない、あるいは、トークンが検証結果と一致しない場合、Lambda オーソライザーは呼び出されず、次のようなログメッセージが表示されます。

Extended Request Id: MY92nHDwwwIdGxzR=
Unauthorized request: <request-id>

注: 拡張されたリクエスト ID はランダムに生成されます。ログ内の ID 値はそれぞれ異なります。

Lambda オーソライザーがアクセスを拒否するポリシーを返した場合のログメッセージは、次のようになります。

Sending request to https://lambda.<region>.amazonaws.com/2015-03-31/functions/<lambda-authorizer-arn>/invocations
Authorizer result body before parsing:
{
    "principalId": "user",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Deny",
                "Resource": "<resource-arn>"
            }
        ]
    }
}
Using valid authorizer policy for principal: <principal>
Successfully completed authorizer execution
The client is not authorized to perform this operation.

注: 返されるポリシーは、Lambda オーソライザーによって異なります。

API Gateway リソースポリシーがリクエストを拒否した場合のログメッセージは、次のようになります。

Extended Request Id: MY-BIVb4GEdGeZB=
ExplicitDenyException User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny: <request-id>

「Unauthorized (権限がありません)」エラーを解決する

1.    API Gateway コンソールで Lambda オーソライザーの設定を確認し、API の呼び出しに含める必要がある項目を決定します。詳細については「 Amazon API Gateway Lambda オーソライザーへの入力」をご参照ください。

注: Lambda オーソライザーの設定を変更した場合は、API を再デプロイして変更内容を適用してください。

2.    API を再度呼び出します。前のステップでコンソールから確認した、設定済みのトークンまたは ID ソースを含めてください。

詳細については「Lambda オーソライザーの作成後に API Gateway 401 Unauthorized エラーが表示されるのはなぜですか?」をご参照ください。

Lambda オーソライザーから「not authorized to access this resource (このリソースにアクセスする権限がありません)」エラーを解決する

このエラーが断続的に発生する場合は、ポリシーのキャッシュが原因である可能性があります。API Gateway コンソールで Lambda オーソライザーの設定 から、認可のキャッシュ が有効になっていることを確認します。その後、以下のいずれかを実行します。

  • ワンタイムテストの場合は、AWS コマンドラインインターフェイス (AWS CLI) から flush-stage-authorizers-cache コマンドを実行します。オーソライザーのキャッシュエントリがフラッシュされた状態で、再度 API を呼び出します
  • ポリシーのキャッシュを無効にし、再度 API を呼び出します
    注: リクエストパラメータベースのオーソライザーでポリシーのキャッシュを無効にした場合、API Gateway は、Lambda オーソライザーの関数を呼び出す前に API の呼び出しを検証しません。
  • トークンのソース (トークンベースのオーソライザーの場合) 、または、設定された任意の ID ソース (リクエストパラメータベースのオーソライザーの場合) で指定されたヘッダー名を更新して、オーソライザーのキャッシュキーを変更します。API を再デプロイ して変更を適用します。次に、新しく設定したトークンヘッダーまたは ID ソースを使用して、再度 API を呼び出します

このエラーが一貫して発生する場合は、AWS Lambda で Lambda オーソライザー関数のコードを確認し、オーソライザーが呼び出し元に対しアクセスを明示的に拒否している理由を探してください。

「not authorized to perform (実行権限がありません): execute-api:Invoke」エラーを解決する

API の リソースポリシーをチェックして、ポリシーが無効になっていないか、または呼び出しに対してアクセスを明示的に拒否していないかを確認します。API の実行ログを表示することで、リソースポリシーのレスポンスの内容を確認できます。

詳細については、「Amazon API Gateway のアクセスポリシー言語の概要」、および「Lambda オーソライザーとリソースポリシー」をご参照ください。