API Gateway REST API からの HTTP 502「不正な Lambda プロキシ応答」エラーの解決方法を教えて下さい。

最終更新日: 2021 年 11 月 18 日

AWS Lambda 関数と連携するように、Amazon API Gateway プロキシ統合を構成しました。REST API を呼び出すと、設定エラーおよび HTTP 502 ステータスコードが表示されます。どうすればこの問題を解決できますか?

簡単な説明

API リクエストに対する Lambda 関数のレスポンスが正しくフォーマットされていない場合、API Gateway は HTTP 502 ステータスコードを返します。

Amazon CloudWatch Logs に表示される HTTP 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 Gateway が Lambda 関数の応答を処理するには、関数が次の JSON 形式に従って出力を返す必要があります。

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

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

解決方法

1.    API Gateway の API ダッシュボードを使用して、REST API の CloudWatch メトリクスを確認します
- または -
Amazon CloudWatch コンソールで REST API のログイベントを確認します

2.    ログで、Lambda 関数の API に対する応答の形式を確認します。レスポンスが必須 JSON 形式でない場合は、再フォーマットします。

3.    API Gateway コンソールで REST API メソッドをテストします

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

注: Node.js Lambda 関数は、async ハンドラー非 async ハンドラーをサポートしています。次の関数例では、async ハンドラーを使用しています。

exports.handler = async (event) => {

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

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

    return response;
};

この応答例には、次の 4 つのフィールドがあります。

  • statusCode は、API メソッドの発信者に返される API Gateway が解釈する整数です。
  • headers は、収集され、API Gateway の応答とともに戻されます。
  • データを JSON として返す場合はbody を文字列に変換する必要があります。
    注: JSON.stringify を使用すると、Node.js 関数でこれを処理できます。他のランタイムでは異なる解決方法が必要ですが、概念は同じです。
  • バイナリデータを扱う場合、isBase64Encoded は必須フィールドです。このフィールドを使用しない場合は、この値を FALSE に設定するのがベストプラクティスです。