次の方法で共有


Azure Spring Apps におけるブルーグリーン デプロイ戦略

Note

BasicStandard、および Enterprise プランは、2025 年 3 月中旬から廃止され、3 年間の提供終了期間となります。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の提供終了のお知らせ」を参照してください。

Standard 従量課金プランと専用プランは、2024 年 9 月 30 日以降は非推奨となり、6 か月後に完全にシャットダウンされます。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の Standard 従量課金プランと専用プランを Azure Container Apps に移行する」を参照してください。

この記事の適用対象: ✔️ Basic または Standard ✔️ Enterprise

この記事では、Azure Spring Apps でのブルーグリーン デプロイのサポートについて説明します。

Azure Spring Apps (Standard プラン以上) では、すべてのアプリに対して 2 つのデプロイが許可され、そのうちの 1 つだけが運用トラフィックを受信します。 このパターンは、通常、「ブルーグリーン デプロイ」と呼ばれます。 Azure Spring Apps では、ブルーグリーン デプロイが、継続的デリバリー (CD) パイプラインおよび厳格な自動テストと共にサポートされているため、信頼性の高いアジャイル アプリケーション デプロイが可能になります。

交互のデプロイ

Azure Spring Apps でブルーグリーン デプロイを実装する最も簡単な方法は、2 つの固定デプロイを作成し、運用環境のトラフィックを受信していないデプロイに、常にデプロイすることです。 Azure Pipelines の Azure Spring Apps タスクを使用すると、UseStagingDeployment フラグを true に設定するだけで、このようなデプロイを実現できます。

ここでは、交互のデプロイのアプローチが実際にどのように機能するかを示します。

アプリケーションに deployment1deployment2 の 2 つのデプロイがあると想定します。 現在、deployment1 が運用デプロイとして設定されており、アプリケーションのバージョン v3 を実行しています。

そのため、deployment2 がステージング環境のデプロイになります。 したがって、継続的デリバリー (CD) パイプラインの実行準備が整うと、アプリの次のバージョン、すなわち、バージョン v4 が、ステージング環境のデプロイ deployment2 にデプロイされます。

運用トラフィックを受信していする v3 を含む deployment1 と v4 をステージングしている deployment2 を示す図。

deployment2v4 が起動された後、プライベート テスト エンドポイントを使用して、それに対して自動および手動のテストを実行し、すべての期待値が v4 によって満たされることを確認できます。

deployment2 にデプロイされており、テスト中の V4 を示す図。

v4 を信頼できる場合は、deployment2 を運用デプロイとして設定して、すべての運用トラフィックを受信するように設定することができます。 ロール バックを必要とする重大な問題が検出された場合は、deployment1 での v3 の実行が維持されます。

運用トラフィックを受信している deployment2 の V4 を示す図。

この時点では、deployment1 がステージング環境のデプロイです。 そのため、デプロイ パイプラインの次の実行は deployment1 にデプロイされます。

deployment1 にステージングされている V5 を示す図。

この時点で、deployment1 のプライベート テスト エンドポイントで V5 をテストできます。

deployment1 でテストされている V5 を示す図。

すべての期待値が v5 によって満たされた後、最終的に、運用デプロイとして deployment1 をもう一度設定します。これにより、運用環境のすべてのトラフィックは v5 によって受信されるようになります。

deployment1 で運用トラフィックを受信している V5 を示す図。

交互のデプロイ アプローチのトレードオフ

交互のデプロイ アプローチは、新しいデプロイを作成する必要がないため、シンプルで高速です。 ただし、次のセクションで説明するように、いくつかの欠点があります。

永続的なステージング環境のデプロイ

ステージング環境のデプロイは常に実行されたままであり、そのため、Azure Spring Apps インスタンスのリソースが消費されます。 このため、Azure Spring Apps 上の各アプリケーションのリソース要件は実質的に 2 倍になります。

承認の競合状態

