概要
ソフトウェア開発においてデプロイ戦略はサービスを安定して運用するための方法です。デプロイ戦略にはさまざまな種類があり、それぞれの特徴に応じて適切なデプロイ戦略を選択して使う必要があります。今回のブログポストでは、デプロイ戦略の種類と使い方について説明します。
インプレースデプロイ
インプレースデプロイ(In-place deployment)は金融機関やゲームのアップデートなど、ユーザーに通知をしてその時間にサービスを停止してアップデートする構造です。
- 運用中のサーバーを停止します。
- 新しいアプリケーションをデプロイします。
- 停止したサーバーを再起動します。
インプレースデプロイのメリットとデメリットは次の通りです。
メリット
- すべてのユーザーが常に同じバージョンのアプリケーションを使用します。
- 古いバージョンと新しいバージョンが同時に存在しないため、互換性の問題を考慮する必要がなく、互換性による問題が発生する可能性がありません。
- デプロイするための新しいインフラが要らなく、デプロイも簡単なため、コストが安いです。
デメリット
- サービスを一時停止する必要があります。
- デプロイをした後、問題が発生してロールバックする必要がある場合、サービスを停止する必要があるため、ロールバックが難しいです。
- デプロイ中に問題が発生すると、サービスの停止時間が長くなる可能性があります。
金融機関のように、古いバージョンと新しいバージョンが同時に存在すると重大な問題(金銭的な問題)になるサービスや、ゲームのように新しいバージョンを使わないと新しいアイテム、マップ、ゲームシステムを使えないサービスにはインプレースデプロイを使います。
ローリングデプロイ
ローリングデプロイ(Rolling-update Deployment)は運用できるサーバーの数が限られている場合、インプレースデプロイと違って中断せずにデプロイする必要がある場合に使う方法です。
- 現在運用中のサーバーのうち1つを外部(ユーザー)からアクセスできないようにします。
- アクセスがないか確認します。
- アクセスを停止したサーバーに新しいアプリケーションをデプロイします。
- デプロイしたサーバーを外部からアクセスできるようにします。
- 新しいサーバーが外部からアクセスできるか確認します。
- すべてのサーバーが新しいバージョンのアプリケーションになるまで1~5を繰り返します。
ローリングデプロイのメリットとデメリットは次の通りです。
メリット
- サービスを中断せずにデプロイできます。
- 複数のサーバーにデプロイするため、新しいバージョンのアプリケーションで問題がある場合、デプロイを中止したりロールバックすることができます。
- 複数のサーバーを最大限に活用してデプロイするため、負荷が分散されます。
デメリット
- サーバーの数が限られている場合、サーバー1台を停止してデプロイするため、一時的に他のサーバーに負荷がかかる可能性があります。
- 1台ずつデプロイするため、すべてのサーバーにデプロイするまでに時間がかかります。
- 旧バージョンと新バージョンが同時に存在するため、互換性があるアプリケーションを開発してデプロイする必要があります。
このデプロイ方法は運用資金が限られていてサーバーを増やすことができないサービスや会社で使い、中断せずにサービスを運用する時によく使います。
ブルーグリーンデプロイ
ブルーグリーンデプロイ(Blue/Green Deployment)はサーバーの制限がなく、サービスを中断せずにデプロイしたい場合、よく使われる方法です。新バージョンのアプリケーションをプロダクション環境でテストしたい場合にもこの方法を使います。
- 新バージョンをデプロイするためのサーバー(Green)を作ります。
- 新しく作ったサーバーに新アプリケーションをデプロイします。
- 新しいアクセスは新しいサーバーに流れるようにして、既存のサーバー(Blue)に新しいアクセスができないようにします。
- 新サーバーにアクセスする際、または新しいアプリケーションで問題が発生した場合、既存のサーバーにアクセスを流してロールバックします。
- 新しいサーバーのアクセスが特に問題がなければ、既存のサーバーを削除します。
ブルーグリーンデプロイのメリットとデメリットは次の通りです。
メリット
- サービスを中断せずにデプロイできます。
- 新バージョンと旧バージョンのサーバーがまだ存在するため、問題があった場合、ロールバックが迅速に行えます。
- 新バージョンと旧バージョンの切り替えが簡単なため、プロダクション環境で新バージョンをテストすることができます。
デメリット
- 新バージョンと旧バージョンのサーバーを準備するため、一時的なコストが2倍になります。
- 新バージョンが問題ないか確認してから、旧バージョンを削除するため、デプロイが完了するまで時間がかかります。
- デプロイを完了して前のバージョンのサーバーを削除した場合、ロールバックができません。ロールバックするためには前のバージョンをデプロイする必要があります。
新バージョンと旧バージョンがが同時に存在しても問題がないサービス、デプロイ中に既存のアクセスを強制的に切断しないので、SessionやSocketなどを使ってユーザーのアクセスを管理するサービスで使います。
カナリアデプロイ
カナリアデプロイ(Canary Deployment)はA/Bテストや新しいバージョンの機能のフィードバックが必要な場合、サービスのバージョンアップを慎重にしたい場合、開発中の機能をプロダクション環境でテストしたい場合に使えるデプロイ方法です。
- 新バージョンをデプロイするためのサーバーを準備します。
- サービスアクセス中の一部を新バージョンに切り替えます。
- 新しいバージョンが良いと判断された場合、ユーザーのアクセスを徐々に増やします。
- 良くないと判断された場合、前のバージョンのサーバーにユーザーアクセスを戻します。
- 新しいサーバーのアクセスが特に問題がなければ、前のサーバーを削除します。
カナリアデプロイのメリットとデメリットは次の通りです。
メリット
- A/Bテストや新しい機能の反応を観察して新しい機能を導入するかどうかを決めることができます。
- ロールバックが簡単です。
- モニタリングしながらデプロイできるため、より安全にデプロイできます。
デメリット
- 新しいバージョンと前のバージョンのサーバーを準備するため、一時的なコストが2倍になります。
- 新しいバージョンが問題ないか確認してから、前のバージョンを削除するため、デプロイが完了するまで時間がかかります。
- サービスを利用する人によって見る画面が異なる時があるし、新しい機能を使えなくなるため、UX不一致問題が発生する可能性があります。
新しい機能に対してA/Bテストをしたい場合、ユーザーアクセスが多い場合、このデプロイ方法を使います。また、開発中の機能をプロダクション環境でテストしたい場合にも使います。
完了
これでソフトウェア開発におけるサービスデプロイ戦略の種類と使い方について説明しました。このブログポストが現在運用中のサービスとリソースに応じて適切なデプロイ戦略を選択するのに役立てば幸いです。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。