目次
はじめに
AWS Lambdaで非同期呼び出し機能がありますが、動作がイマイチ良く分からなかったので実際に検証してみました。
AWS Lambdaの非同期呼び出し機能とは
Lambdaが非同期呼び出しされた際にエラーとなった場合に、リトライ処理をしたりデッドレターキューにキューを入れることができる機能です。
リトライに関しては以下に記載のあるように、1回目のリトライは1分後、2回目のリトライは2分後に行われます。
Lambda manages the function's asynchronous event queue and attempts to retry on errors. If the function returns an error, Lambda attempts to run it two more times, with a one-minute wait between the first two attempts, and two minutes between the second and third attempts.
言葉で書いてもイメージが湧きづらいと思うので、以下検証してみます。
検証準備
SQS
デフォルトの設定でキューを作成します。
Lambda
新規作成します。
また、コードはエラーが出るように以下のコードを用意しました。
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
console.error(`ERROR!!!`);
throw new Error(`ERROR !!!`);
return response;
};
また、以下のように非同期呼び出し機能でデッドレターキューサービスに先ほど作成したSQSのキューを指定します。
EventBridge
適当に時間を指定し、Lambdaを実行してみます。
検証内容
ログ
以下のように、リトライ処理が行われていることが分かります。
- 20:10 → 初回実行
- 20:11 → 1回目リトライ
- 20:13 → 2回目リトライ
SQS
上記ログのとおり、2回リトライしてもエラーのままであることから、以下のようにデッドレターキューにキューが入っています。
メッセージをポーリングしてみます。
中身をみてみると、先ほどのログで確認したリクエストIDやエラーメッセージが入っていることが分かります。
まとめ
今回はLambdaの非同期呼び出し機能について検証しました。
本機能を使うことで、エラー時にリトライ処理ができること、デッドレターキューにキューが移動することを確認できました。
Lambdaでリトライ処理を実装したい人はこの機能を使ってみても良いかもしれません。