Cover image for The Warning That Took My Site Down Was in the Log the Whole Time

Jake Lundberg

数週間前、私は自分のサイトを約30分間誤ってダウンさせてしまいました。

GitHubのWebhook向けのキュー型パイプラインを構築していました。Cloudflare Workersが2つ必要です。1つはWebhookを受け取ってキューにイベントを投入するもので、もう1つはそれを取得してバックグラウンドで重い処理を行うものです。GitHubは10秒以内の応答を要求するため、即座に応答して実際の処理は後回しにします。

2つのWorkerが必要ということは、2回のデプロイが必要ということです。1つのコマンドにまとめました。

Cloudflareのビルドシステムが警告を表示しました。ビルドプロジェクトに紐づけられた名前でWorker名をconfig内の値で上書きするという内容でした。通常のデプロイ出力の真ん中に1行表示されただけでした。そしてコマンドは正常終了を示すゼロで終了しました。

この警告が実際に意味していたのは、2つ目のWorker(わずか0.39 KiB)が1つ目のWorkerの新しいバージョンとしてアップロードされ、本番トラフィックに昇格したということでした。そのWorkerはキューからの読み取り方法を知っていましたが、HTTPリクエストについて何も知りませんでした。サイトへのすべてのリクエストが例外をスローし、何が起こったのかを理解するまで続きました。

30分のダウンタイム。悪いデプロイからこれが二度と起こらないように再構築するまで、合計約2時間かかりました。

何もおかしいようには見えませんでした。configは正常でした。コマンドも正常でした。出力はこれまで実行してきた他のすべてのデプロイのように見えました。私を救えた可能性のある1行は、周囲の行と同じようにフォーマットされていました。何も止めませんでした。なぜならエラーではなかったからです。それは情報でした。

リスクはずっとそこにありました。何も示していませんでした。そしてトラフィックがそれを引き起こしました。

物理的な世界ではそうではありません。

工事現場の前を通り過ぎると、リスクが見えます。背後に何もない4階にいる人。歩道の上をクレーンが荷物を揺らしている。見た目以上に荷重がかかっている梁。プロセスやミーティングがなくても、それらに気づくことができます。リスクは目の前にあります。通り過ぎる人全員が、何らかの形でリスクを評価します。計画に署名した人だけではありません。

ソフトウェアにはそのようなものはありません。見るべきものが何もありません。リスクの高い変更と安全な変更は、画面上では同じものです。ただのテキストです。

だからリスクは誰かの頭の中に留まります。紙の上にも、チケットの中にもありません。

そしてその感覚を知っているはずです。計画会議で誰かがチケットについて説明していて、腹の底で「これは思ったよりひどいことになる」と感じることがあります。口に出すかもしれません。見積もりに追加ポイントが加わるかもしれません。しかし、作業に関する事実として、後で参照できる場所に書き留められることはほとんどありません。

この不可視性は、リリース後のリスクを隠す以上のことをします。最初に構築するものを変えてしまうのです。

チームに本当の締め切りを課して、何が削られるかを見てください。機能が削られることはありません。機能は目に見えるもの、デモで示されるものです。削られるのは、変なパスのテスト、サードパーティコールのタイムアウト時の処理、この処理が10倍の量で実行された場合に何が起こるかについての10分の考察です。その作業はただ消えてしまいます。誰もそれが起こっていないのを見ていないからです。誰も処理したエッジケースをデモしません。

そして「次のスプリントで修正する」というのは、目に見えるミスだけをカバーするものです。危険なものは品質基準をクリアして正常に見えます。グリーンでリリースされます。そして何週間か何ヶ月か後、インシデントとして独自のスケジュールで表面化します。

つまり、削った角とそれが引き起こしたインシデントは、ほとんど同じスプリントに登場することがありません。内部から見ると、2つの無関係な出来事のように見えます。

では、実際に何をすればいいのでしょうか?

可視化すること。それがすべてです。

新しいプロセスや委員会ではありません。ただそれを頭の中から出し、個々の変更の作業自体に書き出すことです。この変更はauthに触れる。あの変更は失敗パスのテストがない。もう1つは今四半期に2回壊れたシステムの一部に着地する。誰か他の人が見られる場所に書き留めましょう。

一度可視化されれば、2つのことが変わります。重み付けができるようになります。これは工事現場が無料で得られるものです。そして締め切りが来たときに、それを守ることができます。削り台に乗っている作業がようやく名前を持ちます。デモできる機能に対して毎回負ける漠然とした感覚ではなくなります。

あの警告はデプロイログにずっと残っていました。ただ周囲のものと同じように見えただけです。