[アップデート] AWS CodeDeploy の EC2 用デプロイグループで、デプロイ中の着信トラフィックをブロックするロードバランサーを複数指定出来るようになりました

2023.10.03

いわさです。

AWS CodeDeploy ではデプロイ対象のプラットフォームごとに設定可能なオプションに結構違いがあります。
EC2 をターゲットにした場合はインプレースあるいはブルー/グリーンデプロイのどちらかを構成することが出来ます。

インスタンスの更新を行う際には EC2 の前段に配置されたロードバランサー(ターゲットグループ)に対して、アップデート中インスタンスへのトラフィックをブロックするように構成することが出来ます。

従来まではひとつの CodeDeploy アプリケーションに対してひとつのロードバランサー(ターゲットグループ)をコントロールすることが出来たのですが、本日のアップデートで最大 10 件までのターゲットを指定出来るようになりました。

これによって、例えば複数のロードバランサー(ターゲットグループ)で構成されたアプリケーションに対して、関連するロードバランサーへのトラフィックをコントロール出来るようになりました。

私がよく構築するパターンだと、単独の EC2 インスタンスに対してパブリックアクセス可能なロードバランサーと、プライベートアクセスを想定したロードバランサーなど複数構成することがありました。
ローリングアップデートなどで一台ずつ更新する場合、指定したロードバランサーがアップデート中インスタンスにアクセスされないようにコントロールしたいところですが、これまではひとつのロードバランサーのみコントロール出来たのが、上限はありますが関連するロードバランサーすべてを同時にコントロール出来るようになります。

本日は簡単な複数 ALB 構成を用意して検証してみましたので紹介したいと思います。

デプロイグループのロードバランサー設定で複数設定出来るようになっている

EC2 タイプの CodeDeploy アプリケーションを作成し、デプロイグループを追加します。
デプロイタイプはどちらでも良いのですが、インプレースの場合はロードバランサーのオプションは任意で、ブルー/グリーンの場合は必須です。

着信トラフィックを管理したいロードバランサーを選択することが出来ます。
ALB/NLB の場合はターゲットグループを、CLB の場合はロードバランサーを選択するのですが、従来はここでそれぞれひとつまでが選択出来ました。

今回のアップデートで次のように複数のターゲットを選択出来るようになっています。

複数選択されている時は、コンソール上は次のように表示されます。

なお、ターゲットグループ、クラシックロードバランサーでそれぞれ最大 10 件までが選択可能な上限となっています。
10 件以上選択した場合は、デプロイグループ作成時に次のようなエラーメッセージが表示されます。

The specification for load balancing in the deployment group is invalid. The targetGroupInfoList string contains more than ten target group name, but only ten target group is supported per deployment group.

2 つのロードバランサー構成で試してみた

実際の運用シーンではパスベースなどターゲットグループを分けた同一のロードバランサーだったり、バックエンドの EC2 インスタンスが複数のグループで構成されていたりと様々なパターンが考えられますが、今回は次のように Web サーバーとなる EC2 を 1 台用意し、ロードバランサーを 2 つ構成する単純な環境で試してみます。

インプレースアップグレードでトラフィック中断が発生するロードバランサーを観察してみます。

事前に EC2 には CodeDeploy エージェントを手動でインストール済みで、Apache がインストールされています。

また、CodeDeploy で配布するリビジョンも用意してますが、単純な HTML ファイルと最低限の appspec.yml のみです。

appspec.yml

version: 0.0
os: linux 
files:
  - source: fuga.html
    destination: /var/www/html/

デプロイグループでは次のように 2 つのロードバランサーがそれぞれ関連付けられているターゲットグループを指定しています。

この状態でデプロイを作成しました。

デプロイフェーズが進行すると次のように BlockTraffic イベントでロードバランサーの着信トラフィックの管理が行われます。
今回はバックエンドが 1 台かつデプロイ戦略に CodeDeployuDefault.AllAtOnce を指定したインプレースデプロイを選択していますので、単純のそれぞれのターゲットグループのターゲットの登録が一度解除されるはずです。

確認してみたところ、複数指定したそれぞれのターゲットグループでそれぞれ期待どおりにターゲットの解除がされました。

スクリーンショットは省略しますが、バンドルのダウンロードと配置が完了した後に、それぞれのターゲットグループにまたインプレースデプロイされたインスタンスが再登録されていることを確認しています。

さいごに

本日は AWS CodeDeploy の EC2 用デプロイグループで、デプロイ中の着信トラフィックをブロックするロードバランサーを複数指定出来るようになったので試してみました。

CodeDeploy を使う EC2 かつ複数ロードバランサー/ターゲットグループの場合に対応出来るようになったということで、なかなか限られたケースですが従来の制限事項の影響を受けていた方はデプロイグループの見直しをしてみては如何でしょうか。