仕組みから学ぶ Web

運用 / 開発プロセス

壊さずに届け、壊れたら気づく

リリースは「デプロイして終わり」ではない。同じ成果物がどの環境でも同じように動く保証、壊れたときに戻せる仕組み、壊れていることに人間より先に気づく仕組み。テストはその一番外側の防波堤。

読み終わると、これに答えられるようになります

  • ?手元では動くのに本番で動かない、を構造的に潰すには何が要るか
  • ?アラートが多すぎて誰も見なくなる状態をどう避けるか
  • ?E2E テストを増やすほど開発が遅くなるのはなぜか
応用14分

CI/CD — 壊れていることに、人間より先に気づく

自動化そのものが目的ではない。「壊れた変更が本番に届かない」ことと「いつでも戻せる」ことを仕組みで保証する。

CI が落ちたまま3週間放置され、誰も赤信号を見なくなっていた

応用14分

コンテナ — 「手元では動く」を構造的に潰す

仮想マシンとの違いはどこか。イメージが層でできていることが、ビルド時間とデプロイの両方を決める。

latest タグを使い続け、ロールバックしたら別のバージョンが起動した

応用14分

ログと監視 — 誰より先に、壊れていることに気づく

ログは調査のため、メトリクスは検知のため、トレースは特定のため。3つの役割を分けて設計する。

アラートが1日200件届き、本物の障害通知が埋もれて3時間気づかなかった

応用15分

テスト戦略 — どこに何枚の網を張るか

テストは多いほど良いわけではない。壊れやすさ・実行時間・書く手間のバランスをどこで取るか。

E2E テストを増やした結果、CI が40分かかり、落ちても誰も原因を調べなくなった

応用15分

インシデント対応 — 直すのが先か、分かるのが先か

原因が分からないまま戻すのは怖い。その感覚が復旧を遅らせる。止血と原因究明の順序、記録の残し方、そして再発防止に「気をつける」と書かないこと。

原因を突き止めてから直そうとして、復旧が3時間遅れた

応用14分

秘密情報の扱い — 消したコミットの中に、鍵はまだ残っている

誤ってコミットしたアクセスキーを次のコミットで消した。半年後にリポジトリを公開した数時間後、そのキーで高額なサーバーが大量に立ち上がった。漏れた鍵に効くのは削除ではなく、無効化。

消したはずのアクセスキーが Git の履歴に残っていて、リポジトリを公開した数時間後に悪用された

応用14分

フィーチャーフラグ — 消し忘れたスイッチが、本番を壊す

使われていないフラグの名前を再利用したら、デプロイに失敗していた1台だけが3年前のコードを動かした。フラグはデプロイと公開を分ける道具で、分けたぶんだけ本番の状態の数が増える。

使われていないフラグの名前を再利用したら、1台だけが3年前の機能を動かし、誤った価格の注文が2時間続いた

応用15分

バックアップと復旧 — 取れていることと、戻せることは別

毎日バックアップを取っていた。3年間、一度も失敗していなかった。いざ戻そうとしたら、復旧に11時間かかると分かった。

毎日のバックアップは3年間成功していた。戻す段になって、11時間かかると分かった

応用15分

設定の管理 — 環境ごとに違う値を、どこに置くか

検証環境のつもりで流したバッチが、本番の顧客にメールを送った。設定が欠けたとき、安全側に倒れるか危険側に倒れるかで結果が変わる。

検証環境で流したバッチが、本番のメール配信サービスを叩いて顧客に届いた

応用15分

バッチと定期ジョブ — 途中で落ちたとき、もう一度流して大丈夫か

夜間の請求バッチが 3,200 件目で止まった。朝、担当者が最初から流し直した。最初の 3,200 人に、請求が 2 回届いた。バッチは必ず途中で止まる。だから、どこからでも流し直せる形にしておく。

夜間の請求バッチが 3,200 件目で止まり、朝に最初から流し直したため、3,200 人に請求が 2 回届いた

発展16分

SLO とエラーバジェット — どこまで壊れてよいかを、先に数字で決める

アラームは 1 日 80 件鳴っていた。当番は見なくなり、決済の 5% が失敗していた 2 時間に誰も気づかなかった。鳴らすべきは「何かがおかしい」ではなく、「利用者との約束を、このままだと守れない」とき。

アラームが 1 日 80 件鳴り続けて当番が見なくなり、決済の 5% が失敗していた 2 時間に誰も気づかなかった