
執筆者
M.N.
① Vueのupdatedフックでやらかした

Vue.jsのupdatedフックは、
雑に言うとVueコンポーネント内でDOMの更新があった際に自動的に発火するフックです。
本来はDOMの状態変化で何か処理をやりたいときに使うべきですが、この中でデバッグ目的で値の更新をしてしまい、無限ループに陥ってしまいました。
何かの値が更新される
→updatedが発火する
→updated内で値を更新する
→updatedが発火する……というように、
updated自体がさらにupdatedを呼ぶ、という状態でした。
さらに悪いことに、別の処理でupdated内で更新した値を監視しており、値が更新された際にメール送信処理が動くようになっていました。
つまり、
updatedが発火するたびにメール送信されてしまっていました。
➤幸いローカル環境から自分のアドレス宛にメールが来るだけで、その処理を記載したページを閉じればすぐに収まりましたが、数秒で50件以上のメールが送信されてしまっていました。
➁Sendgrid Webhookでやらかした

保守を担当しているとあるサービスではメール配信ドライバーとしてSendgridを使用しています。
SendgridにはSendgrid Webhookという仕組みがあり、メールの配信、開封、クリックなどのイベントを検知し、事前に指定したエンドポイントにリクエストを送ることが可能です。
この仕組みを利用して、イベントごとにWebサーバーでイベント詳細のパラメータを受け取り、開封数の取得やログの取得などの機能を実現しています。
この処理の中でも、無限ループをやらかしてしまいました。
前提として、システム全体の共通処理として、システムエラーが発生した場合にはエラー検知用のメールを管理者・開発者向けに配信しています。
このエラーメールも当然、Webhookのイベント検知の対象となっていました。
無限ループが起きた原因
01 Webhookに指定したエンドポイント内でエラーが発生
02 エラー検知メール配信
03 エラー検知メールでWebhookが発火
04 エンドポイントでエラー発生
事態の深刻化
通常時はエラーが発生するような処理ではなかったのですが、挙動の調査のためにデバッグのログをサーバー内に直接記載しようとしていました。
そのログ出力処理に構文ミスがあり、エラーが発生したことでこの事態になってしまいました。
この時は前述のupdatedフックの時と違い管理者・開発者全員にメールが配信されてしまい、他のメンバーやクライアントに3時間以上メールが届き続けるという事態にまでなってしまいました。
反省点と対策

上記の2ケースで、共通している点は下記と考えています。
反省点①
自動的に発火する仕組み内にその仕組みが呼ばれる処理を入れてしまったこと
➤自動的に発火するということは、意図しないタイミングで処理が発火する可能性が高いことを理解していませんでした。
便利な機能ではありますが、どういう場合に発火するかについてよく精査してから処理を入れるべきだったと思います。
反省点②
デバッグ目的で、深く精査せずに処理を書いてしまったこと
➤デバッグで本番のリリースには影響が無いからと、軽い気持ちで処理を書いてしまったことです。
調査時にログを大量に入れたりすることは良くありますが、特にローカル以外の環境に影響がある場合は構文ミスが無いかなどの最低限の確認は実施してから処理を入れるべきでした。
こちらの現象が発生した環境は、どちらもメール配信数に制限などは無い環境だったので処理が止まった後は影響はありませんでしたが、メール配信数に制限がある環境の場合は開発などに支障が出ていたと思います。
無限ループは一瞬で多くの処理が走り、場合によってはリソースを食いつぶしてしまうなどの危険性があると思います。
自動発火するイベント内の処理の扱いには気を付けていこうと思いました。













