前々回は Visual Studio C# のコードから AWS Lambda にデプロイする方法を、前回は Lambda スロットリングで許可している同時実行数を超えた場合の動作についてご紹介しましたが、続き上記のケースについてそれぞれ以下に今回は AWS Lambda で HTTP ステータスコード 502 Internal Server Error で返ってくる場合の原因につきまして、調査してみました。
前提条件
・Windows10 Pro 64Bit 2004
・Visual Studio 2019 Community v16.9.4
・C# .NET Core 3.1
・AWS Lambda
1.原因について
AWS Lambda で "message": "Internal server error" HTTP ステータスコード 502 (一部は500)が返ってくる原因につきましては以下の3点が大きな要素となっています。
・レスポンスの形式がJSONでなかったり、規定通りでない場合。(502)
・API Gateway の設定が間違っている場合。(502)
・権限の問題(502 / 500)
その他、API Gateway のデプロイバージョンが古いままになっているなど、簡単なミスによってもつまづいたりしますが、ここでは割愛します。
上記の3点のケースについてそれぞれ検証した結果を以下に掲載します。
2.レスポンスの形式
AWS Lambda のレスポンスは JSON で返すことが決まっており、後述の Lambda プロキシ統合を使用する場合は中身の形式も以下のフォーマットとして決まっているようです。項目名の先頭が小文字になっていなかったり、綴りの間違いや項目の欠如で 502 内部エラーとなります。
{
"isBase64Encoded": false,
"statusCode": 200,
"headers": {
"x-custom-header": "my custom header value"
},
"body": "{\"任意のフィールド名\":\"任意の値\"}"
}
3.API Gateway の設定
Lambda > 関数 > 関数名 > トリガー > API Gateway > 統合リクエスト
の画面を開き、デフォルトでは「Lambdaプロキシ統合の使用」にチェックがつけられており、前述の正しいレスポンス形式の JSON でない場合は 502 Internal Server Error が返ってきます。チェックを外して、Lambda プロキシ統合を使用しないようにするか、正しいレスポンス形式を返すように Lambda を構成すれば HTTP ステータスコード 200 で返ってくるようになりました。実行ロールを設定してしまうとどんな権限を付与しても HTTPステータスコード 500 で返ってきました。

4.権限の設定
尚、上記のプロキシ統合のチェックを変更する度に「Lambda 関数に権限を追加する」確認メッセージが表示され、OKを押下してしまうと API Gateway から Lambda を実行する権限設定が何度も付与されるようです。以下の Lambda > 設定 > アクセス権限 > リソースベースのポリシー から確認ができます。逆にこの権限が付与されていないと HTTPステータスコード 500 Internal Server Error で返ってきます。

他にもロール自体の権限の設定(CloudWatch Logs や Lambda のベーシック実行権限)により挙動が異なるようですが、いまいちはっきりしない為、調査継続中です。
以上が、HTTP ステータスコード 502 または 500 Internal Server Error で返ってくるケースについてまとめてみた結果となります。
- 関連記事
-