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 の実行のモニタリング