ECS Fargate で Web アプリと夜間バッチを同じコンテナイメージで動かしていると、「バッチだけメモリが足りない」という場面がよくあります。リソースを変えるためだけにタスク定義を 2 つ持つと、イメージ更新や環境変数の変更を二重に管理することになり、設定漏れの原因になります。
方針:実行時に overrides で上書きする
ECS の RunTask API には overrides というパラメータがあり、タスク全体の CPU/メモリと、コンテナごとのコマンドを実行時に上書きできます。EventBridge Scheduler のユニバーサルターゲット(ecs:runTask)を使えば、スケジュールの Input にこの値を書くだけで済みます。
{
"Cluster": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/app",
"TaskDefinition": "app-web",
"LaunchType": "FARGATE",
"NetworkConfiguration": {
"AwsvpcConfiguration": {
"Subnets": ["subnet-xxxx"],
"SecurityGroups": ["sg-xxxx"]
}
},
"Overrides": {
"Cpu": "2048",
"Memory": "8192",
"ContainerOverrides": [
{ "Name": "app", "Command": ["bin/rails", "runner", "DailyReport.run"] }
]
}
}注意点
- タスクレベルの CPU とメモリは、Fargate がサポートする組み合わせ(例:2 vCPU なら 4〜16 GB)でなければ起動に失敗します。
- コンテナ定義側で memory(ハードリミット)を指定している場合は、その値も ContainerOverrides で合わせて引き上げます。
- スケジューラーの実行ロールには ecs:RunTask と、タスクロール・実行ロールに対する iam:PassRole が必要です。
- 失敗時に気づけるよう、デッドレターキューの設定や ECS タスクの停止理由の監視を入れておきます。
まとめ
タスク定義は 1 つに保ち、リソースが必要なジョブだけ実行時に上書きする構成にすると、デプロイの手間と設定ミスを同時に減らせます。バッチごとの必要量は CloudWatch の Container Insights で実測してから決めるのがおすすめです。