🎱

FIFOキューのSQSトリガーのLambdaの注意点

2024/08/02に公開

結論

同じメッセージグループIDの場合、FIFOキューのSQSトリガーで起動したLambdaがエラーになった場合、SQSのデータは削除されないので、後続のメッセージは処理されない。
今思うと基本的なことですが、人のコードを改修していた際にこれに気づかず1時間ほど無駄にしてしまったので備忘として残します。

FIFOキューのSQSの基本

  • メッセージの順序保証:メッセージがキューに追加された順序で消費されることが保証される。
  • 一度だけの処理保証:各メッセージが一度だけ配信されることが保証される。
  • 制限されたスループット:標準キューに比べてスループットが制限されています。デフォルトでは、1秒あたり最大300のトランザクション。(高スループットFIFOキューでは1500-3000トランザクション)
  • 重複排除:メッセージ重複排除IDを利用して重複排除可能。

注意点

同じメッセージグループIDの場合、FIFOキューは順序を守るために、メッセージが削除されない限り次のメッセージは処理されません。
SQSトリガーのLambdaにおいてはエラーが発生するとSQSのメッセージは削除されないので、次に進むことができません。

動作イメージ

メッセージグループID A: message1->message2->message3

結果:message2でLambdaがエラーとなった場合、default visible timeoutが終わった後は、message2からの処理となる(message2が正常終了するかDLQに移動されるまでmessage3は処理されない)

メッセージグループID A: message1
メッセージグループID B: message2
メッセージグループID C: message3

結果:message2でLambdaがエラーとなった場合でも、message3の処理が可能。

対処方法

  • 複数回失敗してDLQに入るのを待つ
  • 別のキューに入れるなどしてLambdaを正常終了させる(SQSのメッセージを削除する)
  • 順序が重要でない場合などはそもそも、メッセージグループIDを変える(バラバラにする
    )*そもそもFIFOキューの必要性があるかを検討した方がいいと思われる

Discussion