• 2018-07-07
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/07/aws-lambda-502-internal-server-error.html

AWS Lambda で 502 Internal server error になっちまう場合の確認

AWS Lambda に HTTP経由でリクエストした際に、

502 {"message": "Internal server error"}

になっちゃってる人へ!!

API Gateway で 502 Internal server error

原因

まず間違い無く、Lambda関数から返却するJSONの形式が、API Gatewayの仕様に合っていないからだと思われます。

説明

Lambdaでは正常のはず

Lambda 関数からのレスポンスが以下のような初期状態である場合、

Python 初期状態のソース


Lambda自身のテストでは正常に挙動しているはずです。

Lambdaのテストでは正常なのに

ブラウザからアクセスするとエラーになる

しかし、実際にブラウザからURLにアクセスしたりすると「{"message": "Internal server error"}」になってしまう。

ブラウザでアクセスするとエラー

レスポンスJSONの形式不正

これは、Lambda関数としては正常だが、HTTPリクエストの受付とレスポンスを管轄するApiGatewayの仕様に即していないからです。



このAWSのマニュアルにあるように、API Gatewayを介してHTTPレスポンスを返す場合、Lambda関数の戻り値は以下のフォーマットになっていなければなりません。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

Lambda ではなく API Gateway の問題なのです。

サンプルソース

よって、Lambda関数のソースは以下のようになっていなければならないのです。

def lambda_handler(event, context):
    # TODO implement
    return {
        "isBase64Encoded": False,
        "statusCode": 200,
        "headers": {},
        "body": "Hello from Lambda"
    }

修正結果

これで無事に処理が正常完了しました。

API Gateway での正常動作OK

0 件のコメント:

コメントを投稿

お気軽にコメント下さい。