APIのブルーグリーンデプロイメント:本番切り替え前のテスト戦略

ブルーグリーンデプロイメントはゼロダウンタイムを実現しますが、ヘルスチェックでは壊れたAPIを検出できません。切り替える前にApidogを使ってグリーン環境をテストする方法を学びましょう。

Ashley Innocent

Ashley Innocent

15 6月 2026

APIのブルーグリーンデプロイメント:本番切り替え前のテスト戦略

Apidog エンタープライズ

オンプレミスデプロイ

SSO & RBAC

SOC 2 準拠

Apidog Enterpriseを見る

ブルー/グリーンデプロイメントはゼロダウンタイムリリースを約束します。つまり、サービスの新しいコピーを立ち上げ、トラフィックを送信し、正常に見えたら切り替えます。問題は「正常」という言葉です。ロードバランサーのヘルスチェックは通常、1つのエンドポイントにpingを送信し、200の応答を待ちます。それはプロセスが稼働していることを示しますが、新しいビルドが正しいJSONを返すか、同じ契約を遵守しているか、あるいは古いバージョンと同じ方法でトークンを認証するかどうかについては何も教えてくれません。そのため、スイッチを切り替えると、最初の実際のユーザーがヘルスチェックでは見つけられなかったバグを発見することになります。

このガイドでは、本番トラフィックが到達する前に、ユーザーがするようにグリーン環境をテストする方法を説明します。アイドル状態のスタックに対してAPIテストのフルスイートを実行し、その結果に基づいて切り替えをゲートし、すべてのデプロイでそれが実行されるようにパイプラインに全体を組み込みます。デスクトップアプリで構築した同じテストシナリオを、任意の環境に対してCIで無人で実行できるため、テストレイヤーとしてApidogとApidog CLIを使用します。

もしすでにブルー/グリーンデプロイメントを実施しているものの、検証ステップを「しばらくクリックして確認する」程度に扱っているなら、これは信頼できるものに変える部分です。2つの同一の環境を実行する全体の目的は、現実的な条件下で一方を検証することです。ヘルスチェックは最低限のものであり、完全なものではありません。

TL;DR(要するに)

ブルー/グリーンデプロイメントは、2つの同一の本番環境を稼働させ、その間でルーターを切り替えます。ブルー(稼働中)からグリーン(新規)にトラフィックを切り替える前に、グリーン環境に対して直接APIテストのフルスイートを実行してください。スイートのグリーンビルドで切り替えをゲートします。Apidog CLIを使用して、パイプライン内のグリーンベースURLに同じテストシナリオを向け、いずれかのアサーションが失敗した場合はデプロイを失敗させ、その後初めてルーターを切り替えます。ヘルスチェックはプロセスが稼働していることを確認し、APIテストは契約が依然として有効であることを確認します。

ブルー/グリーンデプロイメントとは何か

ブルー/グリーンデプロイメントは、2つの本番グレードの環境を並行して保持するリリースパターンです。一方はライブトラフィックを処理し(これをブルーと呼びます)、もう一方はアイドル状態であり、次のバージョンを受け入れる準備ができています(これをグリーンと呼びます)。新しいビルドをグリーンにデプロイし、検証した後、単一のスイッチ(ロードバランサーのターゲット、DNSレコード、Kubernetesサービスセレクターなど)を変更することで、すべてのトラフィックがグリーンに流れるようにします。ブルーは次のリリースのためのアイドル状態のスタンバイになります。もし何かが壊れた場合、数秒でブルーに戻すことができます。

その魅力は明らかです。メンテナンスウィンドウがありません。切り替えはほぼ瞬時に行われます。そして、以前のバージョンがまだ稼働していて準備ができているため、ロールバックはこれ以上ないほど安価です。これをローリングデプロイメントと比較してみてください。ローリングデプロイメントでは、インスタンスをその場で置き換え、問題のあるビルドは気づいたときにはすでに一部のユーザーにサービスを提供しています。

しかし、このパターンが報われるのは、グリーン環境が切り替え時に本当に準備ができている場合だけです。その準備チェックこそ、ほとんどのチームが投資を怠る部分です。彼らはグリーンが起動し、浅い/healthピングに合格することを確認し、その後切り替えて期待するだけです。ブルー/グリーンデプロイメントの形態は、徹底的なチェックを容易にします。グリーンは完全にデプロイされ、到達可能ですが、公開トラフィックはまだ受信していないため、それをスキップする言い訳はありません。そこにテストされるのを待っている、本番環境の完全で分離されたコピーがあるのです。

