[新機能] CodeDeployのELB対応によるダウンタイムなしのリリース

渡辺です。

待望のアップデートがきました! AWS CodeDeployのELB対応です。

AWS CodeDeployは、ターゲットEC2インスタンスにエージェントを常駐させ、アプリケーションをデプロイするサービスです。 例えば、EC2インスタンスにJavaのSpringアプリケーションの実行環境を用意し、CodeDeployを利用してJAR(WAR)ファイルをデプロイすることができます。

しかし、システムがELB配下にある場合、ELBからのヘルスチェックを考慮する必要がありました。 デプロイが行われると、そのEC2インスタンスは一時的にヘルスチェックに失敗します。 したがって、ELBからのヘルスチェックに成功するまで待たなければ、一時的なサービス断が発生するのです。

これまでは、フックスクリプトでELBのヘルスチェックが成功するまでデプロイを完了させない方法で回避していました(CodeDeployでELBヘルスチェックによるローリングアップデート)。 今回のアップデートでそれらのスクリプトはCodeDeploy側で、よしなに処理されるようになります。

ELB対応の概要

CodeDeployにELBを紐付けた場合、 デプロイ中のEC2インスタンスは一時的にELBから切り離され ます。

CodeDeployは、デプロイ前にEC2インスタンスをELBからデタッチします。 次に、ELBから切り離されたEC2インスタンスにアプリケーションをデプロイします。 デプロイが完了した後、ELBにEC2インスタンスが再アタッチされます。 そして、ELBのトラフィックの回復後、次のEC2インスタンスのデタッチとデプロイが開始されます。

なお、 ELB配下のインスタンスは2台以上 必要です。 また、 インプレースデプロイメントもブルー/グリーンデプロイメントでもCLBのみ対応 であり、ALBを利用する場合はフックスクリプトを利用しなければなりません。

準備

はじめにELBとCodeDeloyの環境を作成します。

CodeStarでプロジェクトを作成する

アプリケーションの準備とかちょっと面倒なので、CodeStarを使いましょう。 CodeStarを起動し、Springアプリケーションを作成します。

必要項目を入力し、珈琲でも飲んでいればプロジェクトが作成されます。 デプロイが完了しているところまで確認してください。

AWS_CodeStar

EC2インスタンスの追加

複数のEC2インスタンスが必要なので、EC2インスタンスを追加します。 CodeStarで作成されたEC2インスタンスは、ユーザデータセクションで必要なミドルウェアをインストールしています。 したがって、「同様のものを作成」で問題ありません。

EC20

CodeDeployのデプロイメントグループには自動的に追加されます。 これは、デプロイメントグループでNameタグを参照しているからです。 インスタンス名を変更した場合は、手動でデプロイメントグループに追加してください。

AWS_CodeDeploy_Management

デプロイ

EC2インスタンスを追加しましたが、アプリケーションはデプロイされていません。 CodeStarのダッシュボードからリリースしておきます。

redeploy

なお、CodeDeployのデプロイメントグループでAutoScalingグループを指定している場合は、インスタンスが起動した時に自動デプロイが走ります。 手動でEC2インスタンスを追加した場合は、手動でデプロイする必要があるので注意してください。

ELBの追加

ELBを追加し、EC2インスタンスをアタッチします。

コードの変更

CodeStarのサンプルアプリケーションではトラフィックが途切れませんでした。 次のようにフックスクリプトを修正し、デプロイ時にアプリケーションサーバ(Tomcat)の再起動とヘルスチェックに失敗するだけの十分な時間を確保します。

scripts/start_server

#!/bin/bash
cd /opt/tomcat
bin/shutdown.sh # 追加
sleep 60 # 追加
bin/startup.sh

以上で準備ができました。 CodeStarを使っているので、必要最低限の作業で済みましたね。

標準のデプロイを実施する

はじめに、ELBを設定せずにデプロイを行います。 コードを変更したので、git pushすればデプロイが走ります(CodeStar最高!)。

デプロイ中、ELBからのヘルスチェックに失敗します。 この時、ヘルシーインスタンスの台数が2台から1台に減少します。 デプロイは成功したので次のインスタンスのデプロイが走ります。 しかし、まだ1台目のインスタンスのヘルスチェックが成功していないため、一時的にヘルシーインスタンスが0台となっています。 この時、エンドユーザからはサービスが利用できません。

hc1

CodeDeployにELBを設定する。

それでは、CodeDeployにトラフィックを管理するELBを追加しましょう。 デプロイメントグループの設定を開き、ロードバランサーに先ほど作成したロードバランサーを設定します。

codedeploy_elb

CodeStarからリリースしてみます。

hc2

一時的にヘルシーインスタンスの台数は1台になりましたが、0台になっていないことが確認出来ました!

デプロイ中は次のようにデプロイ中のインスタンスがELBからデタッチされています。

EC2_Management_Console

デプロイメントのログを確認すると、トラフィックのブロック(BlockTraffic)と許可(AllowTraffic)が追加されていますね。 ここでELBへのデタッチやアタッチとヘルスチェックの確認を行っています。

deploy

まとめ

インプレースデプロイメントではCLBを利用しているという前提ですが、強力なアップデートです。 ALBの場合はブルー/グリーンデプロイメントを選択するか、スクリプトで対応してください。 リリースが楽になるのは幸せですね。