web-dev-qa-db-ja.com

AWS APIGatewayエラー応答は502「BadGateway」を生成します

LAMBDA_PROXY統合リクエストタイプのAPIゲートウェイがあります。 Lambdaでcontext.succeedを呼び出すと、応答ヘッダーは期待どおりにコード302で返送されます(以下を参照)。ただし、500および404エラーを処理したいのですが、これまでのところ確実なのは、502 Bad Gatewayを取得しているときにエラーが誤って返されることだけです。私のcontext.failの何が問題になっていますか?

これが私のhandler.jsです

const handler = (event, context) => { 
    //event consists of hard coded values right now
    getUrl(event.queryStringParameters)
    .then((result) => {
        const parsed = JSON.parse(result);
        let url;
        //handle error message returned in response
        if (parsed.error) {
            let error = {
                statusCode: 404,
                body: new Error(parsed.error)
            }
            return context.fail(error);
        } else {
            url = parsed.source || parsed.picture;
            return context.succeed({
                statusCode: 302,
                headers: {
                  Location : url
                }
              });
        }
    });
};
6
johnny_mac

Lambda関数(またはcontext.fail)内で例外をスローすると、API Gatewayはバックエンドで問題が発生したかのようにそれを読み取り、502を返します。これがランタイム例外である場合は、500/404を返します。必要なステータスコードとメッセージを指定してcontext.succeedメソッドを使用します。

if (parsed.error) {
  let error = {
    statusCode: 404,
    headers: { "Content-Type": "text/plain" } // not sure here
    body: new Error(parsed.error)
}
return context.succeed(error);
12
Stefano Buliani

同じ問題がありました。私の場合、関数がcontext.done()で何も返さないという問題がありました。したがって、context.done(null)の代わりに、context.done(null, {});を実行しました

1
Sello Mkantjwa

私は複数のことから502を手に入れました。これが私がこれまでに理解したものです。

回答1:

claudia generate-serverless-express-proxy --express-module {src/server?} claudiaとexpressを使用していない場合、この回答は役に立ちません。

回答2:

ラムダ関数->基本設定->タイムアウト。妥当なものに増やしてください。デフォルトは3秒です。ただし、最初に構築する場合は通常、時間がかかります。

0
Michael