CodeDeploy の Blue/Green デプロイでロールバックを実行する

AWS CodeDeploy

こんにちは、藤本です。

先日、CodeDeploy のデプロイ方式に Blue/Green デプロイが追加されました。当ブログでも早速試してみた記事をエントリしました。

今回はロールバックを試してみました。

CodeDeploy と Rollback

CodeDeploy はインプレイスデプロイ時はロールバックするためにはアプリケーションを再デプロイする必要がありました。それにより、デプロイ後にバグが発覚した場合、切り戻しに再デプロイの時間がかかっていました。また再デプロイもインプレイスデプロイのため、バグが発覚した環境を残すことができず、原因調査を行うことができませんでした。

それが CodeDeploy の Blue/Green デプロイ実装により、より迅速に切り戻しを行うことができるようになりました。新環境リリース後も、旧環境が残るため、旧環境と新環境を入れ替えるだけでロールバックできます。またロールバック後は新環境も残るため、継続して原因調査を行うことも可能です。ただし、ドキュメントを見ても Blue/Green デプロイのロールバック方法が記載されていません。なので、ロールバック方法を考えてみました。

デプロイの流れはCodeDeploy のデプロイ方式に Blue/Green Deployment が追加されましたをご参照ください。今回のエントリはデプロイの流れの「4. ELB から現環境のインスタンスを切り離し」からロールバックするお話です。ロールバックの流れを以下にまとめてみました。

デプロイ後にバグ発覚

デプロイした新環境にバグが見つかりました。

rollback1

CodeDeploy のデプロイ停止

CodeDeploy のデプロイがデプロイ中のステータスなので停止します。デプロイは旧環境を削除したら完了ステータスとなります。

rollback2

先に、切り戻し作業を行ってもいいですが、CodeDeploy のデプロイオプションで旧環境削除が時間指定の場合、切り戻し作業中に旧環境削除が始動したら大変です。旧環境削除が始動しないように先に CodeDeploy のデプロイを停止しておいた方がいいでしょう。

ELB に旧環境追加

旧環境の AutoScaling Group を ELB へ追加します。

rollback3

一時的に旧環境、新環境が混在する状態となります。ユーザーのアクセスはラウンドロビンで割り当てられます。ラウンドロビンが嫌な場合はスティッキーセッションを有効化することで同一ユーザーのラウンドロビンは回避できるかと思います。

ELB から新環境切り離し

旧環境へのアクセスが再開したら、新環境を ELB から外します。

rollback4

CodeDeploy の Blue/Green デプロイの場合、AutoScaling Group に ELB を紐付けるのではなく、EC2 インスタンス個別で ELB に登録されています。なので、インスタンス単位で ELB から削除する必要があります。どのインスタンスが削除したい(新環境の)インスタンスなのか自分で探さなきゃいけないので気をつけなければいけない作業です。

新環境の AutoScaling Group 削除

原因調査用に残してもいいですし、不要ならば削除しましょう。どちらにしろ自動で削除されることはないので不要なタイミングで手動で削除する必要があります。

rollback5

デプロイ停止オペレーションだけでロールバックできればいいのになぁ。

Rollback を試してみた

CodeDeploy のサンプルアプリケーションを利用して、ロールバックを試してみます。

現状

現在は ELB に旧環境に接続されています。ELB へアクセスすると、青のWebページを返します。

Sample_Deployment

Blue/Green デプロイの実行

CodeDeploy にて新しいリビジョンのアプリケーションのデプロイを開始します。Green 環境がデプロイされ、Blue 環境が切り離されます。

AWS_CodeDeploy_Management_2

ELB へアクセスすると、緑のWebページを返します。

Sample_Deployment 2

緑は嫌だ、とクレームが出たとして、青にロールバックすることとしました。

CodeDeploy の停止

デプロイの詳細画面へ遷移します。旧環境の削除待ちステータスとなっています。旧環境が削除されない内にデプロイを停止します。右上の [Stop] をクリックします。

AWS_CodeDeploy_Management_2

確認のポップアップが表示されますので、[Stop Now] をクリックします。

AWS_CodeDeploy_Management 3

Stopped ステータスになります。

AWS_CodeDeploy_Management_4

ELB に旧環境追加

旧環境(青のWebページ)の AutoScaling Group に ELB を設定して、ELB に旧環境を追加します。旧環境のインスタンスは CodeDeploy のデプロイ詳細画面から Environment が Original かどうかで確認できます。

AWS_CodeDeploy_Management 4

同じインスタンスがある AutoScaling Group を確認して、

EC2_Management_Console

その AutoScaling Group に ELB を紐付けます。

EC2_Management_Console 2

ELB のヘルスチェックを待ち、新環境、旧環境がラウンドロビンでアクセスされるようになるのを待ちます。青のWebページ、緑のWebページが表示されることを確認します。

ELB から新環境切り離し

旧環境が追加されたら、新環境(緑のWebページ)のインスタンスを ELB から削除します。AutoScaling Group に ELB が設定されているわけではないので ELB から個別に EC2 インスタンスを削除します。対象インスタンスを間違えないように注意しましょう。新環境のインスタンスは CodeDeploy のデプロイ詳細画面から Environment が Replacement かどうかで確認できます。

AWS_CodeDeploy_Management 4

Replacement のインスタンスを削除します。

EC2_Management_Console 3

青のWebページだけが返ってくるようになるのを確認します。

新環境の AutoScaling Group 削除

新環境が不要になったら AutoScaling Group を削除しましょう。

EC2_Management_Console 4

一応、旧環境削除待ち時間の1時間を過ぎても削除されないことは確認しました。

まとめ

いかがでしたでしょうか? Blue/Green デプロイによって、再デプロイを待たずにロールバックできるようになりました。ただ自動でBlue/Greenデプロイしてくれることに比べると、ロールバックは若干面倒です。ロールバックも自動化してくれると嬉しいです。