Table of Contents
Blue-green 展開は、現在、トラフィック(青)と 1 のアイドル(緑)を稼働させる2つの同一の生産環境を実行することによって、ダウンタイムとリスクを削減するリリース管理戦略です。アプリケーションの新しいバージョンが準備ができたら、それは、非アクティブ環境に展開され、徹底的にテストされ、トラフィックがオンにされます。このアプローチは、メンテナンスウィンドウの必要性を排除し、即時のロールバックを有効にし、古いと新しいコード間のクリーンな分離を提供します。もともと、Martin Fowler と Jumble パイプラインが人気を博しています。Deved は、特に、Dev-CI のコーナーを兼ね備えています。
なぜブルーグリーン展開のマター
従来の展開方法 - 転がりの更新やカナリアリリースのような - ユーザーは、移行中に部分的なダウンタイムまたは劣化したパフォーマンスをユーザーに露出します。 青緑色の展開は、新しい環境を完全に動作させ、新しい環境が検証されるまで、このアドレスを置きます。 これは、ミッションクリティカルシステムにも、頻繁にデプロイする自信を与えます。 主な利点は次のとおりです。
- ゼロダウンタイム展開:[アプリケーションが利用できなくなったときのウィンドウがなくなります。
- インストールされたロールバック:[]] 問題が発生した場合は、秒単位で古い環境へのトラフィックを反転します。
- ] 生産中のテストを分離:[ ユーザに影響を与えずに、実際の条件下で新しいバージョンを検証します。
- [ 簡易データベースのマイグレーション:[]] は、慎重にスキーマのバージョン設定と後方互換性で処理できます。
- チーム速度の改善:[開発者は、より頻繁により少なく恐怖で解放することができます。
CI/CD パイプラインによるブルーグリーン展開の統合
CI/CD パイプラインは、ビルド、テスト、およびデプロイメントフェーズを自動化します。 青緑色と組み合わせると、パイプラインは環境切り替えのオーケストレーターになります。 典型的なフローは、このように見えます:
- [ビルドとテスト:[]]]コードはビルドをトリガーします。 ユニットテスト、統合テスト、およびセキュリティスキャンはパイプラインで実行されます。
- []非アクティブ環境への依存:[パイプラインは、現在トラフィック(例えば、青がアクティブの場合、緑色)を処理しない環境にアーティファクトをデプロイします。
- []スモークとアクセステスト:[[] 新機能、パフォーマンス、データの一貫性を検証するために、自動テストが新しい環境に対して実行されます。
- []Switch Traffic:]]] ロードバランサーまたはDNSレコードが更新され、すべてのユーザーのトラフィックを新しい環境にルーティングします。
- []ポストドプloyment Validation:[健康チェックとモニタリングは、クールダウン期間を継続します。
- クリーンアップ(オプション):]]]) 古い環境は、ロールバックターゲットとして保存するか、クールダウン期間後に破壊されます。
二つの環境を構成する
環境のパーリティは重要です。青と緑の環境は、アプリケーションバージョンの例外でハードウェア、構成、ネットワークトポロジー、データと同一でなければなりません。 テラフォーム、クラウドフォーメーション、またはプーリなどのインフラを同じテンプレートから両方の環境を規定するために使用してください。 データベースのレプリケーションは、両方の環境が同じデータセットを共有できるように設定する必要があります(または、安全なスキーマの変更を可能にするマイグレーション戦略を持っています)。
データベースの検討
特にデータベース - 青緑色の展開を複雑に。 一般的なアプローチには、
- []後方互換性のマイグレーション:[ 古いコードと新しいコードの両方で動作する変更を適用します(例えば、列を追加して、それらをドロップしません)。
- [] 複製と読み込みのレプリカ:[ 同じデータベースに両方の環境をポイントしますが、書き込みがアクティブな環境からのみ行われることを確認します。
- []シュマ・パー・環境:[]各環境のデータベースを分離し、移行ツールで同期を処理します。
FlywayやLiquibaseなどのツールは、青緑色のフローに安全である増分マイグレーションを管理できます。
交通切換えの自動化
トラフィックスイッチは、ロードバランサ(レイヤ7)、DNS(レイヤ4/7)、またはルータレベルで実装できます。クラウドネイティブの展開では、AWS ALB、Google Cloud Load Balancer、Kubernetes Service+Ingressなどのサービスがこのストレートフォワードになります。CI/CDパイプラインは、API呼び出しや設定の更新によるスイッチをトリガーする必要があります。主な考慮事項:
- 健康チェック:]]]] 通行許可前に、新しい環境が健康であることを確認しなければなりません。
- グレースフルドレイン:]] 回転から離脱される前の、古い環境は機内の要求を終了する必要があります。
- []セッションの持続性:[)アプリがスティッキーセッションを使用している場合は、スイッチがユーザーのコンテキストを破らないことを確認してください。 外部セッションストア(Redis、Memcached)を検討してください。
CI/CD でブルーグリーンをシンプルにするツール
CI/CD プラットフォームやデプロイメントツールは、青緑色の戦略をネイティブにサポートしています。以下は、最も人気のあるものの一部です。
ジエンキンズ と アニシブル または Spinnaker
Jenkinsは柔軟性が高く、Ansible playbook を呼び出すパイプライン手順を定義して、ロードバランサーの設定を更新したり、Spinnaker の組み込みの赤/黒の戦略を使うことができます。Spinnaker は、スイッチの前に手動で承認するためのビジュアルUIを提供します。
GitLab CI と 自動 DevOps
GitLab Auto DevOps には、Kubernetes にデプロイされた「青緑色の展開」ステージが組み込まれています。このステージでは、二つの展開(青と緑)と「アクティブセレクター」ラベルを反転するサービスが作成されます。 []]]]]GitLabのドキュメントは、ステップバイステップガイドを提供します。
AWS CodeDeploy による GitHub アクション
AWS CodeDeploy は、ブルーグリーンの展開をネイティブでサポートしています。 GitHub Actions ワークフローは、コードを S3 の Bucket にプッシュし、CodeDeploy アプリケーションリビジョンをトリガーできます。 デプロイメントグループは、新しいインスタンスを自動的にプロビジョニングし、健康を調べ、トラフィックをシフトします。 []]AWS のドキュメントでは、セットアップについて説明しています。
KubernetesのArgo Rollouts
Argo Rollouts は、青緑色を含む高度なデプロイメント戦略を提供します。イングレッシブコントローラーとサービスメッシュを統合し、トラフィックシフトを自動化します。ロールバックは宣言的であり、メトリックに基づいて自動的にトリガーできます。 []]Argo Rolloutsについての詳細を学ぶ。
生産段階の展開に最適なプラクティス
青緑色の実装は、サーバーを切り替えるだけではありません。 一般的な落とし穴を避けるために、以下のベストプラクティスに従ってください。
すべてを自動化
手動の手順は、エラーです。 パイプライン全体が、建物からトラフィックを切り替えるまで自動化されます。バージョン管理されたパイプラインの定義(例、 `Jenkinsfile`、`.gitlab-ci.yml`、ワークフロー YAMLs)を使用して、各デプロイ時にテストが自動的に実行されることを確認します。
機能フラグを使用する
リリースから展開をデカップリングする機能フラグで青緑色の機能を組み合わせます。新しい機能が隠されているコードをデプロイし、フラグ管理ツール(LaunchDarkly、PostHog、Unleash)で徐々に有効にすることができます。これは、一つの機能が失敗した場合、環境全体をロールバックする必要があることを避けます。
包括的なテストを実施
煙テストは、基本的なHTTPレスポンス、データベース接続、および重要なユーザー・ジャーニーを検証する必要があります。 同期監視ツール(例、チェックリー、Datadog 合成)を使用して、ブラウザのテストを切り替える前に、非アクティブ環境に対して実行します。 負荷テストを含むと、パフォーマンスの回帰をキャッチします。
連続して監視して下さい
スイッチの後、アプリケーションメトリック、エラーレート、レイテンシ、およびビジネスKPIを監視します。異常なしきい値が侵害されている場合、自動ロールバックをトリガーするために、アラート(PagerDuty、Opsgenie)を使用します。たとえば、5xxエラーが50%増加すると、古い環境へのトラフィックを反転します。
ステートフルなコンポーネントの計画
ファイルのアップロード、ユーザーセッション、ジョブキューには、注意深い処理が必要です。 外部共有ストレージ(S3、EFS)と、両方の環境がアクセスできる分散キャッシュ(Redis、Memcached)を使用します。 キューでは、スイッチ中にメッセージが失われないようにします。
クールダウン期間を定義する
トラフィックを切り替えた後、古い環境がセットタイム(例えば30分)で実行されているので、微小なバグが発見された場合に素早くロールバックできるようにします。その後、コストを節約するためにそれを解凍することができます。
課題とテーマを克服する方法
データベース スキーマのマイグレーション
最大の課題は、後方互換性を破るデータベースの変更を処理しています。 ソリューションには、以下が含まれます。
- 添加剤のマイグレーションのみを使用してください(列を追加し、それらをドロップしません)。
- 古い列を別のポストスイッチの移行で削除します。
- 新しいアプリバージョン前のデータベースの変更をデプロイし、古いコードがまだ実行できることを確認します。
コスト
同一の2つの生産環境を2つ動かすことで、インフラコストが倍増します。 移行:テスト中に、非アクティブ環境のインスタンスを小さくしたり、コンテナ化を使用して、リソースを基礎に共有したりします。 クラウド自動スケールは、廃棄物を減らすこともできます。
セッションとキャッシュウォームアップ
トラフィックスイッチが切れると、キャッシュが風邪になります。 切り替える前に、典型的なユーザー要求をシミュレートすることで、新しい環境を優先します。 ガトリングやk6などのツールは、現実的な負荷を生成できます。
ネットワーク構成
ファイアウォールルール、DNSレコード、およびSSL証明書は、環境間で同一でなければなりません。 IaCを使用して一貫性を確保します。 DNSベースの切り替えを使用する場合、伝搬時間(TTL)のアカウント。
リアルワールド例: E-コマースプラットフォーム
ダウンタイムなしで毎週新しい機能を展開するために必要な、毎日1,000万人のオンライン小売店。 これらは、次のセットアップで青緑色の展開を採用しました。
- ALBの背後にあるAWSオートスケーリンググループ(青、緑)。
- 同一インフラの整備に向け、テラフォーム
- GitLab CI パイプライン: ビルド、テスト、グリーンに展開し、Playwright 煙テストを実行し、ALB ターゲットグループスイッチをトリガーします。
- セッションが環境全体で共有されるのは、Redisです。
- データベースの移行: Flyway と後方互換性
- エラー率が5分に1%を1回の場合の自動ロールバック。
結果: 月間から週単位まで展開頻度が増加し、6ヶ月以上はゼロダウンタイムインシデントが増加しました。
コンテンツ
現代のCI / CDパイプラインと統合したブルーグリーンの展開は、ソフトウェアを安全に頻繁にリリースするための強力な方法を提供します。 ダウンタイムを排除し、即時のロールバックを可能にし、エンジニアは急速に変化をプッシュする自信を与えます。 データベースの移行やインフラストラクチャコストのような課題は存在しますが、慎重に計画し、適切なツーリングで管理することができます。 環境のプロビジョニングからトラフィック切り替えまで、プロセス全体を自動化することで、チームは最小限のリスクで継続的な配送を実現できます。 小規模なスタート、およびそこから、そこから、そこから必要なレベルの投資を実証し、そこから青緑色の応答を削減し、そこから成功を収めます。