Quay lại

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    comment-3 Created with Sketch Beta. 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

  1. Image backend có chứa logic manage.py.

  2. ECS Task Definition chạy container web với command mặc định.

  3. EventBridge Rule là lịch chạy theo giờ/ngày.

  4. 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)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday