API ゲートウェイの「不正な Lambda プロキシ応答」エラー、または 502 ステータスコードを解決するにはどうすればよいですか?

最終更新日: 2020 年 10 月 30 日

AWS Lambda 関数と連携するように、Amazon API Gateway プロキシ統合を構成しました。API を呼び出すと、設定エラーまたは 502 ステータスコードが表示されます。解決方法を教えてください。

簡単な説明

多くの場合、Lambda 関数の応答の形式が、これらのエラーの原因です。形式が問題の場合は、ログに次のようなメッセージが表示されます。

Thu Dec 08 01:13:00 UTC 2016 : Execution failed due to configuration error: Malformed Lambda proxy response
Thu Dec 08 01:13:00 UTC 2016 : Method completed with status: 502

API ゲートウェイが Lambda 関数の応答を処理するには、応答が次の形式の JSON である必要があります。

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

詳細については、プロキシ統合のための Lambda 関数の出力形式を参照してください。

解決方法

  1. API ゲートウェイコンソールからのログ出力を確認するか、Amazon CloudWatch コンソールで API ゲートウェイログイベントを表示します
  2. ログで、Lambda 関数の API に対する応答の形式を確認してください。応答が正しい形式の JSON ではない場合は、形式を見直してください。

応答が正しい形式の Node.js の関数の例

exports.handler = (event, context, callback) => {

    var responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
    };

    var response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };
    callback(null, response);
};

注 : 関数が他のプログラミング言語で書かれている場合は、その言語のプログラミング解説を参照してください。関数が正しい形式で応答を返すことを確認してください。

この応答では、次の 4 つのフィールドがあります。statusCodeheadersbody、およびisBase64Encoded

  • statusCode は、API メソッドの呼び出し元に返される API ゲートウェイが解釈する整数です。
  • headers は、収集され、API ゲートウェイの応答とともに戻されます。
  • body フィールドは、もし JSON を返すのであれば、それ以上のレスポンスの問題を防ぐために文字列に変換されなければなりません。JSON.stringify を使用すると、Node.js 関数でこれを処理できます。他のランタイムでは異なる解決方法が必要ですが、概念は同じです。
  • バイナリデータを扱う場合、isBase64Encoded フィールドは重要です。このフィールドを使用しない場合は、これを FALSE のブール値に設定することをお勧めします。