Lambda関数が失敗したとき(たとえば、タイムアウトが発生したとき)、関数をさらに3回実行しようとします。この動作を回避する方法はありますか?私はドキュメントを読んでいますが、これについては何も見つかりませんでした。
ありがとう!
Lambda関数の再試行動作を無効にする方法はありません。
それに対処するための2つのオプションを提案します。
このブログ投稿 私はより一般的な説明を書いています。
未処理の失敗(キャッチしなかったエラー)または処理したが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ハンドラーには、何かできることがあります。
context.getRemainingTimeInMillis()
をチェックして、Lambdaがタイムアウトしようとしているかどうかを知ることができるため、より早く処理できます。以下のコードを使用して、障害が発生した場合に再試行を識別して停止します。
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;
}
};
あなたはそれについてもっと読むことができます こちら
pythonを使用する場合、try/catchブロックにもコードを配置する必要がありますが、コールバックはありません。例:
try:
do_something()
except Exception as e:
print('Error: ' + str(e))
エラーが処理されたため、Lambdaは再試行しません。