みなさん、こんにちは。電通総研 金融ソリューション事業部の鈴木です。
今回は、AWS CodeDeployでAmazon ECSに対してアプリケーションをBlue/Greenデプロイした際に発生したエラーについて、原因と解決方法を記載します。
アプリケーションの構成
今回紹介するアプリケーションの全体構成は、以下のとおりです。
(今回の記事に関係しない周辺リソースは省略しています)
アプリケーションはECSで管理しており、ロードバランサーにApplication Load Balancer(ALB)を配置しています。
デプロイについて、GitHub ActionsからコンテナイメージをECRにプッシュし、CodeDeployによってBlue/Greenデプロイを実行しています。
Blue/Greenデプロイとは、アプリケーションのデプロイに伴うダウンタイムを最小限に抑え、動作検証後にロールバックが可能なリリースの運用方式です。
詳しくは、CodeDeploy によるECS でのBlue/Greenデプロイの話を参照してください。
発生した事象
GitHub Actionsに設定したCDワークフローから稼働中のアプリケーションに対して、新しいバージョンのアプリケーションをデプロイした際に以下のエラーが発生しました。
The ELB could not be updated due to the following error: Primary taskset target group must be behind listener...
上記のエラーにより、CodeDeployのデプロイフローが動作せず、新しいバージョンのアプリケーションのデプロイが失敗しました。
(CodeDeployで「デプロイの再試行」や、ECSで「新しいデプロイの強制」を用いてデプロイを再実行してもエラーは解消しませんでした)
原因
結論としては、ECSタスクが指定しているターゲットグループと、ALBのリッスンしているターゲットグループの不一致が原因でした。
ターゲットグループとは、ELB (Elastic Load Balancing) のコンポーネントで、トラフィックを分散する複数のターゲットをグループ化したものです。ターゲットは、Amazon EC2 インスタンス、IP アドレス、Lambda関数などがあります。
エラーについて、AWS公式ページに以下のような記述がありました。
このエラーは、オプションのテストリスナーを設定しており、そのリスナーに間違ったターゲットグループが設定されている場合に発生する可能性があります。
Amazon ECS のデプロイに関する問題のトラブルシューティング
上記の通り、ECSタスクが指定しているターゲットグループとALBのリスナールールで指定しているターゲットグループを調べてみたところ、下記のようになっていました。
※ 画像について、都合により各リソース名はマスクしています。
※ ECSタスクのターゲットグループは「target-group-1」、ALBのリスナールールは「target-group-2」としています。ターゲットグループが異なることを表しています。
ECSのタスク
ALBのリスナールール
図にすると以下のようになっており、ECSタスクとALBのリスナールールで指定しているターゲットグループが不一致していることでエラーとなっていました。
解決方法
ALBのリスナールールを手動で変更し、起動中のECSタスクと同様のターゲットグループをリッスンするように修正することで解消しました。
(ALBのリスナールールで指定しているターゲットグループを「target-group-2」から「target-group-1」に変更)
上記の修正により、ECSタスクで指定しているターゲットグループがALBのリスナールールで指定しているターゲットグループと一致します。
これにより、CodeDeployでデプロイを再試行することにより新しいリソースをデプロイすることができました。
まとめ
本記事ではCodeDeployでECSに対してアプリケーションをデプロイした際のエラーについて原因と解決方法を記載しました。
インターネットを調べても同様の記事を見つけられなかったため、備忘として残したいと思います。
ECSタスクとALBのリスナールールで指定しているターゲットグループがずれた根本原因についてはいまだに特定できていないため、継続調査していこうと思います。
以上、同様の事象が発生した方の役に立てれば幸いです。最後までお読みいただきありがとうございました。
執筆:@suzuki.takuma、レビュー:@nakamura.toshihiro
(Shodoで執筆されました)