まず、より広範なリリース戦略の用語を知りたい場合は、継続的デリバリー vs 継続的デプロイ vs 継続的インテグレーションに関する私たちの解説が、ブルー/グリーンデプロイメントがどこに位置するかを理解する上で役立ちます。

なぜヘルスチェックはテストではないのか

チームを悩ませるギャップはここにあります。典型的なヘルスチェックは次のようになります。

# ロードバランサーのヘルスプローブ
GET /health -> 200 OK -> ターゲットを正常とマーク

そのエンドポイントは通常、ハードコードされた{"status":"ok"}を返します。データベースにアクセスせず、認証を実行せず、実際の情報をシリアライズしません。すべてのビジネスエンドポイントが500、不正なペイロード、または古いスキーマを返すような状態でも、ビルドはこのプローブに合格することができます。

/healthピングが問題なく通過させてしまう障害モードを考えてみましょう。

これらのどれもプロセスが起動するのを妨げません。しかし、これらすべてはトラフィックを切り替えた瞬間に実際のユーザーを壊します。解決策は、よりスマートなヘルスチェックではなく、クライアントがエンドポイントを呼び出す方法で呼び出し、ステータスコード、レスポンスボディ、スキーマ、およびレイテンシについてアサートし、合否を報告する実際のテストスイートです。これはAPIコントラクトテストの背後にあるのと同じ規律です。つまり、稼働中のサービスが消費者が依存する合意と依然として一致しているかを確認しているのです。

ブルー/グリーンテストワークフローの全体像

これが私たちが構築しようとしているシーケンスです。新しいステップは「グリーンをテストする」であり、デプロイとスイッチの間に位置します。

  1. グリーンにデプロイする。 新しいビルドをアイドル状態の環境にプッシュします。たとえばhttps://green.internal.example.comのような内部アドレスでアクセス可能になりますが、まだ公開トラフィックは到達しません。
  2. グリーンをスモークテストする。 グリーンのクリティカルパスリクエストの高速なサブセットを実行します。ログインし、主要なリソースを取得し、1つ作成します。いずれかが失敗した場合、ここで停止します。ブルーは引き続きユーザーにサービスを提供しており、何も気づかれません。
  3. グリーンに対してフルスイートを実行する。 グリーンベースURLに向けた完全なAPIテストシナリオ(ハッピーパス、エラーケース、認証フロー、スキーマアサーション)を実行します。
  4. 切り替えをゲートする。 スイートが合格すれば続行します。何か失敗した場合、パイプラインは停止し、グリーンは破棄されるか検査のために残されます。本番環境は影響を受けません。
  5. スイッチを切り替える。 ルーター(ロードバランサー、DNS、またはサービスセレクター)をブルーからグリーンに再設定します。
  6. 本番環境で検証する。 切り替え後のライブURLに対して同じスモークテストを実行し、スイッチが正常に適用されたことを確認します。
  7. ブルーをウォーム状態に保つ。 ロールバックウィンドウのために古い環境を保持します。切り替え後のモニタリングで問題が発生した場合、すぐに元に戻します。

ポイントは、ステップ2、3、6が同じテスト定義を使用することです。シナリオを一度構築し、ランナーがターゲットとするベースURLだけを変更します。これが次に設定する機能です。

Apidogでテストシナリオを構築する

何かを自動化する前に、実行する価値のあるテストスイートが必要です。Apidogを使用すると、それを視覚的に構築し、何も書き換えることなくコマンドラインから実行できます。Apidogをダウンロードし、デプロイするサービス用のプロジェクトを作成してください。

プロジェクト内では、既存のAPIエンドポイントからテストシナリオを組み立てます。シナリオは、アサーションとステップ間の変数渡しを含む、順序付けられたリクエストのセットです。ブルー/グリーンの準備スイートには、単発のピングだけでなく、実際のクライアントが行うことを反映するシナリオが必要です。

注文サービスの実用的なスターターセットは次のとおりです。

ヘルスチェックが見落とす障害を検出するために最も重要な2つの機能があります。1つ目はスキーマアサーションです。Apidogは、そのエンドポイントのJSONスキーマまたはOpenAPI定義に対して応答を検証できるため、名前が変更されたフィールドや型が変更されたフィールドが本番環境に滑り込むのではなく、テストを失敗させます。2つ目は、特定の値、ヘッダー、および応答時間に対する応答アサーションです。これにより、日付形式の変更、数値が期待される場所でのnull、レイテンシの劣化など、微妙な変化を検出できます。

