Chạy Cronjob với ECS và Python Django: Hướng Dẫn Chi Tiết Chuyên mục Devops 2025-05-23 0 Lượt xem 0 Lượt thích 0 Bình luận
Trong quá trình phát triển các hệ thống backend với Python Django, bạn sẽ không thể tránh khỏi nhu cầu chạy các tác vụ định kỳ như xóa file rác trên S3, cập nhật trạng thái, hoặc gửi email tự động. Trên môi trường Amazon ECS (Elastic Container Service), việc triển khai các cronjob có thể linh hoạt, mạnh mẽ và không cần phụ thuộc vào server truyền thống.
Bài viết này hướng dẫn bạn cách chạy cronjob với ECS Fargate, sử dụng 1 image backend Django duy nhất, và chạy được nhiều lịch trình khác nhau nhờ EventBridge.
✅ Mục tiêu
-
Tạo cronjob trong ECS chạy Django management command.
-
Không cần tạo nhiều image hay task definition.
-
Hỗ trợ nhiều lịch trình (schedule).
🧱 Yêu cầu
-
ECS Fargate đang chạy backend Django.
-
manage.py chứa các command cần chạy định kỳ.
-
IAM Role đủ quyền chạy ECS Task.
🧠 Kiến trúc tổng quan
-
Image backend có chứa logic manage.py.
-
ECS Task Definition chạy container web với command mặc định.
-
EventBridge Rule là lịch chạy theo giờ/ngày.
-
Rule này gọi Run Task, và override command bạn muốn.
[ EventBridge Schedule ] --> [ ECS Task Definition (shared) ] --> [ Container (web) override command: manage.py my_task ]
⚙️ Ví dụ thực tế: Xóa file trên S3
Giả sử bạn có command clean_s3_files:
python manage.py clean_s3_files
Bạn muốn chạy task này mỗi ngày lúc 2h sáng.
1. ECS Task Definition (shared)
-
Tên: django-scheduled-task
-
Container name: web
-
Image: chính là image backend bạn đang deploy
Không cần định nghĩa command sẵn – sẽ override sau.
2. Tạo EventBridge Rule
-
Schedule expression: cron(0 2 * * ? *)
-
Target: ECS Run Task
-
Cluster: my-cluster
-
Task Definition: django-scheduled-task
-
Launch type: FARGATE
-
Override Command:
{
"containerOverrides": [
{
"name": "web",
"command": ["python", "manage.py", "clean_s3_files"]
}
]
}
3. Tạo nhiều lịch trình
Bạn có thể tạo thêm Rule khác với command khác:
Tác vụ | Giờ chạy | Command |
---|---|---|
Xóa file S3 | 2AM | clean_s3_files |
Reset usage | 3AM | reset_usage |
Sync dữ liệu | 4AM | sync_data |
Tất cả đều dùng chung 1 task definition và 1 image.
💡 Tips
-
CPU/RAM sẽ được cấp lúc task chạy và tự tắt sau khi xong.
-
Log nên đẩy lên CloudWatch để dễ theo dõi.
-
Có thể dùng Terraform/CDK để khai báo nhiều rule tự động.
🧩 Mẫu Terraform tạo Rule
resource "aws_cloudwatch_event_rule" "clean_s3" {
name = "clean-s3-daily"
schedule_expression = "cron(0 2 * * ? *)"
}
resource "aws_cloudwatch_event_target" "ecs_target" {
rule = aws_cloudwatch_event_rule.clean_s3.name
target_id = "ECS-CleanS3"
arn = aws_ecs_cluster.my_cluster.arn
role_arn = aws_iam_role.eventbridge_role.arn
ecs_target {
task_definition_arn = aws_ecs_task_definition.django_scheduled.arn
launch_type = "FARGATE"
network_configuration {
subnets = ["subnet-xxxx"]
security_groups = ["sg-xxxx"]
assign_public_ip = true
}
platform_version = "LATEST"
override {
container_overrides = jsonencode([
{
name = "web",
command = ["python", "manage.py", "clean_s3_files"]
}
])
}
}
}
🎯 Kết luận
Triển khai cronjob với ECS Fargate giúp bạn có hệ thống backend serverless, tách biệt, dễ quản lý và scale tốt. Chỉ cần một task definition duy nhất, bạn có thể tạo hàng chục tác vụ định kỳ khác nhau chỉ với EventBridge.
Hãy đảm bảo container bạn build sẵn sàng để chạy command từ bên ngoài (CMD không bị hard-code), và theo dõi log qua CloudWatch.
Bạn có thể mở rộng thêm để:
-
Gửi notification khi task fail.
-
Viết command cập nhật database, gửi email...
-
Trigger thủ công để test qua ECS Console.
Bình luận (0)