ECSで複数のターゲットグループを紐付けるときの注意点

こんにちは。 エキサイト株式会社の三浦です。

AWSをインフラとしている場合、アプリケーションを動かす環境としてECSは選択肢の大きな一つです。 それがWebアプリケーションであれば、ECSとALBのターゲットグループを紐付けることが多いでしょう。

実はECSは、2つ以上のターゲットグループと紐付けることができます。 ですが、1つのみ紐付ける場合と比べると注意点があります。

今回は、その注意点について説明していきます。

なおこちら、2021/11/22現在の情報であり、将来的には変わっている可能性があるのでご注意ください。

ECSとターゲットグループ

ECSは、AWSが提供しているコンテナ稼働のマネージドサービスです。 公式ページには、以下のように説明されています。

Amazon ECS は、フルマネージドコンテナオーケストレーションサービスであり、コンテナ化されたアプリケーションを簡単にデプロイ、管理、およびスケーリングできます。

マネージドであり管理が非常に容易なため、AWSをインフラとしていてアプリケーションをコンテナでデプロイしたい場合は、ECSを使うことが選択肢の大きな一つとなります。 また、提供したいアプリケーションがWebサービスである場合、ECSとALBのターゲットグループを紐付けることによりALB経由でアクセスを流すことができます。

多くの場合、ECSとターゲットグループは 1 : 1 で紐付けると思います。 ただ、例えばinternal(VPC内のみ)とexternal(internet経由)の両方のALBを使用する必要があるなど、2つ以上のターゲットグループをECSに紐付けたいこともありえます。

実はそうした場合、1つのECSに対して2つ以上のターゲットグループを紐付けることができます。

f:id:excite-takayuki-miura:20211122113324p:plain
ターゲットグループが1つの場合

f:id:excite-takayuki-miura:20211122114121p:plain
ターゲットグループが2つの場合

非常に便利な機能なのですが、1つ注意点があります。

2つ以上のターゲットグループを紐付ける注意点

ECSには「オートスケーリング」という機能があります。 これは文字通り、コンテナへのアクセス量や負荷に応じて自動的にコンテナ数を増減してくれる機能であり、例えば時間や情勢によってアクセス量が変わりうるWebサービスなどで非常に有用な機能です。

このオートスケーリングでは、基本的に3つの指標をもとにコンテナの増減数を決定します。

ECSServiceAverageCPUUtilization

平均のCPU使用率が指定した値を超えたらコンテナ数を増やす

ECSServiceAverageMemoryUtilization

平均のメモリ使用率が指定した値を超えたらコンテナ数を増やす

ALBRequestCountPerTarget

ALBからの1コンテナ平均リクエスト数が指定した値を超えたらコンテナ数を増やす

これらはそれぞれサービスの特性に応じて使い分ければよいのですが、実は2つ以上のターゲットグループに紐付けたコンテナでは、最後の ALBRequestCountPerTarget を使用するのは危険です。

f:id:excite-takayuki-miura:20211122114906p:plain
ターゲットグループが1つの場合

f:id:excite-takayuki-miura:20211122125321p:plain
ターゲットグループが2つの場合

選択自体はできますが、実はこちら、片方のターゲットグループしか計算されていません。

計算されている方のターゲットグループにアクセスがあった場合

f:id:excite-takayuki-miura:20211122131831p:plain
計算されている方のターゲットグループにアクセスがあった場合のグラフ

f:id:excite-takayuki-miura:20211122131924p:plain
計算されている方のターゲットグループにアクセスがあった場合のコンテナ数

計算されていない方のターゲットグループにアクセスがあった場合

f:id:excite-takayuki-miura:20211122150139p:plain
計算されていない方のターゲットグループにアクセスがあった場合のグラフ

f:id:excite-takayuki-miura:20211122150210p:plain
計算されていない方のターゲットグループにアクセスがあった場合のコンテナ数

このように、片方のターゲットグループしか計算されないので、基本的に2つ以上のターゲットグループを紐付けたECSでは、 ALBRequestCountPerTarget は使わないほうが良いでしょう。

最後に

こちら、実は昔はそもそも2つ以上のターゲットグループを紐付けたECSでは ALBRequestCountPerTarget を選択すること自体が不可能でした。 それが選べるようになったということは、徐々に改修がされていっているのかもしれません。

こちらは2021/11/22現在の情報ですが、将来的には適切に処理がなされるようになるかもしれないので、気になる方は注意してみると良いでしょう。