CodeDeploy で非 AutoScaling のインスタンスへの Blue/Green デプロイを試してみた

2017.03.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、藤本です。

CodeDeploy の Blue/Green デプロイは AutoScaling 環境下に限らず、非 AutoScaling の EC2インスタンス群に対しても行うことができます。AutoScaling 環境下での挙動は Elastic Beanstalk でなんとなく予想できたんですけど、非 AutoScaling 環境での挙動がよくわからなかったので、動作確認してみました。

概要

先日、CodeDeploy に Blue/Green デプロイによるデプロイ方式が追加され、早速、AutoScaling 環境下でのデプロイを試してみて、ブログをエントリしました。

CodeDeploy のデプロイ方式に Blue/Green Deployment が追加されました

上記エントリでは AutoScaling 環境下での Blue/Green デプロイを試してみました。今回は非 AutoScaling 環境での Blue/Green デプロイを試してみました。結果的に、非 AutoScaling 環境の場合でも、AutoScaling 環境下とほとんど挙動は変わりませんでした。非 AutoScaling 環境の場合、AutoScaling 環境と違い、インスタンス群がコピーされるわけではないため、事前に新環境のインスタンス群をプロビジョニングしておく必要があります。またデプロイするたびに新環境を指定する必要があり、タグのキーと値を指定します。あとの動作は AutoScaling 環境下の動作と変わりありませんでした。デプロイ後の旧環境の削除も実施してくれます。

デプロイの流れは以下のようになります。

0. 事前に新環境準備

新バージョンのアプリケーションのデプロイ先となるインスタンス群をセットアップします。

1. 新しいバージョンのアプリケーションをデプロイ(CodeDeploy のデプロイ操作)

CodeDeploy から新しいリビジョンのアプリケーションをデプロイします。

on1

2. 新環境のインスタンス群にアプリケーションデプロイ処理

アプリケーションを配置した S3、もしくは Github リポジトリから新環境へデプロイします。

on2

3. ELB に新環境のインスタンス群追加

アプリケーションがデプロイされたら、ELB に新環境のインスタンス群を ELB に追加します。ELB 下に現環境、新環境が混在する状況となります。

on3

4. ELB から現環境のインスタンス群を切り離し

ELB にて新環境がアクティブ状態となると、現環境のインスタンス群が ELB から切り離されます。これで ELB からのトラフィックは新環境へのみ流れることとなり、切り替えが完了となります。

on4

5. (オプション)現環境のインスタンス群を削除

現環境のインスタンス群を削除するタイミングはオプションで設定可能です。可能な設定としては、即時、時間指定(◯日◯時間◯分後形式)、削除しない、という選択肢から選択することができます。デプロイ後に本番環境で試験を実施したい場合や、万が一に備えて現環境を残しておきたい場合は 2番目、3番目の方式を選択するとよいでしょう。2番目の方式も時間を待たなくても、WebGUIのボタンから任意のタイミングで削除することができます。

on5

非 AutoScaling 環境でも自動的に削除されるのは喜ばれるのかな? 個人的な感覚では非 AutoScaling 環境では旧環境は削除せずに停止だけにしておく方が多くなるような気がします。

試してみた

今回も CodeDeploy のサンプルアプリケーションを利用して、試してみました。

現状

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

Sample_Deployment

CodeDeploy 設定

非 AutoScaling 環境で CodeDeploy により Blue/Green デプロイする場合、事前にデプロイメントグループを設定する必要があります。今回は新しいデプロイメントグループを作成します。CodeDeploy のアプリケーションから [Create deployment group] をクリックします。

非 AutoScaling 環境の場合、[Mannually provision instances] を選択します。対象インスタンスの初期設定をタグ指定にて行います。対象設定はデプロイの都度変更されます。

AWS_CodeDeploy_Management

デプロイの実行

CodeDeploy のアプリケーションからデプロイメントグループを選択し、[Actions] - [Deploy new revision] をクリックします。

screenshot 2017-02-26 2.36.52

デプロイ情報を設定します。AutoScaling 環境下との違いとして、デプロイ先インスタンスのタグ指定があります。今回、現環境のインスタンス群にSide=blueというタグを設定し、新環境のインスタンス群にSide=greenというタグを設定しています。新環境にデプロイするので、Key に Side、Value に green を指定します。

AWS_CodeDeploy_Management

デプロイ開始

デプロイが開始されます。非 AutoScaling 環境下の場合、インスタンスは既に用意済みですので、Step 1 の Provisioning replacement instances はスキップし、Step 2 の新環境へのアプリケーションデプロイから処理を開始します。Step 3 が完了した段階で新環境への切り替えは完了しており、現環境の削除待ちステータスとなります。

AWS_CodeDeploy_Management 3

動作確認

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

Sample_Deployment 2

現環境のインスタンス群削除

今回のデプロイメントグループの設定では 1時間後に削除するように指定しています。手動でターミネートしてみましょう。[Terminate] ボタンをクリックします。

AWS_CodeDeploy_Management_3

デプロイが完了となります。

AWS_CodeDeploy_Management 4

インスタンス画面を見てみると、現環境であるSide=blueのタグが設定されたインスタンスが Terminate ステータスとなっています。

EC2_Management_Console 2

CodePipeline と 非AutoScaling 環境下の組み合わせ

ここで気になったのが、CodePipeline との連携です。非 AutoScaling 環境下ではデプロイの都度、対象インスタンスをタグで指定します。ただ、CodePipeline ではデプロイが自動で発行されるため、対象インスタンスを指定することができません。

試してみた結果としては「NO_INSTANCES」(対象インスタンスがない)ステータスとなり、デプロイに失敗します。ご注意ください。

AWS_CodeDeploy_Management 2

まとめ

いかがでしたでしょうか? 非 AutoScaling 環境でも容易に Blue/Green デプロイを行うことができました。既存環境でインプレイスデプロイを利用されている方でも容易に変更が可能です。デプロイ後の旧環境の削除も必須ではないので都度インスタンス構築が大変な場合は削除を無効化して、旧環境が不要となったタイミングで停止状態としておくのがいいかと思います。(EBSやEIPといったコストは発生しますが、、)

CodePipeline との連携がサポートされるのが待たれる!