Quay lại

Tự động chạy Batch Job trên ECS với EventBridge — Từ A đến Z Chuyên mục Devops    2025-08-13    4 Lượt xem    4 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Trong hầu hết các hệ thống backend, chúng ta luôn có những tác vụ định kỳ cần chạy: tổng hợp dữ liệu, gửi email báo cáo, xử lý thanh toán, hoặc làm sạch dữ liệu cũ. Với AWS, có nhiều cách để thực hiện, nhưng một trong những cách linh hoạtđơn giản nhất là sử dụng Amazon EventBridge kết hợp với ECS RunTask.

Trong bài này, mình sẽ chia sẻ cách mình triển khai batch job chạy mỗi 15 phút bằng EventBridge và ECS Fargate, đồng thời giải thích tại sao đây là lựa chọn tốt trong thực tế.


1. Tại sao lại chọn EventBridge + ECS RunTask?

Trước khi vào phần cấu hình, hãy nói về lý do:

  1. Tách biệt workload

    • Batch job không chạy liên tục, chỉ kích hoạt khi cần.

    • Không ảnh hưởng tới API hay service chính đang chạy.

  2. Tiết kiệm chi phí

    • Fargate chỉ tính tiền khi container chạy.

    • Không cần giữ một EC2 hay ECS service 24/7 chỉ để chạy cron.

  3. Đơn giản hoá vận hành

    • Không cần viết cronjob trong container chính hoặc quản lý EC2 để chạy script.

    • Tất cả trigger và scheduling được quản lý trong EventBridge.

  4. Tích hợp với hạ tầng AWS

    • Log tự động đẩy lên CloudWatch Logs.

    • Có thể scale số lượng task theo nhu cầu (ví dụ batch song song).


2. Chuẩn bị Task Definition cho batch job

Giả sử bạn đã có image Docker chứa script batch, ví dụ file:

/deployment/batch-jobs/batch-15min.sh

#!/bin/sh
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting 15min batch job..."

python manage.py user_point_statistic &&
echo "user_point_statistic done."
python manage.py payment_statistic &&
echo "payment_statistic done."
python manage.py performer_point_statistics &&
echo "performer_point_statistics done."
python manage.py fortune_package_registration
echo "fortune_package_registration done."

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Finished 15min batch job."

Lưu ý:

  • File .sh phải có quyền thực thi (chmod +x batch-15min.sh).

  • Trong Task Definition, cần trỏ ENTRYPOINT hoặc CMD vào script này, hoặc sử dụng Overrides trong EventBridge (mình sẽ nói ở phần sau).


3. Test chạy thủ công trên ECS

Trước khi cấu hình EventBridge, hãy chạy thử job một lần:

  1. Vào ECS → Clusters → Chọn cluster → Run new task.

  2. Chọn Task Definition vừa tạo.

  3. Chọn Launch type = FARGATE.

  4. Chọn SubnetsSecurity Group phù hợp (subnet private + NAT Gateway hoặc subnet public có public IP).

  5. Bấm Run Task.

  6. Xem log trong CloudWatch Logs → đảm bảo job chạy xong và in ra "Finished 15min batch job".


4. Cấu hình EventBridge để chạy định kỳ

Giờ mới là phần chính: tự động chạy task này 15 phút/lần.

Bước 1 — Tạo EventBridge Rule

  • Vào Amazon EventBridge → Rules → Create Rule.

  • Đặt tên, ví dụ: batch-15min-job.

  • Schedule patternRate-based schedule15 minutes.

Bước 2 — Thêm Target

  • Target type → Amazon ECS → RunTask.

  • ECS cluster → chọn cluster đang dùng.

  • Task Definition → chọn batch job.

  • Revision → Latest.

  • Task count → 1 (hoặc nhiều hơn nếu cần song song).

  • Launch type → FARGATE.

  • Platform version → LATEST.


Bước 3 — Cấu hình mạng

  • Subnets: chọn các subnet mà service có thể chạy (ví dụ subnet-01b6807daef11378f, subnet-00bcd8b849b0e9cbe).

  • Security group: chọn SG cho phép kết nối cần thiết (ví dụ sg-030c222d88d7f1d57).

  • Auto-assign public IP:

    • Disabled nếu dùng subnet private + NAT Gateway.

    • Enabled nếu dùng subnet public và muốn ra Internet trực tiếp.


Bước 4 — Overrides (tuỳ chọn)

Nếu không muốn chỉnh Task Definition, bạn có thể override command để chạy trực tiếp script batch:

{
  "containerOverrides": [
    {
      "name": "liveapp-prod-container",
      "command": ["/deployment/batch-jobs/batch-15min.sh"]
    }
  ]
}

5. Kiểm tra

Sau khi tạo rule:

  • Chờ tối đa 15 phút, job sẽ tự động chạy.

  • Vào CloudWatch Logs để kiểm tra log batch.

  • Nếu muốn test ngay: chọn rule → Test để trigger thủ công.


6. Kinh nghiệm thực tế

  • Log quan trọng: luôn in ra thời điểm bắt đầu/kết thúc để dễ debug.

  • Retry: nếu job quan trọng, cấu hình retry trong EventBridge.

  • Timeout: chỉnh timeout của container đủ dài để job chạy xong.

  • Monitoring: có thể thêm CloudWatch Alarm khi job fail nhiều lần.


Kết luận

Việc dùng EventBridge + ECS RunTask giúp chúng ta:

  • Tách biệt batch job khỏi service chính.

  • Tiết kiệm chi phí (Fargate chỉ tính khi chạy).

  • Dễ mở rộng và bảo trì.

  • Hoàn toàn serverless — không cần quản lý máy chủ.

Nếu hệ thống của bạn đang dùng ECS, hãy cân nhắc chuyển toàn bộ cronjob sang EventBridge + RunTask. Bạn sẽ thấy hạ tầng nhẹ hơn, chi phí giảm và quản lý dễ dàng hơn rất nhiều.

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