Lambda 統合 API をクローンした際に発生する 500 エラーの原因と対処法をまとめてみた

Lambda 統合 API をクローンした際に発生する 500 エラーの原因と対処法をまとめてみた

Clock Icon2025.05.19

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

API Gateway を利用して API の開発や検証を行う際、既存の API をクローンして新しい環境を構築することができます。
今回、プライベート API を作成するために、既存の Lambda 関数と統合された API をクローンしました。
しかしながら、クローンした API がうまく動作しない事象に遭遇し、原因特定に時間を要しました。
原因や対処方法についてまとめてみましたので同じ事象に遭遇した方の助けになれば幸いです。

困っていた事象

既存の Lambda 関数と統合された API をクローンして新たに API を作成をしました。
API クローン

しかし、クローンした API のエンドポイントにアクセスすると、500 Internal Server Error が返されました。

curl -X GET -I https://{rest-api-id}.execute-api.ap-northeast-1.amazonaws.com/dev/data?id=111
HTTP/1.1 500 Internal Server Error
Server: Server
Date: Mon, 19 May 2025 05:01:00 GMT
Content-Type: application/json
Content-Length: 36
Connection: keep-alive
x-amzn-RequestId: XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX
x-amzn-ErrorType: InternalServerErrorException
x-amz-apigw-id: XXXXXXXXX

結論

Lambda 統合を含む既存 API をクローンした場合、Lambda 関数のリソースベースのポリシーが自動で設定されず、Internal Server Error が発生します。
統合リクエストを再設定してデプロイするか、AWS CLI コマンドを利用して Lambda 関数のリソースポリシーを手動で付与する必要があります。
なお、AWS Lambda の管理コンソールからトリガーを追加する方法では動作が異なるため、根本的な解決につながらない可能性があります。

エラーの調査方法

Internal Server Error のエラーは API Gateway の実行ログから調査することができます。
前提として、ログ記録の設定が有効になっている必要があります。
設定方法については、以下のドキュメントをご参照ください。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-logging.html#set-up-access-logging-using-console

今回発生した事象では次のエラーメッセージが実行ログに記録されていました。

(中略)

(XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX) Execution failed due to configuration error: Invalid permissions on Lambda function
(XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX) Method completed with status: 500

(中略)

原因

Lambda 関数に対する適切な実行権限が設定されていないことが原因です。
API Gateway から Lambda 関数を呼び出そうとした際に、実行権限がないため呼び出しに失敗し、Internal Server Error が発生します。
API を Lambda 関数と統合する場合、マネジメントコンソールからメソッド作成を行う際には Lambda 関数のリソースベースのポリシーを自動で更新してくれます。
しかしながら、クローンで作成したメソッドに対しては Lambda 関数のリソースベースのポリシーは自動では更新されません。
マネコンのLambdaポリシー更新メッセージ

今回、 API 名 MyAPI をクローン元としてPrivateMyAPIを新たに作成しました。
作成後 Lambda 関数のトリガーを確認してみると、作成した PrivateMyAPI のトリガーが設定されていないことがわかります。
トリガーが設定されていない

対処方法

Lambda 関数のリソースベースのポリシーを設定する方法には以下のような手段があります。

自動でポリシーを付与する

統合リクエストを再設定してデプロイすることで、ポリシーを自動的に更新できます。

  1. API Gateway サービスのナビゲーションペインから [API] を選択します。

  2. クローンで作成された API を選択します。

  3. ナビゲーションペインから リソース を選択します。
    リソース選択

  4. リソースパスから Lambda 統合しているメソッドタイプ(例:GET、POST など)を選択します。

  5. 統合リクエストタブより、[編集]を選択します。
    メソッド選択

  6. 何もせずそのまま保存を選択します。
    統合リクエストを編集-05-18-2025_06_07_PM-png-4028×2284--05-19-2025_05_54_PM

  7. [API をデプロイ]を選択します。
    デプロイ

  8. ステージを選択の上、[デプロイ]を選択します。
    デプロイ確認

手動でポリシーを付与する

以下の AWS CLI コマンドを利用して設定できます。

aws lambda add-permission \
  --function-name {FunctionName} \
  --statement-id apigateway-access \
  --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn arn:aws:execute-api:ap-northeast-1:XXXXXXXXXXXX:{rest-api-id}/*/{methodtype}/{path}

リソースベースポリシー設定の確認

Lambda 関数のリソースベースのポリシーが設定されたことを確認します。

  1. Lambda サービスのナビゲーションペインから [関数] を選択します。
  2. 関数一覧から API Gateway に統合リクエスト設定している Lambda 関数を選択します。
  3. 設定タブよりトリガーを選択します。
  4. リソースベースのポリシーに、対象の API Gateway の API 名、エンドポイント、ステージ、メソッド、リソースパスが含まれていることを確認します。
    リソースポリシー追加後

動作確認

リソースベースのポリシーを設定後、APIリクエストを行い、動作確認を行います。

curl -X GET -I https://{rest-api-id}.execute-api.ap-northeast-1.amazonaws.com/dev/data?id=111
HTTP/1.1 200 OK
Server: Server
Date: Mon, 19 May 2025 05:02:22 GMT
Content-Type: application/json
Content-Length: 36
Connection: keep-alive
x-amzn-RequestId: XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX
x-amz-apigw-id: XXXXXXXXX
X-Amzn-Trace-Id: Root=1-XXXXXXX-XXXXXXXXXXXXXXXXXX;Parent=5054033626daaa1a;Sampled=0;Lineage=1:7bc52c8e:0

500 Internal Server Error は解消され、200 OK が返るようになりました。

Lambda の管理コンソールから既存 API をトリガー追加するとどうなるか?

AWS Lambda の管理コンソールで[トリガーを追加]を選択すると API Gateway をトリガーとして追加するオプションが表示されます。
トリガーの追加ボタン

既存の API を指定してトリガーを追加することも可能なため、この方法で問題が解決できるように思えるかもしれません。
しかし、既存の API に Lambda 関数をアタッチした場合、API Gateway は Lambda 関数の名前に基づいて新しいリソースパスを作成します。
さらにそのパスに ANY メソッドが追加され、Lambda 関数を呼び出すように設定されます。
API をクローンする場合は既存のリソースパスを変更せずにそのまま利用するケースが一般的です。
そのため、この方法では問題の根本的な解決にはならない可能性があり、注意が必要です。
トリガー追加後

トリガー追加した場合

まとめ

Lambda 統合を含む既存 API をクローンした場合、Lambda 関数のリソースベースのポリシーは自動的には設定されません。
統合リクエストの再設定した上でデプロイもしくは AWS CLI コマンドを利用して Lambda 関数のリソースポリシーを付与する必要があります。
AWS Lambda の管理コンソールで対処では根本的な解決にならない場合があるので注意しましょう。

参考

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-apigateway.html#apigateway-permissions
https://repost.aws/ja/knowledge-center/api-gateway-internal-server-error
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/permissions-function-services.html
https://dev.classmethod.jp/articles/api-gateway-export-import/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.