[新機能] 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アプリケーションを作成します。
必要項目を入力し、珈琲でも飲んでいればプロジェクトが作成されます。 デプロイが完了しているところまで確認してください。
EC2インスタンスの追加
複数のEC2インスタンスが必要なので、EC2インスタンスを追加します。 CodeStarで作成されたEC2インスタンスは、ユーザデータセクションで必要なミドルウェアをインストールしています。 したがって、「同様のものを作成」で問題ありません。
CodeDeployのデプロイメントグループには自動的に追加されます。 これは、デプロイメントグループでNameタグを参照しているからです。 インスタンス名を変更した場合は、手動でデプロイメントグループに追加してください。
デプロイ
EC2インスタンスを追加しましたが、アプリケーションはデプロイされていません。 CodeStarのダッシュボードからリリースしておきます。
なお、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台となっています。 この時、エンドユーザからはサービスが利用できません。
CodeDeployにELBを設定する。
それでは、CodeDeployにトラフィックを管理するELBを追加しましょう。 デプロイメントグループの設定を開き、ロードバランサーに先ほど作成したロードバランサーを設定します。
CodeStarからリリースしてみます。
一時的にヘルシーインスタンスの台数は1台になりましたが、0台になっていないことが確認出来ました!
デプロイ中は次のようにデプロイ中のインスタンスがELBからデタッチされています。
デプロイメントのログを確認すると、トラフィックのブロック(BlockTraffic)と許可(AllowTraffic)が追加されていますね。 ここでELBへのデタッチやアタッチとヘルスチェックの確認を行っています。
まとめ
インプレースデプロイメントではCLBを利用しているという前提ですが、強力なアップデートです。 ALBの場合はブルー/グリーンデプロイメントを選択するか、スクリプトで対応してください。 リリースが楽になるのは幸せですね。