Lambda プロキシ統合を使用して API Gateway REST API からの HTTP 502 エラーを解決するにはどうすればよいですか?

所要時間2分
0

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

簡単な説明

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

Amazon CloudWatch Logs に表示される HTTP 502 エラーメッセージの例

Wed Aug 03 08:10:00 UTC 2022 : Execution failed due to configuration error:
WE Aug 03 09:10:00 UTC 2022 : Method completed with status: 502

または

Wed Aug 03 08:20:33 UTC 2022 : Lambda execution failed with status 200 due to customer function error: [Errno 13] Permission denied: '/var/task/lambda_function.py'. Lambda request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Wed Aug 03 08:20:33 UTC 2022 : 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.    Lambda 関数のリソースポリシーで、API Gateway で関数を呼び出すためのアクセスが許可されていることを確認します。

4.パッケージ許可の問題により Lambda 関数の実行が失敗した場合は、許可を確認します。詳細については、「Lambda デプロイパッケージをアップロードするときに「権限が拒否されました」または「モジュールをインポートできません」というエラーを解決するには、どうすればよいですか?」を参照してください。

5.    Lambda 関数ハンドラー名と設定が有効であることを確認します

6.    ランタイム中に Lambda の実行が失敗した場合は、Lambda 関数のログを確認してコードを更新します。

7.    変更を加えたら、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 に設定するのがベストプラクティスです。

関連情報

API Gateway での CloudWatch による REST API のログの設定

Amazon CloudWatch のメトリクスを使用した REST API の実行のモニタリング

コメントはありません

関連するコンテンツ