Safe release practices
Skill goonobu-dot/dev-skills-library/skills/safe-release-practices
Safe production release practices from Google SRE, Netflix, Microsoft, Meta, and Uber: canary and staged rollouts, roll-back-first incident response, feature flag taxonomy and cleanup discipline, fault injection testing, and blameless postmortems. Use when planning a production deployment or release strategy, adding feature flags, responding to a production incident, or when the user says 本番リリース, カナリア, フィーチャーフラグ, ポストモーテム, 障害報告書. Not for CI pipeline configuration (use ci-cd-hardening) or debugging the failure itself (use systematic-debugging).From its SKILL.md
npx -y skills add goonobu-dot/dev-skills-library --skill safe-release-practicesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
10.8 KB, ~3.7k tokens by cl100k_base, as published. Nobody here has run it
Safe Release Practices
本番への変更は「出す瞬間の安全機構」と「障害を学習に変える仕組み」の両方がなければ安全とは言えない。段階的に出し、悪化したら自動で戻し、起きた障害は個人の懲罰ではなく仕組みの改善に変換する。
鉄則(Iron Law)
- 変更は一度に全トラフィックへ出さない。 小さい割合・限定範囲から段階的に広げる。
- 異常検知時は「まずロールバック、原因調査は後」を徹底する。 MTTR最小化を原因特定より優先する。ロールバックは「修正」ではなく被害の遮断であり、systematic-debugging の「根本原因を先に特定する」原則はロールバック後の恒久修正フェーズに適用する。
- カナリアの良し悪しは人の目視ではなく、事前定義した閾値とメトリクスで自動判定する。
- フィーチャーフラグは目的別に分類し、Release Toggleは役目を終えたら独立コミットで確実に除去する。
- ポストモーテムは個人ではなく役割で書き、懲罰ではなく再発防止のアクションアイテムを主産物とする。
作業手順
ステップ1: 段階的ロールアウトを設計する
- 変更を一度に全体へ出さず、まず小さい単位(1台、1リージョン、1%のトラフィック)に限定して出す。
- 地理・時間帯の異なる複数ステージに分けて展開する。トラフィックの日次サイクルや地域特性起因の問題は単一ステージでは検出できない。
- カナリア群と対照群(ベースライン)を同一条件で比較できるようにトラフィックを分割する。
ステップ2: 自動判定の仕組みを用意する
- エラー率・レイテンシ・CPU等、事前定義したメトリクスをカナリアとベースラインの双方で収集する。
- 「悪化」と判定する閾値を事前に決めておく。判定はその場の目視ではなく、統計的な比較で行う。
- 判定結果に応じて「自動昇格」「自動失敗(ロールバック)」「人による承認待ち」に分岐させる。
- 判定ロジックとメトリクス定義はコードとして管理し、次回のリリースでも再利用する。
ステップ3: 異常発生時に動く
- 閾値超過を検知したら、原因調査より先に自動ロールバックを実行する。
- ロールバック後に原因調査へ移る。「原因が分かるまでロールバックしない」を避ける。
- 監視・可観測性のための新規デプロイ(新しいテレメトリサービス等)も、本番機能追加と同じ厳格さ(段階的ロールアウト・負荷試験)で扱う。「監視のためだから安全」という思い込みを避け、既存のコントロールプレーンへの追加負荷を事前に見積もる。
ステップ4: フィーチャーフラグを分類・運用する
- フラグ追加時に目的別へ分類する。
- Release Toggle: 未完成コードを安全に隠す。短命。リリース後は速やかに除去する。
- Experiment Toggle: A/Bテスト用。実験終了で除去する。
- Ops Toggle: 運用者が挙動を制御する。長命、恒久的に残ってよい。
- Permission Toggle: 特定ユーザー群への機能公開。ライフサイクルは事業判断に従う。
- Release ToggleとOps/Permission Toggleを同じ設定ファイル・同じ管理ライフサイクルで扱わない。寿命も削除責任者も異なる。
- コードの分岐点を最小限にする。機能内部の全箇所をif分岐で汚染せず、エントリーポイント(ルーティング層)だけで切り替える。
- フラグの棚卸しを定期的に行い、役目を終えたフラグを検出・削除する。フラグ除去は独立したコミットとして扱い、他の変更と混ぜない(構造変更と振る舞い変更を分離する原則と同じ理由)。
ステップ5: 障害への耐性を事前検証する
- フェイルオーバーや冗長化の仕組みは「実装しただけ」では信頼しない。実際に発動するかを自動テスト(障害注入テスト)で検証し、CIに組み込んでリリースのたびに実行する。
- 想定される障害シナリオごとにPlaybook(対応手順書)を作成する。Playbookのないミティゲーションは未完成とみなす。
- Playbook自体を定期的に演習(ゲームデー等)で実際に辿り、古くなっていないか検証する。
- カオスエンジニアリングを行う場合は「このコンポーネントが落ちても、システムはこう振る舞うはずだ」という具体的仮説を立ててから障害を注入する。ブラストラジウス制御(対象範囲の限定、即時中断スイッチ)を必ず用意する。
ステップ6: ブレームレス・ポストモーテムを書く
- 個人名ではなく役割で記述する(「担当エンジニアが」であり実名を出さない)。
- 「その時点で入手可能な情報から見て、関係者は合理的な判断をした」という前提で書く。個人の懲罰を目的としない。
- タイムライン・影響範囲・根本原因・再発防止アクションアイテムを分けて記載する。アクションアイテムには担当と期限を必ずつける。
- ユーザー影響(データ不整合・古い情報表示等)を明確に切り分けて報告し、データ損失の有無を最優先で確認・開示する。
- 再現性が低い・原因不明の障害は、個別事象への固執をやめ、大量データ(ログ・コアダンプ等)を集約した母集団分析で統計的パターンを探すことも検討する。
- 組織全体で共有し、他チームが同種の問題を抱えていないか横展開して確認する。
チェックリスト
リリース計画時:
- 変更は段階的ロールアウト(小さい割合→拡大)で設計されているか
- カナリア判定は人の目視ではなく事前定義の閾値・メトリクスで自動化されているか
- 悪化検知時に自動ロールバックする経路があるか
- 新しいフィーチャーフラグは4分類のどれかに位置づけられているか
- フェイルオーバー等のミティゲーションに対応する障害注入テストがあるか
インシデント対応時:
- 原因調査より先にロールバックを実行したか
- ユーザー影響・データ損失の有無を最優先で確認したか
ポストモーテム作成時:
- 実名ではなく役割で記述しているか
- タイムライン・影響範囲・根本原因・アクションアイテムが分けて書かれているか
- アクションアイテムに担当と期限があるか
定期棚卸し:
- 役目を終えたRelease Toggleが残っていないか
- フラグ除去は他の変更と混ぜず独立コミットになっているか
- Playbookは最新のシステム構成と乖離していないか(演習で確認したか)
アンチパターン集
| やりがちな思考 | 現実 |
|---|---|
| 「小さい変更だから全トラフィックに一気に出そう」 | 変更の大小と障害インパクトは比例しない。段階的ロールアウトを常に基本形にする |
| 「カナリアの様子を少し見て、大丈夫そうなら昇格しよう」 | 目視確認は見落としと属人化を招く。事前定義の閾値とメトリクスで自動判定する |
| 「原因が分かるまでロールバックは待とう」 | 原因調査を優先すると被害時間が伸びる。まずロールバック、原因調査は後 |
| 「監視用の変更だから慎重にしなくていい」 | 監視コンポーネント自体が新たな障害点になり得る。本番機能と同じ厳格さで扱う |
| 「このフラグはもう使っていないはずだから放置でいい」 | 放置されたRelease Toggleは技術的負債と誤動作の温床になる。定期棚卸しで確実に除去する |
| 「フラグ除去も他の修正と一緒にコミットしてしまおう」 | フラグ除去と機能修正を混ぜると、問題発生時にどちらが原因か切り分けられなくなる |
| 「ポストモーテムで担当者の名前を出して反省を促そう」 | 個人の懲罰化は次回以降の正直な報告を妨げる。役割で書き、仕組みの改善に焦点を当てる |
| 「フェイルオーバーは実装したから大丈夫」 | 実装しただけでは時間とともにリグレッションする。自動テストで実際に発動するか継続的に検証する |
出典
- Google SRE Workbook: Canarying Releases — https://sre.google/workbook/canarying-releases/ (CC BY 4.0)
- Google SRE Book: Reliable Product Launches — https://sre.google/sre-book/reliable-product-launches/ (CC BY 4.0)
- Google SRE Book: Postmortem Culture — https://sre.google/sre-book/postmortem-culture/ (CC BY 4.0)
- Netflix Tech Blog: Automated Canary Analysis at Netflix with Kayenta — https://netflixtechblog.com/automated-canary-analysis-at-netflix-with-kayenta-3260bc7acc69
- microsoft/code-with-engineering-playbook(MIT License)— https://github.com/microsoft/code-with-engineering-playbook (Reliability / Fault Injection Testing)
- Engineering at Meta: Rapid release at massive scale — https://engineering.fb.com/2017/08/31/web/rapid-release-at-massive-scale/
- GitHub Blog: October 21 post-incident analysis — https://github.blog/news-insights/company-news/oct21-post-incident-analysis/
- uber/piranha(Apache 2.0 License)— https://github.com/uber/piranha
- Martin Fowler: Feature Toggles (aka Feature Flags) — https://martinfowler.com/articles/feature-toggles.html
- Surfing Complexity: Quick takes on the recent OpenAI public incident write-up — https://surfingcomplexity.blog/2024/12/14/quick-takes-on-the-recent-openai-public-incident-write-up/
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.