CFアプリ開発と管理#14 Blue-Greenデプロイを使用してダウンタイムとリスクを削減

Blue-green展開は、BlueとGreenという2つの同一の運用環境を実行することにより、ダウンタイムとリスクを削減する手法です。 

いつでも、環境の1つだけが本番であり、本番環境はすべてのプロダクション・トラフィックを処理します。この例では、Blueは現在本番で、Greenは待機です。

新しいバージョンのソフトウェアを準備する際には、展開およびテストの最終段階が実際には存在しない環境（この例ではGreen）で行われます。ソフトウェアをGreenに展開して完全にテストしたら、ルーターを切り替えて、すべての着信要求がBlueに代わりGreenに行くようにします。 Greenは現在本番、Blueは待機です。

この手法を使用すると、アプリケーションのデプロイメントによるダウンタイムをなくすことができます。さらに、Blue-Greenデプロイによってリスクが軽減されます。 新しいバージョンのGreenで予期しないことが起こった場合は、すぐにBlueに戻って最後のバージョンにロールバックできます。

注：アプリケーションでリレーショナルデータベースを使用している場合は、Blue-Greenデプロイメントによって、アップデート中にGreenデータベースとBlueデータベースの間に不一致が生じることがあります。データの整合性を最大限にするには、後方互換性と前方互換性のために1つのデータベースを構成します。

注：データベースの移行など、時間のかかるタスクのメンテナンス・ウィンドウで静的保守ページを表示するように、ルートマッピングパターンを調整することができます。このシナリオでは、ルータはすべての着信要求をBlueからメンテナンスにGreenに切り替えます。

*注意事項: この記事は、Cloud Foundry Documentaion [Using Blue-Green Deployment to Reduce Downtime and Risk](https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html) (last updated: February 28, 2017) の独自の翻訳とコメントです。内容を保証するものではありません。*


## Blue-Green デプロイメント Cloud Foundryの例

この例では、簡単なアプリケーション「demo-time」から始めます。このアプリケーションは、"Blue time"と日付/時刻をサーバー上に表示するWebページです。

### ステップ1：アプリケーションをプッシュする
cf CLIを使用してアプリケーションをプッシュします。 サブドメイン "demo-time"でアプリケーションの名前を "Blue"にします。

~~~
$ cf push Blue -n demo-time
~~~


下の図に示すように、

* Blueは Cloud Foundryで稼動しています。
* CFルータは、demo-time.example.comトラフィックのすべてのトラフィックをBlueに送信します。

![スクリーンショット 2017-08-09 16.30.02.png](https://qiita-image-store.s3.amazonaws.com/0/42829/26959156-0338-fadd-9fc2-ef23840318a3.png "スクリーンショット 2017-08-09 16.30.02.png")

### ステップ2：アプリケーションを更新してプッシュする

今度はアプリケーションを変更してください。 まず、Webページの「Blue」という単語を「Green」に置き換え、アプリケーションのソースファイルを再構築します。 cf pushを再度実行しますが、アプリケーションに「Green」という名前を使用し、別のサブドメインを指定して一時的なルートを作成します。

~~~
$ cf push Green -n demo-time-temp
~~~


このプッシュ後：

* 元のBlueと更新されたGreenの2つのアプリケーション・インスタンスがCloud Foundry上で実行されています。

* CFルータは、`demo-time.example.com` のすべてのトラフィックをBlueに送信し続けます。 また、ルータは`demo-time-temp.example.com`のトラフィックをGreenに送信します。

![スクリーンショット 2017-08-09 16.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/42829/a49d896c-b40c-753e-0db3-7424e8ac0ef5.png "スクリーンショット 2017-08-09 16.35.26.png")



### ステップ3：元のルートを緑にマップする

両方のアプリケーションが起動しているので、すべての着信要求が Greenアプリ と Blueアプリに送られるようにルータを切り替えます。 これを行うには、元のURLルート（demo-time.example.com）をcf map-routeコマンドを使用してGreenアプリケーションにマッピングします。

~~~
$ cf map-route Green example.com -n demo-time
demo-time.example.comをGreen ...にバインドします。OK
~~~

`cf map-route`コマンドの後：

* CFルーターは、`demo-time-temp.example.com` のトラフィックをGreenに送信し続けます。
* 数秒以内に、CFルータは`demo-time.example.com`のトラフィックをBlueとGreenの間でロードバランシングを開始します。

![スクリーンショット 2017-08-09 16.37.41.png](https://qiita-image-store.s3.amazonaws.com/0/42829/6e63b420-2c50-30f7-8cf3-31a4d87cf0bf.png "スクリーンショット 2017-08-09 16.37.41.png")


### ステップ4：Blueへの経路をアンマップ

グリーンが正常に動作していることを確認したら、`cf unmap-route`コマンドを使用して、Blueへのルーティング要求を停止します。

~~~
$ cf unmap-route Blue example.com -n demo-time
Unbinding demo-time.example.com from blue... OK
~~~

`cf unmap-route`コマンドの後：

* CFルーターはBlueへのトラフィックの送信を停止します。 `demo-time.example.com` のすべてのトラフィックがGreenに送信されます。

![スクリーンショット 2017-08-09 16.41.56.png](https://qiita-image-store.s3.amazonaws.com/0/42829/bb9552fa-8267-1594-b387-dea6af38288c.png "スクリーンショット 2017-08-09 16.41.56.png")


### ステップ5：Greenへの一時的なルートを削除する

`cf unmap-route`を使用して、`demo-time-temp.example.com`というルートをGreenから削除することができます。 `cf delete-route`を使用してルートを削除したり、後で使用するために予約することができます。 また、変更をロールバックする必要がある場合に備えて、Blueを廃止することもできます。

![スクリーンショット 2017-08-09 16.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/42829/38ade1bf-1962-cec8-aecb-5772a2d2f23c.png "スクリーンショット 2017-08-09 16.43.48.png")


## 実装

Cloud Foundryのコミュニティメンバーは、Blue-Greenの導入プロセスを自動化するためのプラグインを作成しました。 これらには、

* [Autopilot](https://github.com/contraband/autopilot) オートパイロットは、Cloud Foundry Goプラグインであり、ハンドオフ、ゼロダウンタイムのアプリケーション・デプロイメントのためのサブコマンド、ゼロダウンタイムプッシュを提供します。
* [BlueGreenDeploy](https://github.com/bluemixgaragelondon/cf-blue-green-deploy)：`cf-blue-green-deploy`は、停止時間ゼロのデプロイに関連するいくつかのステップを自動化するCloud Foundryコマンドラインインターフェイス（cf CLI）用の、Goで書かれたプラグインです。