API Gateway で Unauthorized が発生したが Lambda オーソライザーのログが記録されないときの対処方法

2023.09.22

困っていた内容

API Gateway の HTTP API で、Lambda オーソライザーによる認証を設定しました。
テストリクエストを行ったところ{"message":"Unauthorized"}が発生したので、調査のため Lambda のログを確認しましたが、ログが出力されていませんでした。
Lambda オーソライザーが原因と思いますが、確認すべき内容を教えてください。

どう対応すればいいの?

ID ソースと、クライアントがリクエストした内容を確認してください。

API Gateway は、Lambda オーソライザーの ID ソースが含まれないリクエストを受け取ると、Lambda を呼び出さず、401 Unauthorized をクライアントに返却します。

そのため、レスポンスが Unauthorized となり、Lambda のログも記録されない場合は、ID ソースに指定した値をリクエストに含めているか確認してください。

なお、リクエストしている内容は、curl コマンドの場合は-vを追加することで確認でき、リクエストした内容をレスポンスとして返却する httpbin のようなツールでも確認できます。

postmanlabs/httpbin: HTTP Request & Response Service, written in Python + Flask.

httpbin.orgで手軽に確認できますが、機密情報は含めないようにご注意ください。

httpbin.orgの実行例

$ curl "https://httpbin.org/get" -H "Hato-Authorization: hatoToken" 
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Hato-Authorization": "hatoToken", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/8.1.2", 
    "X-Amzn-Trace-Id": "Root=1-67891233-abcdef012345678912345678"
  }, 
  "origin": "203.0.113.0", 
  "url": "https://httpbin.org/get"
}

参考資料

クライアントのリクエストに ID ソースが含まれていない場合、API Gateway は Lambda オーソライザーを呼び出さず、クライアントは 401 エラーを受け取ります。