Amazon API Gateway REST API 用の AWS Lambda オーソライザーを作成すると、API コールに対して「403 Forbidden」エラーが発生します。
簡単な説明
注: この解決策では、REST API 専用に設定された Lambda オーソライザーに関連する 403 エラーに対処できます。他の種類の 403 エラーに関するトラブルシューティング情報については、「API Gateway での HTTP 403 エラーをトラブルシューティングする方法を教えてください」を参照してください。
「403 Forbidden」エラーは、次の要因で発生する可能性があります。
API コールのトークンまたは ID ソースが欠けていたり、検証済みでなかったりする場合、「401 Unauthorized」エラーが発生します。詳細については、「Lambda オーソライザーの作成後、API Gateway が "401 Unauthorized" エラーを返す原因を教えてください」を参照してください。
解決策
エラーの原因を確認する
API Gateway REST API で Amazon CloudWatch Logs が有効化済みでない場合は、有効化してください。オーソライザーの設定を変更した場合は、API を再デプロイしてください。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
エラーログメッセージを確認する
API Gateway からの応答で、次の例に含まれるエラーログメッセージがないか確認します。
明示的な拒否を含む IAM ポリシードキュメントを返す、Lambda オーソライザー関数のエラーログメッセージ例:
{ "message": "User is not authorized to access this resource with an explicit deny"}
呼び出し元へのアクセスを暗黙的に拒否するリソースポリシーがアタッチされた、REST API のエラーログメッセージ例:
{ "message": "User is not authorized to access this resource"}
呼び出し元へのアクセスを明示的に拒否するリソースポリシーがアタッチされた、REST API のエラーログメッセージ例:
{ "message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny"}
注: IAM ポリシーが制御する API Gateway API の詳細については、「ポリシー評価結果テーブル」を参照してください。
API Gateway のログを確認する
認証ワークフローを確認するには、CloudWatch Logs の API Gateway 実行ログを確認してください。](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html)Lambda オーソライザーの出力[および、API Gateway リソースポリシー評価の結果に注意してください。次の例でログエラーメッセージを探してください。
必要なトークンが欠けているか、トークンの検証と一致しない場合のエラーログメッセージの例:
Extended Request Id: EXAMPLEabcIdGxzR=Unauthorized request: request-id
注: ログの拡張リクエスト ID 値はランダムに生成されるため、別の値となります。
Lambda オーソライザーがアクセスを拒否するポリシーを返す場合のエラーログメッセージの例:
Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/lambda-authorizer-arn/invocationsAuthorizer 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 オーソライザーによって異なります。返されたポリシーの resource-arn にリクエスト元のリソースが含まれていない場合、ポリシーは暗黙的にリクエストを拒否したことが示唆されます。
API Gateway リソースポリシーがリクエストを拒否した場合のエラーログメッセージの例:
Extended Request Id: EXAMPLE1ABdGeZB=ExplicitDenyException User: anonymous is not authorized to perform: execute-api:Invoke on resource: api-resource-arn with an explicit deny: request-id
Lambda オーソライザーが「not authorized to access this resource」エラーを返す場合の解決
ポリシーのキャッシュが原因で、「not authorized to access this resource」というエラーが断続的に発生する場合があります。認証キャッシュが有効かどうかを確認するには、API Gateway コンソールで Lambda オーソライザーの設定を確認してください。次に、以下のいずれかの手順を実行します。
- 1 回限りのテストを行うために、AWS CLI コマンド flush-stage-authorizers-cache を実行します。オーソライザーのキャッシュエントリをフラッシュした後、API を再度呼び出します。
- ポリシーキャッシュを無効にし、API を再デプロイして変更をコミットした後、API を再度呼び出します。
注: リクエストパラメータベースのオーソライザーではポリシーキャッシュが無効になっている場合、API Gateway は Lambda オーソライザー関数を呼び出す前に API への呼び出しを検証しません。
- オーソライザーのキャッシュキーを変更するには、Token Source (トークンベースのオーソライザーの場合) または Identity Sources (リクエストパラメータベースのオーソライザーの場合) で指定されているヘッダー名を更新します。API を再度デプロイして変更をコミットします。次に、新しく設定したトークンヘッダーまたは ID ソースを使用して API を再度呼び出します。
オーソライザーが呼び出し元へのアクセスを明示的に拒否している原因を特定するには、Lambda オーソライザー関数のコードを確認してください。問題の原因がキャッシュである場合は、コードを更新し、呼び出し元にアクセスできるようにしてください。
詳細については、「キャッシュが有効になっている Lambda オーソライザーを使用している API Gateway プロキシリソースから、HTTP 403 エラー "ユーザーはこのリソースへのアクセスを許可されていません" が返される理由を知りたいです」を参照してください。
「not authorized to perform: execute-api:Invoke」エラーの解決
API リソースポリシーが無効であったり、呼び出しへのアクセスが明示的に拒否されていたりするかどうかを判断するために、その API リソースポリシーを確認してください。API 実行ログを参照すると、リソースポリシーの応答結果を確認できます。詳細については、「Amazon API Gateway でのアクセスポリシー言語の概要」と「Lambda オーソライザーとリソースポリシー」を参照してください。
関連情報
API Gateway Lambda オーソライザーを使用する
API Gateway で REST API へのアクセスを制御、管理する