主要な設計上の決定は環境ハンドリングです。リクエストにhttps://blue.example.comをハードコードしないでください。ベースURLに環境変数を定義し、それをどこでも{{baseUrl}}として参照します。Apidogでは環境(本番、グリーン、ローカル)を設定してアクティブなものを切り替えるか、CLIから実行時にベースURLを上書きします。これは、環境とシークレット管理を備えたAPIクライアントに関する私たちのガイドで説明されているのと同じ環境とシークレットの規律です。テストはブルーとグリーンで同じままで、ターゲットだけが移動します。

これらのシナリオを単一の実行可能な単位にまとめたい場合は、Apidogのテストスイートが複数のシナリオをグループ化するため、1つのコマンドで完全な準備チェックを実行できます。

コマンドラインからスイートを実行する

デスクトップアプリはシナリオを構築およびデバッグする場所です。CLIは、パイプラインでグリーン環境に対してそれらを実行するものです。npmでインストールします。Node.js v16以降が必要です。

npm install -g apidog-cli

ランナーはCI構成からテストシナリオを実行します。Apidogでは、テストシナリオ用のCI構成を生成します。これにより、アクセストークンに紐付けられた実行コマンドが提供されます。基本的な形式は次のとおりです。

apidog run "https://api.apidog.com/api/v1/api-test/ci-config/<config-id>/detail?token=<token>" \
  -r html,cli \
  --out-file green-readiness

-rフラグはレポーターを選択します。cliは結果をターミナルに出力するため、パイプラインログにはどのアサーションが失敗したかが正確に表示されます。htmlは、デプロイをレビューする人のためにビルドアーティファクトとしてアーカイブできる自己完結型のレポートを書き込みます。結果を別のツールに供給したい場合は、JSONレポーターもあります。--out-fileフラグは出力に名前を付けるため、各実行がビルドにトレース可能になります。

スイートを具体的にグリーンに向けるために、ランナーは環境フラグを受け入れ、同じシナリオを異なるターゲットに対して実行できるようにします。

# 切り替え前にグリーン(アイドル)環境をテスト
apidog run "<ci-config-url>" \
  --environment <greenEnvironmentId> \
  -r cli,html \
  --out-file green-pre-switch

すべてをリポジトリに保持し、設定を取得するためのネットワーク呼び出しを避けたい場合は、エクスポートされたシナリオファイルから完全に実行を制御することもできます。

apidog run --exported-data ./tests/orders-readiness.json \
  --variables ./tests/green.variables.json \
  -r cli

パイプラインコンテキストでのランナーとそのオプションに関するより詳細な説明は、CI/CDでAPIテストを自動化する方法をご覧ください。ブルー/グリーンにとって重要な動作は終了コードです。アサーションが失敗すると、CLIはゼロ以外のコードで終了します。この単一の事実が、切り替えをゲートすることを可能にします。ゼロ以外の終了は、スイッチステップが実行される前にパイプラインを停止させます。

GitHub Actionsパイプラインへの組み込み

以下は、デプロイワークフロー内の検証ステップです。これは、以前のジョブがすでにビルドをグリーンにデプロイし、グリーンがランナーから到達可能であることを前提としています。このジョブはグリーンをテストし、テストが成功した場合のみ次のジョブがスイッチを実行します。

name: deploy-blue-green

on:
  push:
    branches: [main]

jobs:
  deploy-green:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: グリーン環境にビルドをデプロイ
        run: ./scripts/deploy-green.sh
      # グリーンは現在 https://green.internal.example.com でアクセス可能

  test-green:
    needs: deploy-green
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - name: Apidog CLIをインストール
        run: npm install -g apidog-cli
      - name: グリーンに対して準備スイートを実行
        run: |
          apidog run "${{ secrets.APIDOG_CI_CONFIG_URL }}" \
            --environment "${{ vars.GREEN_ENV_ID }}" \
            -r cli,html \
            --out-file green-readiness
      - name: HTMLレポートをアーカイブ
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: green-readiness-report
          path: ./green-readiness.html

  switch-traffic:
    needs: test-green        # test-greenが合格した場合にのみ実行される
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: ルーターをブルーからグリーンに切り替え
        run: ./scripts/switch-to-green.sh
      - name: 切り替え後の本番URLをスモークテスト
        run: |
          npm install -g apidog-cli
          apidog run "${{ secrets.APIDOG_SMOKE_CONFIG_URL }}" \
            --environment "${{ vars.PROD_ENV_ID }}" \
            -r cli

依存関係チェーンがゲートの役割を果たします。switch-trafficneeds: test-greenをリストしているため、準備スイートが失敗すると、スイッチジョブは決して開始されません。グリーンはアイドル状態を維持し、ブルーはサービスを継続するため、ダウンストリームの誰も影響を受けません。アーティファクトアップロードのif: always()は、失敗した場合でもHTMLレポートを受け取れることを意味し、まさにその時にそれを読みたいはずです。

