ECSのbinpack戦略とFargateのタスク分離を公式ドキュメントで確認した

  • AWS
  • ECS
  • Fargate

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

Bin Packingとは

荷物を段ボール箱にできるだけ隙間なく詰める、あの考え方。ECSやKubernetesでは、タスク(コンテナ)をインスタンス(ホスト)に効率よく詰めて、使用インスタンス数を減らしコストを下げるために使う。

ECS on EC2のbinpack戦略

ECSのタスク配置戦略のひとつにbinpackがある。CPUかメモリの空きが一番少ないインスタンスから詰めていく方式。

"placementStrategy": [
{ "field": "memory", "type": "binpack" }
]

これで既存インスタンスをできるだけ埋めてから新規インスタンスを使うようになる。spread(AZやインスタンス単位で均等分散)と組み合わせて、まずAZでspread、その中でbinpack、というパターンもよく使われるらしい。

binpackだけに寄せると、タスクが小さい場合は数台に集中して残りが遊んでしまうこともあるので、オートスケールと組み合わせるときはスケールイン時にどのタスクが落ちるかも考えておいたほうがいい。

Fargateではどうか

AWS公式ドキュメントには、Fargateを使うとサーバータイプの選択、クラスターのスケールタイミング決定、クラスターパッキングの最適化が不要になると明記されている。

さらに、各Fargateタスクは独自の分離境界を持ち、CPU・メモリ・ENIを他のタスクと共有しないとも書かれている。つまりFargateでは、ユーザー視点でBin Packingを意識する必要はない、という結論は公式ドキュメントで裏付けが取れた。

Fargateの有効なCPU/メモリ組み合わせ

Fargateは任意の比率でCPU/メモリを割り当てられるわけではなく、決まった組み合わせしか使えない。

CPU メモリ
256 (.25 vCPU) 512 MiB, 1 GB, 2 GB
512 (.5 vCPU) 1 GB, 2 GB, 3 GB, 4 GB
1024 (1 vCPU) 2〜8 GB(1GB刻み)
2048 (2 vCPU) 4〜16 GB(1GB刻み)
4096 (4 vCPU) 8〜30 GB(1GB刻み)

0.5vCPU + 1GBみたいな小さい組み合わせも表の範囲内では有効だけど、実運用ではCPU shareの都合で低vCPU設定はスループット重視のWebアプリだとスロットリングが出やすいという話もあるので、その点は別途注意したほうがよさそう。

まとめると

  • EC2 Launch Typeではbinpackが重要。うまく使えばコスト削減効果は大きい
  • Fargateはタスクごとに完全分離されているので、Bin Packingはユーザー側で意識不要というのは公式に裏付けあり