デプロイとリリースの分離(feature-flagとの境界)
コードを本番に置くこと(deploy)と機能をユーザーに見せること(release)を切り離せば、深夜リリースも巻き戻し待ちも消える。ダークローンチとkill switchの原理を押さえます。
- 1.deploy(コードの本番配備)とrelease(機能のユーザー露出)は別の行為。分離するとリリース判断をデプロイの時刻・成否から切り離せる。
- 2.ダークローンチで本番に出してもフラグはオフ、トラフィックシフトで露出を割合制御、kill switchで即座に遮断、というのが露出制御の三段構え。
- 3.フィーチャーフラグはこの分離を実装する一手段にすぎない。境界は『再デプロイなしに挙動を変えられるか』。フラグは設定変更、デプロイはアーティファクト差し替え。
deploy と release は同じ行為ではない
多くの現場で「リリース」と「デプロイ」は同義語のように使われますが、原理的には別の操作です。deploy はアーティファクト(ビルド済みのコード)を本番環境に配置する行為、release はその中の機能を実際のユーザーに露出させる行為を指します。両者を一体で扱うと、「コードを本番に置く瞬間」と「ユーザーが新挙動を体験する瞬間」が必ず一致してしまい、リリースの判断がデプロイの時刻・成否・ロールアウト速度に縛られます。
この束縛を外すのが「デプロイとリリースの分離(decoupling)」です。分離が成立すると、デプロイは平日昼間に静かに完了させ、機能の露出だけを後から、別の人が、別のタイミングで、別の単位(ユーザー・割合・地域)で制御できます。
| 観点 | deploy(配備) | release(露出) |
|---|---|---|
| 変えるもの | 本番で動くアーティファクト | ユーザーが体験する挙動 |
| 操作の実体 | プロセス再起動・イメージ差し替え | 設定値・ルーティングの変更 |
| 巻き戻しコスト | 再デプロイ(分〜十分) | 設定反映(秒〜数秒) |
| 判断する人 | リリースエンジニア・CI | プロダクト・SRE・運用 |
| 望ましい頻度 | 高頻度・小バッチ | 機能・実験ごとに任意 |
分離の本質は「変更を本番に運ぶ」と「変更をユーザーに当てる」のリスクを別々に償却できる点にあります。デプロイのリスク(ビルド不整合・依存欠落・起動失敗)はデプロイ時に、露出のリスク(仕様の誤り・性能劣化・UX破壊)は露出時に、それぞれ独立して検出・巻き戻しできる。一体化していると両者のリスクが同時に降ってきて、原因の切り分けが難しくなります。
露出を制御する三つの原理
release を deploy から切り離したあと、露出そのものをどう刻むか。中核となる仕組みは三つで、いずれも「再デプロイせずに挙動を変える」という共通点を持ちます。
ダークローンチ(dark launch)
新しいコードパスを本番に配備しつつ、結果をユーザーに返さない状態で実行します。たとえば新検索エンジンを旧エンジンと並行して走らせ、応答は旧エンジンのものを返しながら、新エンジンの結果・レイテンシ・エラーだけを記録する。これにより本番トラフィックでの負荷・正しさを、ユーザーに影響を与えずに検証できます。露出ゼロのリリース、と言い換えてもよい段階です。
リクエスト
├─→ 旧パス(結果をユーザーへ返す)
└─→ 新パス(実行するが結果は捨てる/記録のみ)
観測: レイテンシ・エラー率・出力の一致率
トラフィックシフト(traffic shifting)
露出を割合で刻みます。1% → 5% → 25% → 100% のように、新挙動を見るユーザーの比率を段階的に上げる。割り当ては乱数ではなくユーザーIDのハッシュで決めるのが原則で、同じユーザーが毎リクエストで新旧を行き来する(フラッピング)のを防ぎます。これは デプロイ戦略 のカナリアと同じ発想ですが、ここではアーティファクトは1つのままで、露出割合だけを設定で動かす点が異なります。
kill switch(緊急遮断)
露出中の機能を即座にオフへ倒すスイッチです。要件は二つ。第一に反映が速いこと(再デプロイを挟まず、設定配信で秒オーダー)。第二にフェイルセーフであること——フラグ評価系自体が落ちても、既定値が安全側(=機能オフ、旧挙動)になるよう設計します。kill switch は「巻き戻し」ではなく「遮断」であり、デプロイ済みのコードはそのまま、露出だけをゼロに戻す操作です。
フラグ配信サービスへの接続が切れたとき、SDKが「最後に取得した値」を使うのか「ハードコードの既定値」に落ちるのかを必ず把握してください。新機能フラグの既定値が誤って「オン」になっていると、配信障害がそのまま全ユーザーへの一斉露出に化けます。新規フラグの既定値は常に旧挙動(オフ)に倒すのが鉄則です。
フィーチャーフラグとの境界はどこか
ここで頻出の誤解を解きます。「デプロイとリリースの分離=フィーチャーフラグ」ではありません。フラグは分離を実装する一手段にすぎず、分離はフラグ以外(ルーター設定、DNSウェイト、ロードバランサの重み、設定ファイル)でも実現できます。境界を定義すると次のようになります。
| 手段 | 変更の単位 | 反映の仕組み | 巻き戻し |
|---|---|---|---|
| デプロイ | アーティファクト全体 | プロセス・イメージ差し替え | 再デプロイ |
| 設定(コンフィグ) | 値・しきい値 | 設定の再読み込み | 値を戻す |
| フィーチャーフラグ | コード分岐の有効/無効 | フラグ評価(実行時) | フラグをオフ |
| トラフィックルーティング | 宛先の重み | LB・メッシュのルール | 重みを戻す |
判定基準は単純で、再デプロイせずに挙動を変えられるならそれは release 側の操作、アーティファクトの差し替えが要るなら deploy 側の操作です。フィーチャーフラグは「コード中に if 分岐を埋め込み、その真偽を実行時の外部設定で切る」もので、release をコードの粒度で制御したいときの道具です。一方トラフィックルーティングはインスタンスやバージョンの粒度で露出を制御します。粒度が違うだけで、どちらも「デプロイと分離された露出制御」という同じ目的に属します。
1つのバイナリ内で「この処理だけ新ロジック」と細かく切りたいならフラグ。バージョン丸ごと(v1.2 と v1.3)を併走させて比率を振るならルーティング(カナリア)。両者は排他ではなく、カナリアで新バージョンを5%に出しつつ、その中の特定機能をさらにフラグで絞る、という二重制御が実務では普通です。詳細は フィーチャーフラグ を参照してください。
分離が支払うコストと運用規律
分離はただではありません。第一のコストはコードパスの増加です。新旧両方のコードが本番に同居するため、if flag then 新 else 旧 の分岐がテスト対象を倍にし、組み合わせが指数的に増えます。第二はフラグの寿命管理です。露出が100%に到達し新挙動が定着したら、フラグと旧コードは速やかに削除する。放置すると「いつ消したか誰も知らない死んだフラグ」が積もり、ある日の設定ミスで旧コードが復活する事故を招きます。
第三は観測の必須化です。露出を割合で刻む以上、新旧それぞれの SLI(エラー率・レイテンシ)を分けて測れなければ、シフトを進めてよいか判断できません。これは プログレッシブデリバリと自動ロールバック が扱う統計判定そのものであり、分離はその前提を用意する基盤になります。
「ロールバックとは何を指すか」。deploy 側のロールバックは前バージョンのアーティファクトへ戻す再デプロイ(コストは分オーダー、起動・ウォームアップを伴う)。release 側のロールバックはフラグをオフ/ルーティング重みをゼロに戻す操作(秒オーダー、プロセスは無停止)。両者は別物で、分離設計の価値は「障害時にまず安い release ロールバックで止血し、原因を落ち着いて調べてから deploy ロールバックを判断できる」点にあります。露出を絞る判断は エラーバジェット の残量とも結びつけて行います。
まとめ
- deploy(アーティファクトの本番配備)と release(機能のユーザー露出)は別の行為。分離すると露出の判断を時刻・成否・速度から切り離せる。
- 露出制御の三段構えはダークローンチ(露出ゼロで本番検証)・トラフィックシフト(割合で段階露出)・kill switch(即時遮断、フェイルセーフ既定値)。
- フィーチャーフラグは分離を実装する一手段にすぎない。境界は「再デプロイなしに挙動を変えられるか」。フラグはコード粒度、ルーティングはバージョン粒度。
- 分離のコストは分岐増・フラグ寿命管理・観測の必須化。死んだフラグの放置は事故源になるため寿命管理を運用規律に組み込む。
- release ロールバック(秒オーダー)と deploy ロールバック(分オーダー)は別物。まず安い release で止血し、落ち着いて deploy 判断、が分離の最大の利得。
DevOps/インフラ Article
デプロイとリリースの分離(feature-flagとの境界)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
DevOps
比較で見る軸
難易度: advanced / カテゴリ: DevOps/インフラ / タグ数: 6
導入後に効く点
ダークローンチで本番に出してもフラグはオフ、トラフィックシフトで露出を割合制御、kill switchで即座に遮断、というのが露出制御の三段構え。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- DevOps/インフラ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「DevOps / デプロイ」に近いか確認する。
- 強みである「deploy(コードの本番配備)とrelease(機能のユーザー露出)は別の行為。分離するとリリース判断をデプロイの時刻・成否から切り離せる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。