🙆

AWS ECS – CodeDeploy での blue/green デプロイで テスト用のポートは公開されていなくても良いのか?

2023/08/26に公開

問題

AWSのCodeDeployではデプロイグループの設定で「本稼働リスナーポート」と「テストリスナーポート」が設定できる。
だがここでの疑問は「テストリスナーポート」はどのようにテストされているのかということだ。

トラフィックをテストするということは何かしらの形で外部からアクセスが来るものだと思うのだが。
試してみたところ思ったのとは違う挙動を見せている。

たとえば ポート 10000 をテストリスナーポートに指定した場合、Webから アクセス出来なくても blue/greenデプロイが成功する。
( 例: http://example.com:10000/ )

この動きが分からない。

デプロイ設定に ECSAllAtOnce を選んでもそれ以外を選んでも成功する。
どうやらテスト用のポートには必ずしも外部からアクセスできる必要ないような気がしてきた。

( そもそも何かを根本的に理解し間違っているかもしれない )

動作確認

AWSのセキュリティグループ・ALBのリスナー・ターゲットグループの指定などを変えて http://example.com:10000/ にブラウザからも直接アクセスできるようにしてみた。

そして以下のデプロイ設定でblue/greeenデプロイの挙動を試してみた

CodeDeployDefault.ecs PercentEvery
すべてのトラフィックが移行されるまで、毎分トラフィックの 10 パーセントを移行します。

デプロイが進捗中にALBのリスナールールのページを見てみると、本番稼働用のリスナールールでは以下のようにターゲットグループの「比重」が変わっていくのが分かる。

ターゲットグループへ転送
target-1: 90 (90%)
target-2: 10 (10%)
ターゲットグループへ転送
target-1: 80 (90%)
target-2: 20 (10%)
ターゲットグループへ転送
target-1: 70 (90%)
target-2: 30 (10%)

これはデプロイ進捗画面の「トラフィック移行の進行状況」と同じものを表しているみたいだ。

<img width="531" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/800c5e42-b0df-4dac-b203-5f3c09c24acc">

デプロイ設定にもよるがリスナーに紐づくターゲットグループの比重が変わって行くのがAWSのblue/greenデプロイの動きのようだ。

blue/greenデプロイ中にWebからアクセスしてみると

デプロイ中にWebからアクセスしてみると以下の動作が確認できた

本番稼働用のURLでは

新しいバージョンのページ/古いバージョンのページがランダムに表示される
(画面リロードするたびにどちらかに振り分けられる)

その時のトラフィックの比率に対応してどちらに振り分けられるかの確率が変わっていくようだった。
たとえば 「ターゲットグループA 90%」「ターゲットグループB 10%」 のトラフィック割合の時にアクセスすると 10回中9回は前者にアクセスが振り分けられていた。

テストリスナー用のURLでは

常に新しいバージョンのページが表示される

AWSの説明を再確認してみる

テストリスナーポート - オプショナル
トラフィックによって再ルーティングされる前に置き換えバージョンをテストする場合は、テストリスナーが必要です

ここでいう「置き換えバージョンをテストする」というのはblue/greenデプロイによるテストではなくて、我々が何かしらのテストをする場合ということなのだろうか?

どうやらそういうことなのかもしれない。

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-ecs-deployment-with-hooks.html

このチュートリアルでは、Lambda 関数を使用して、更新された Amazon ECS アプリケーションのデプロイの一部を検証する方法について学びます。

検証テストを追加するには、最初に Lambda 関数でテストを実装します。次に、AppSpecデプロイファイルで、テストしたいライフサイクルフックのために Lambda 関数を指定します。検証テストが失敗した場合、デプロイは停止し、ロールバックされて、失敗とマークされます。テストが成功すると、デプロイは次のデプロイライフサイクルイベントまたはフックに進みます。

blue/greepデプロイでトラフィックの比重が変わっていく挙動とは別に、テスト用のリスナーを使って最新バージョンをテストできるということなのかもしれない。

結論

  • テスト用のリスナーポート設定はあくまでオプショナル。指定しなくてもblue/greenデプロイは出来る。
  • テスト用のリスナーポートにWebからアクセスできるように設定しておくとデプロイ時の最新バージョンを確認できる。
  • 本番稼働用のトラフィックは片方のターゲットグループからもう片方のターゲットグループへとALBリスナールールの比重がシフトしていく (なのでテストリスナー用のポートは関係なさそう)

これは現段階での理解だがまだまだわからない部分が多そうだ。

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

Discussion