CI設定URLとトークンはリポジトリシークレットとして保存し、決してインラインで記述しないでください。環境IDは機密情報ではないため、リポジトリ変数として保持できます。チームがGitLab、Jenkins、CircleCI、またはAzure Pipelinesで実行している場合でも、構造は同じです。ゼロ以外の値で終了するテストステージはスイッチステージをブロックします。GitHub ActionsでAPIテストを自動化する方法に関する私たちの解説では、ランナーの設定についてさらに詳しく説明しており、同じパターンがこれらのどのプラットフォームにも適用されます。

まずスモークテスト、次にフルスイート

グリーンに対してスイート全体を実行するのは正しいゲートですが、12分間の実行の8分目で完全に壊れたビルドを発見したくはないでしょう。検証を2つのパスに分けます。

スモークテストは、クリティカルパスをカバーする3〜5つのリクエストからなる小さなシナリオです。ログインし、1つのリソースを読み取り、1つ作成し、それを読み返します。これを最初に実行します。グリーンがこれらを実行できない場合、フルスイートは時間の無駄であり、早期に失敗させるべきです。これを30秒以内に完了させてください。

フルスイートはスモークテストが合格した場合にのみ実行されます。ここには広範なテストが含まれます。つまり、すべてのエンドポイント、エラーケース、エッジケース、すべての応答に対するスキーマ検証、認証の組み合わせ、ページネーション、レート制限ヘッダーなどです。これは時間がかかりますが、実際のユーザーの前の最後のゲートであるため、それで構いません。

この2層アプローチは、テストシナリオ vs テストケースという考え方と同じロジックに基づいています。スモークシナリオは迅速な信頼シグナルであり、フルスイートは網羅的なカバレッジです。両方とも同じグリーンのベースURLを指しますが、カバーする範囲と実行時期だけが異なります。

テストデータに関する注意点。グリーンは本番環境であるため、書き込みパスのテストが作成するものについては慎重に行ってください。記録をクリーンアップする専用のテストアカウントを使用するか、データ層を昇格させる前にステージングデータベースに支えられたグリーンインスタンスに対して書き込みテストを実行してください。目標は、本番データを汚染せずに動作を検証することであり、これはサンドボックスと真の本番テストの境界線です。

目的を台無しにするよくある間違い

チームはブルー/グリーンデプロイメントを採用しても、まだ障害を出荷することがあります。通常、それは次のいずれかです。

ブルー/グリーン対カナリア:テストが適合する場所

ブルー/グリーンは唯一のゼロダウンタイム戦略ではなく、テストのアプローチはそれぞれで異なります。

戦略 トラフィックの移動方法 APIテストの適合場所
ブルー/グリーン 一斉に、ブルーからグリーンへ 切り替えにグリーンに対してフルスイートを実行;ゲートは切り替え前
カナリア 徐々に、新しいバージョンに小規模な割合を流す カナリアセグメントに対する継続的なアサーション;クリーンなメトリクスに基づいて昇格
ローリング インスタンスごとに、その場で インスタンスごとのスモークチェック;ロールアウトがすでに進行中のため、ゲートが困難
再作成(Recreate) 古いものを停止し、新しいものを開始(ダウンタイムあり) ウィンドウ中にスイートを実行;ダウンタイムはトレードオフ

ブルー/グリーンは、テスト時にグリーンが完全にデプロイされ、完全に分離されているため、4つの中で最もクリーンなゲートを提供します。ユーザーへの露出ゼロで、検証するための完全な本番レプリカと、単一のアトミックなスイッチが得られます。カナリアは、そのクリーンなゲートを段階的な露出と引き換えにし、ライブモニタリングに強く依存します。ほとんどのAPIバックエンドサービスにとって、ブルー/グリーンと切り替え前スイートを組み合わせることは、メンテナンスウィンドウなしで高い信頼性を得るための最もシンプルな方法です。

実世界での応用例

決済APIを運用するフィンテックチームは、問題のあるデプロイが単なる表面的なバグではなく、取引の失敗を意味するため、すべてのリリースでブルー/グリーンデプロイメントを使用しています。彼らのゲートは、認証、べき等キー、通貨の丸め処理、ウェブフック署名をカバーする、グリーンに対する40のシナリオスイートです。フル実行には約6分かかります。全体が「グリーン」になるまで何も本番環境には到達せず、監査証跡のためにHTMLレポートが各デプロイに添付されます。