上記のアプリケーションで、アプリケーションの新しい各バージョンが運用環境のトラフィックを受信できるようになる前に、リリース パイプラインによって手動での承認が要求されると想定してください。 ここでは、1 つのバージョン (v6) がステージング環境のデプロイで手動承認を待つ間に、デプロイ パイプラインが再度実行され、新しいバージョン (v7) で上書きされるリスクが生じます。 その後、v6 の承認が付与されると、v6 をデプロイしたパイプラインによってステージング環境のデプロイが運用として設定されます。 しかし、この時点では、それは承認されている v6 ではなく、承認されていない v7 になります。当該のデプロイにはそれがデプロイされ、トラフィックの受信が行われます。

このセクションで説明している、承認の競合状態を示す図。

以前のすべてのバージョンのデプロイ フローが完了するか中止されるまで、1 つのバージョンのデプロイ フローを開始できないようにすることで、競合状態を防止できる場合があります。 承認の競合状態を回避するもう 1 つの方法は、以下で説明する名前付きデプロイ アプローチの使用です。

名前付きデプロイ

名前付きデプロイ アプローチでは、デプロイされるアプリケーションの新しいバージョンごとに新しいデプロイが作成されます。 そのアプリケーション用にカスタマイズされたデプロイでアプリケーションがテストされた後、そのデプロイが運用デプロイとして設定されます。 以前のバージョンを含むデプロイについて、ロールバックが不要であることを確信できるだけの十分な時間、存続を許可することができます。

次の図では、デプロイ deployment-v5 でバージョン v5 が実行されています。 デプロイがこのバージョン専用に作成されたため、ここでは、デプロイの名前にバージョンが含まれます。 当初、これ以外のデプロイは存在しません。 ここで、バージョン v6 をデプロイするために、デプロイ パイプラインによって新しいデプロイ deployment-v6 が作成され、そこにアプリのバージョン v6 が配置されます。

このセクションの説明に従っている、名前付きデプロイでの新しいバージョンのデプロイを示す図。

別のバージョンが同時にデプロイされるリスクはありません。 まず、2 つのデプロイが既に存在している間は、Azure Spring Apps では、3 つ目のデプロイの作成は許可されません。 次に、2 つを超えるデプロイを持つことができたとしても、各デプロイは、それが含むアプリケーションのバージョンによって識別されます。 したがって、v6 のデプロイを調整するパイプラインによって運用デプロイとしての設定が試みられるのは deployment-v6 のみです。

deployment-v6 にデプロイされており、運用トラフィックを受信している v6 を示す図。

新しいバージョン用に作成されたデプロイによって運用環境のトラフィックが受信された後、将来のデプロイに向けてスペースを確保するために、以前のバージョンを含むデプロイを削除する必要があります。 新しいバージョンで重大な問題を検出した場合に、前のバージョンにロールバックできるように、数分または数時間遅らせることをお勧めします。

フォールバック期間の後に前のデプロイが削除されることを示す図。

名前付きデプロイ アプローチのトレードオフ

名前付きデプロイ アプローチには、次の利点があります。

  • 承認の競合状態が回避されます。
  • ステージング環境のデプロイが使用されない場合に、それを削除することで、リソースの消費量が削減されます。

ただし、次のセクションで説明するように、欠点もあります。

デプロイ パイプラインのエラー

デプロイが開始され、ステージング環境のデプロイが削除されるまでの間に、別のデプロイ パイプラインの実行が試みられると、失敗します。 パイプラインは新しいデプロイの作成を試みますが、それにより、エラーが発生します。これは、Azure Spring Apps アプリケーションごとに許可されるデプロイが 2 つのみであるためです。

そのため、デプロイ オーケストレーションには、失敗したデプロイ プロセスを後で再試行する手段、または、以前のすべてのバージョンでフローが完了するまで、各バージョンのデプロイ フローをキューに残す手段を持たせる必要があります。

次のステップ