BluemixのActive Deployサービスでダウンタイムなしでアプリケーションを更新

# はじめに
Bluemix上で動作中のアプリケーションをダウンタイムなしで更新するサービスがベーター版ですが提供されているようなので試してみました。

[Active Deployドキュメント](https://www.ng.bluemix.net/docs/services/ActiveDeploy/index.html)

Active DeployとBlue-Green Deploymentはどちらも利用者へのサービスの中断を避けるという基本原則は共通していますが、デプロイプロセスは少し異なるようで、Blue-Greenはデプロイ中の2つのバージョンが存在するときに片方にしかトラフィックが発生しないように制御されるが、Active Deployは両バージョンにトラフィックが使用可能になるタイミングがあるようです。

# 準備
1. CLI 用 Active Deploy サービス・プラグインのインストール  
`cf add-plugin-repo bluemix http://plugins.ng.bluemix.net/`  
`cf install-plugin active-deploy -r bluemix`

※Cloud Foundry CLIプラグインを未インストールの方は事前に下記よりインストールしておいてください。
[Cloud Founry CLIのダウンロード](https://github.com/cloudfoundry/cli/releases)
　
2. Active Deployサービスをカタログから追加
![151221-0001.png](https://qiita-image-store.s3.amazonaws.com/0/90622/1d1482b0-06fa-e98a-3f03-ca76297fa60c.png)

　
3. アプリケーションの準備
本番環境用に任意の名前のNode.jsランタイムを追加し、スターターコードをダウンロードします。
同様にテスト環境用にもう一つ任意の名前のNode.jsランタイムを追加し、こちらもスターターコードをダウンロードしておきます。
今回は、本番用アプリを「active-deploy001」、テスト用アプリを「active-deploy002」という名前に設定しました。
![151220-0002.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/e23ca9ed-1912-eac1-ac3f-4ae4b90b9c9e.gif)

テスト用アプリケーションのスターターコードのindex.htmlを編集し、cf pushでテスト用アプリに更新ファイルを反映させます。
これでテスト用のアプリケーションは更新されたアプリケーションになります。
（開発者用のテスト環境を想定しているためここではダウンが発生してもユーザーには影響はありません。）

■本番環境 (旧バージョン)
![151220-0008.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/8ea7d014-2b4c-c865-20bd-83431af34efe.gif)
■テスト環境（新バージョン）
![151220-0009.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/026036c0-a686-766a-34a7-8c8a8d51505e.gif)


今回は、旧バージョンで動いている本番環境「active-deploy001」を更新済で動作チェック済みの「active-deploy002」のバージョンに経路(URL)を変更せずに無停止で切り替えを行います。

# Active Deployの実行　
1. cf active-deploy-create current_version new_version コマンドの実行


それでは、変更を加えたアプリケーションをActive-Deployコマンドでデプロイを実行してみます。
`cf active-deploy-create current_version new_version`
　・current_version
　　アプリの元のバージョンを指します。
　・new_version
　　デプロイする新しいアプリケーションを指します。

下記エラーが返ってきました。

```
Creating deployment from active-deploy001 to active-deploy002 in space ebc41676-6c7a-4656-be7b-7e80c6285af2...
FAILED
BXNAD6210: Successor CF app 'active-deploy002' already has route 'active-deploy002.mybluemix.net'.  Start successor with --no-route
```

Active Deployで利用する新バージョンの環境に経路情報が含まれているとダメなようです。
テスト用アプリ「active-deploy002」にコマンドライン上で移動し、下記コマンドを実行します。
`cf push --no-route`
これでテスト用アプリの経路情報が無くなります。
![151220-0003.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/a1e42274-0abe-eb95-11c9-2c06c5292a6a.gif)

では、この状態で再度active-deployコマンドを実行します。
`cf active-deploy-create active-deploy001 active-deploy002`

うまく実行できれば下記のような実行結果が返ってきます。
![151220-0004.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/5027c388-2f22-6f5a-9de6-f06a119f03c5.gif)

本番用アプリケーションがダウンしないことを確認するために、pingコマンドなどで死活監視をしておきます。
　
2. 実行経過の確認
BluemixのダッシュボードからActive Deployサービスにアクセスします。
管理ページを表示すると進捗が表示されています。
![151220-0005.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/89574db3-cd88-db06-dfad-b276d6748e72.gif)

実行中のデプロイを選択すると更に詳細を確認することができます。
![151220-0006.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/72dc7d0e-654a-9ccc-febd-7514290f600f.gif)

起動フェーズ、テストフェーズ、停止フェーズという流れでデプロイメントが実行されることを確認できます。
各フェーズの時間を指定しなかった場合はデフォルトで下記の時間が設定されるようです。

* 起動フェーズ：5分
　- コマンドオプション：-u, --rampup time
* テストフェーズ：15分
　- コマンドオプション：-t, --test time
* 停止フェーズ：5分
　- コマンドオプション：-w, --rampdown time


ページ内の[現行のトラフィック]を見てみると、テスト用のアプリケーション側にトラフィックが移っていることが確認できます。

各フェーズが全て実行されたあと、ダッシュボードを確認してみると、active-deploy001からactive-deploy002に経路情報が移行されていることを確認できます。
![151220-0007.gif](https://qiita-image-store.s3.amazonaws.com/0/90622/3bf74cba-927a-8d81-37e6-8303e9f40f25.gif)

ping監視結果を見てみると特にダウンすることなく移行できたことを確認することができました。

![151221-0001.png](https://qiita-image-store.s3.amazonaws.com/0/90622/c2429ce5-42c6-2c78-5c57-9c9aeb580253.png)

Active Deployの実行により今度は「active-deploy001」側の経路情報がなくなったので、手動で経路を設定してやることで、こちらをテスト用環境として新バージョンのアプリ開発に着手することができます。
このように本番環境とテスト環境を交互に入れ替えながら開発することで、旧バージョンと新バージョンをダウンタイムなしで更新していくことが可能になります。
こうなると怖いのは人的ミスで、違う方にcf pushしてしまうことです。
本番環境へのcf pushを制限し、Active Deployのみを受け付けるようにする独自ツールでも開発しますかね。

# コマンドリファレンス
active-deployで使えるコマンドは下記の通りです。

* cf active-deploy-create  
  * デプロイを開始
* cf active-deploy-advance  
  * デプロイを次のフェーズに進める
* cf active-deploy-check-phase  
  * デプロイのフェーズが期待するフェーズかどうかを検査する
* cf active-deploy-check-status  
  * 現在のデプロイ状況が期待する状況と一致するかどうかを検査する
* cf active-deploy-delete  
  * 完了したデプロイまたはロールバックされたデプロイをリスト結果から削除する
* cf active-deploy-list  
  * 稼働中のデプロイをリスト
* cf active-deploy-pause  
  * 現行フェーズを一時停止し、フェーズ間の遷移を行わないようにする
* cf active-deploy-resume  
  * 一時停止したデプロイを再開  
* cf active-deploy-rollback  
  * デプロイを停止し、初期状態に復元
* cf active-deploy-service-info  
  * Active Deploy サービスの現在稼働しているバージョンとその health_check 状況に関する情報を表示
* cf active-deploy-show  
  * デプロイの詳細を表示


# まとめ
Active Deployを使うことで本番環境をダウンタイムなしで新バージョンに切り替えることができました。
次は簡単なアプリではなく、様々なサービスをバインドした状態での動作チェックをしてみたいと思います。