タイムアウトと再試行数を設定して、Lambda関数が複数回実行される不具合を修正してみた
はじめに
こんにちは!おのやんです。
みなさん、LambdaからSlackに通知を飛ばしている状況で、同じメッセージが複数飛んできたことはありますか?私はあります。
過去に、AWSの利用料をSlackのチャンネルに飛ばしてくれるLambdaを組みました。
しかし、チャンネルに同一のメッセージが複数回通知されるという現象に遭遇しました。
今回こちらの現象を調査しましたので、原因や対策を紹介したいと思います。
編集・追記歴
内容に修正や追記が必要だと感じた部分を編集しています。
- [2023/08/28] タイトル変更・内容修正・追記
- タイトル: 「タイムアウトが短すぎるとLambda関数が複数回実行されることがある」=>「タイムアウトと再試行数を設定して、Lambda関数が複数回実行される不具合を修正してみた」
- 内容: 原因・修正項目に再試行数を追加
原因
私の方で調査しながら、Slackにてこちらの現象を共有しました。このメッセージを見た先輩の社員の方から「タイムアウトのせいでは?」と助言をいただきました。
ということで、Lambdaのログを収集しているCloudWatch Logsを調べてみました。こちらが、2回通知を飛ばした際のログです。
timed out after 3.01 seconds
というメッセージを挟んで、Slack通知処理が2回実行されています。先輩すごいですね、あの情報だけでドンピシャで原因当ててきた...
【2023/08/28 追記・修正】
また、Lambdaの詳細画面を見てみると、再試行数が2に設定されています。
ということで、Slackに2回通知が飛ぶ原因は「Lambdaのタイムアウトが3秒と短すぎるためにエラー判定された。また、エラー時の再試行が2回に設定されていたため、その分のメッセージがSlackに飛んできた」だと考えられます。
修正
ということで、Lambdaのタイムアウト・再試行数を編集しましょう。
まずはタイムアウトの表示自体を設定します。Lambdaコンソールの関数ページを開きます。
ここで「タイムアウト」の項目がオンになっているか確認します。もしオフになっていたら、オンに切り替えましょう。
編集したい関数を選びます。
各関数の詳細画面にて、「設定」タブの「一般設定」をみてみます。すると、先ほど表示を有効化したタイムアウトを見ることができるはずです。どうやら、関数を作成した際にデフォルトのタイムアウトとして3秒が設定されていたようです。
現在は3秒だと足りていないので、こちらを編集します。
タイムアウトが20秒になりましたね!
【2023/08/28 追記】
次に、再試行数を設定しましょう。Lambda詳細画面の「設定」タブから「非同期呼び出し」の画面を開き、「編集」をクリックします。
こちらの「再試行」の項目が2回に設定されていました。タイムアウト数を修正したので、エラーが頻繁に起こるというのは少なそうですが、ひとまずは0回に設定しておきましょう。
これらの設置をおこなったら、Slackを見てみましょう。
定時に飛ばされる通知も1回になっていることが分かると思います。
さいごに
あまり難しい問題ではないのですが、関数を作成した際のデフォルトの設定が原因だと、設定した覚えがないために発見に苦労することがあります。
Lambdaの関数が不自然に複数回実行されている際には、タイムアウトや再試行などの設定も一度見直してみましょう。では!