公開APIを持つSaaSチームは、より簡素なバージョンを実行しています。グリーンに対して12のシナリオによるスモークゲート、次に切り替え、そしてライブURLに対する切り替え後のスモークテストです。彼らの優先事項はスキーマのドリフトを検出することです。なぜなら、フィールドの形状が変わるとサードパーティの統合が大きな音を立てて壊れるからです。すべての応答に対するスキーマアサーションが彼らのゲートの中心です。

両チームはApidogでシナリオを一度構築し、すべてのプッシュでCLIから無人で実行します。デスクトップアプリはエンジニアがシナリオをデバッグおよび拡張する場所であり、パイプラインではそれらの同じシナリオがリリースゲートとなります。

結論

ブルー/グリーンデプロイメントは、すべてのリリースの前にアイドル状態にある、完全にデプロイされた本番環境の無料コピーを提供します。それを浅いヘルスプローブのみをチェックして無駄にするのは、チームがゼロダウンタイム戦略で障害を出荷する最も一般的な方法です。解決策は、スイッチを切り替える前に、ユーザーのようにグリーン環境をテストすることです。

これを一度設定すれば、すべてのデプロイが同じゲートを自動的に通過するようになります。Apidogをダウンロードして準備スイートを構築し、CI構成を生成し、スイッチステージの前にapidog runステップをパイプラインに組み込みましょう。あなたの最初の実際のユーザーが、あなたの最初の実際のテストであるべきではありません。

button

よくある質問

ブルー/グリーンデプロイメントとは簡単に言うと何ですか? 2つの同一の本番環境を稼働させ、その間でトラフィックをすべて切り替えることです。一方は(ブルー)ライブユーザーにサービスを提供し、もう一方は(グリーン)新しいバージョンを受け取ります。グリーンをテストし、その後単一のスイッチを切り替えてグリーンを稼働状態にします。ブルーは即時ロールバックのターゲットとして保持されます。

トラフィックを切り替える前に、グリーン環境をどのようにテストしますか? APIテストスイートをグリーン環境のベースURLに向け、切り替えステップの前にパイプラインで実行します。Apidog CLIを使用すると、グリーン環境に対してapidog runでシナリオを実行し、いずれかのアサーションが失敗した場合はデプロイを失敗させ、スイートが合格した場合にのみトラフィックを切り替えます。

なぜロードバランサーのヘルスチェックだけではブルー/グリーンに不十分なのですか? ヘルスチェックは通常、1つのエンドポイントにpingを送信し、200を確認するだけで、プロセスが稼働していることを証明するに過ぎません。名前が変更されたJSONフィールド、失敗したマイグレーション、壊れた認証フロー、またはスキーマの変更を検出することはありません。実際のAPIテストスイートは、応答ボディ、スキーマ、およびエラーケースについてアサートするため、ヘルスプローブが通過させてしまう障害を捕捉します。

デスクトップアプリで構築した同じAPIテストをCIで実行できますか? はい、できます。Apidogで視覚的に構築したシナリオは、Apidog CLIから変更なしで実行できます。シナリオのCI設定を生成し、GitHub Actions、GitLab CI、Jenkins、または任意のパイプラインでその設定を使用してapidog runを呼び出します。CLIは失敗時にゼロ以外の終了コードを返すため、デプロイをゲートできます。

テストにおけるブルー/グリーンデプロイメントとカナリアデプロイメントの違いは何ですか? ブルー/グリーンは、完全にデプロイされたグリーン環境をテストした後、すべてのトラフィックを一斉に切り替えるため、ゲートは切り替え前に行われます。カナリアは、トラフィックを小さな部分に徐々にシフトさせ、その部分のライブモニタリングに依存します。ブルー/グリーンはよりクリーンなリリース前のテストゲートを提供し、カナリアは段階的な実世界での露出を提供します。

グリーンの本番環境に対して書き込みパスのテストを実行すべきですか? データには注意してください。記録をクリーンアップする専用のテストアカウントを使用するか、データ層を昇格させる前にステージングデータベースに支えられたグリーンインスタンスに対して書き込みテストを実行してください。目標は、本番データを汚染せずに動作を検証することであり、これはサンドボックスと真の本番テストの境界線です。

切り替え前のテストゲートはどのくらいの速さであるべきですか? 分けて実行してください。クリティカルパスの3〜5つのリクエストからなるスモークテストを30秒未満で実行して高速に失敗させ、スモークテストが合格した場合にのみフルスイート(すべてのエンドポイント、エラーケース、スキーマチェック)を実行します。数十のシナリオからなる完全なゲートは通常数分で完了し、これはリリースゲートとしては許容範囲です。

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる