Khi chạy web và batch ban đêm bằng cùng một container image trên ECS Fargate, thường gặp tình huống "chỉ batch là thiếu bộ nhớ". Nếu tạo thêm một task definition chỉ để đổi tài nguyên, mỗi lần cập nhật image hay biến môi trường phải sửa hai nơi, dễ sót cấu hình.
Hướng xử lý: ghi đè bằng overrides khi chạy
API RunTask của ECS có tham số overrides, cho phép ghi đè CPU/bộ nhớ của cả task và lệnh của từng container ngay lúc chạy. Dùng universal target (ecs:runTask) của EventBridge Scheduler thì chỉ cần khai báo các giá trị này trong Input của lịch chạy.
{
"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"] }
]
}
}Lưu ý
- CPU và bộ nhớ ở cấp task phải là tổ hợp Fargate hỗ trợ (ví dụ 2 vCPU đi với 4–16 GB), nếu không task sẽ không khởi động.
- Nếu container definition có đặt memory (giới hạn cứng), cần nâng cả giá trị này trong ContainerOverrides.
- Execution role của scheduler cần quyền ecs:RunTask và iam:PassRole cho task role, execution role.
- Nên cấu hình dead-letter queue và theo dõi lý do dừng của task để phát hiện lỗi sớm.
Tổng kết
Giữ một task definition duy nhất và chỉ ghi đè tài nguyên cho những job cần thiết giúp giảm cả công deploy lẫn lỗi cấu hình. Nên đo lượng tài nguyên thực tế của từng batch bằng Container Insights trên CloudWatch trước khi quyết định.