web-dev-qa-db-ja.com

AWS Lambda-障害が発生したときに再試行を停止する方法

Lambda関数が失敗したとき(たとえば、タイムアウトが発生したとき)、関数をさらに3回実行しようとします。この動作を回避する方法はありますか?私はドキュメントを読んでいますが、これについては何も見つかりませんでした。

ありがとう!

16
AleGallagher

Lambda関数の再試行動作を無効にする方法はありません。

それに対処するための2つのオプションを提案します。

  1. Lambdaが再試行のケースを正しく処理できるようにします。 Lambdaの再試行時に同じになるcontext.AwsRequestId(または対応するフィールド)を使用できます。
  2. Lambdaをステートマシン内に配置します(AWS Step Functionsを使用)。その後、再試行のみを無効にできます。

このブログ投稿 私はより一般的な説明を書いています。

12
Ronyis

未処理の失敗(キャッチしなかったエラー)または処理したがLambdaに再試行するように指示した場合(たとえば、ノード、callback()をnull以外の最初の引数で呼び出した場合)。

再試行を停止するには、エラーが処理されていることを確認し、Lambdaに非エラーを返す(またはNodeでcallback(null, <any>)を呼び出して呼び出しが正常に終了したことを伝える必要があります。

これを行うには、ハンドラー関数の本体全体をtry-catchで囲むことができます。

_module.exports.handler(event, context, callback) {
  try {
    // Do you what you want to do.
    return callback(null, 'Success')
  } catch (err) {
    // You probably still want to log it.
    console.error(err)
    // Return happy despite all the hardships you went through.
    return callback(null, 'Still success')
  }
}
_

タイムアウトによる失敗に関しては、できることがあります。

ハンドラのoutsideがタイムアウトした場合、通常、コードに何らかの問題(たとえば、不適切なデータベース構成など)があるため、これを確認する必要があります。

呼び出し中にタイムアウトになった場合insideハンドラーには、何かできることがあります。

  • HTTPリクエストの場合、リクエストのタイムアウトをLambdaのタイムアウトよりも短く設定する必要があります。これにより、適切に失敗し、キャッチできます。
  • データベース接続の場合は、おそらく使用しているライブラリを使用してタイムアウトを設定できます。
  • タイムアウトになるのがロジックの場合、Lambdaをアップグレードして、より高いメモリCPUを使用して高速化できます。また、context.getRemainingTimeInMillis()をチェックして、Lambdaがタイムアウトしようとしているかどうかを知ることができるため、より早く処理できます。
19
dashmug

以下のコードを使用して、障害が発生した場合に再試行を識別して停止します。

  exports.handler = (event, context, callback) => {
      context.callbackWaitsForEmptyEventLoop = false;
      let lastReqId;
      if (lastReqId == context.awsRequestId) {
        console.log("Lambda auto retry detected. Aborting");// you can write your own logic to decide what to do with the failure data
        return context.succeed();
      } else {
        console.log("new context");
        lastReqId = context.awsRequestId;
      }
    };

あなたはそれについてもっと読むことができます こちら

0
Kshitiz Jaiswal

pythonを使用する場合、try/catchブロックにもコードを配置する必要がありますが、コールバックはありません。例:

try:
    do_something()
except Exception as e:
    print('Error: ' + str(e))

エラーが処理されたため、Lambdaは再試行しません。

0
Raptor