Sửa lỗi AWS Step Functions States.HeartbeatTimeout: Tại sao tác vụ thất bại sau 60 giây

beginner☁️ AWS2026-05-19| AWS Step Functions, AWS Lambda (Node.js, Python, Java, Go, v.v.)

Error Message

States.HeartbeatTimeout: State machine execution failed: Task timed out after 60 seconds
#aws#step-functions#lambda#serverless#devops

Vấn đềHãy tưởng tượng bạn có một hàm Lambda được thiết kế để xử lý tệp CSV dung lượng 500MB hoặc tạo một báo cáo quý phức tạp. Bạn đã khôn ngoan thiết lập thời gian chờ (timeout) nội bộ của Lambda là 15 phút để xử lý khối lượng công việc đó. Tuy nhiên, ngay khi bạn chạy nó thông qua Step Functions, tác vụ sẽ thất bại sau đúng một phút. Bạn thấy lỗi này trong lịch sử thực thi của mình:

States.HeartbeatTimeout: State machine execution failed: Task timed out after 60 seconds

Điều này thật khó chịu vì Lambda của bạn có thể vẫn đang hoạt động hoàn toàn bình thường ở chế độ nền. Vấn đề không phải là Lambda bị sập; mà là do Step Functions đã ngừng chờ đợi.

Tại sao điều này xảy raStep Functions sử dụng hai bộ đếm thời gian riêng biệt để quản lý các tác vụ. Hiểu được sự khác biệt giữa chúng là chìa khóa để có một quy trình làm việc (workflow) ổn định.

  • TimeoutSeconds: Đây là giới hạn cứng. Nó xác định tổng thời gian tối đa một tác vụ được phép chạy từ khi bắt đầu đến khi kết thúc. Nếu một tác vụ chạm giới hạn này, nó sẽ bị chấm dứt.- HeartbeatSeconds: Hãy coi đây là một "công tắc tử thần" (dead man's switch). Nó yêu cầu tác vụ phải báo cáo lại định kỳ để chứng minh rằng nó không bị đình trệ. Nếu tác vụ không gửi tín hiệu heartbeat trong khoảng thời gian này, Step Functions sẽ giả định rằng worker đã chết và hủy bỏ trạng thái (state) đó.Lỗi States.HeartbeatTimeout được kích hoạt vì định nghĩa Amazon States Language (ASL) của bạn có bao gồm giá trị HeartbeatSeconds, nhưng Lambda của bạn không thực hiện báo cáo. Các hàm Lambda tiêu chuẩn hoạt động theo cơ chế "fire and forget" (gửi và quên) từ góc nhìn của Step Functions. Chúng không tự động gửi heartbeat trong khi xử lý dữ liệu.

Hướng dẫn sửa lỗi từng bước### Bước 1: Kiểm tra định nghĩa ASL của bạnTìm trạng thái (state) đang bị lỗi trong định nghĩa quy trình làm việc của bạn. Thông thường, các plugin IDE hoặc các đoạn mã mẫu (snippets) sẽ tự động bao gồm heartbeat 60 giây theo mặc định. Nó thường trông như thế này:

"ProcessLargeData": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:123456789012:function:data-processor",
  "HeartbeatSeconds": 60,
  "End": true
}

Bước 2: Loại bỏ yêu cầu HeartbeatĐối với đại đa số các tác vụ Lambda, bạn không cần heartbeat. Vì Lambda tự quản lý vòng đời tính toán của chính nó, Step Functions chỉ cần đợi phản hồi cuối cùng.

Cách sửa tốt nhất: Xóa hoàn toàn dòng HeartbeatSeconds. Thay vào đó, hãy sử dụng TimeoutSeconds để xác định thời gian bạn sẵn lòng chờ đợi kết quả.

"ProcessLargeData": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:123456789012:function:data-processor",
  "TimeoutSeconds": 900, 
  "End": true
}

Trong ví dụ này, chúng tôi đặt thời gian chờ là 900 giây (15 phút) để khớp với thời gian thực thi tối đa của một hàm Lambda.

Bước 3: Đồng bộ hóa cấu hình Lambda của bạnMột sai lầm phổ biến là cập nhật Step Functions nhưng lại quên cài đặt của Lambda. Nếu Step Function của bạn đợi 15 phút nhưng Lambda được cấu hình với thời gian chờ chỉ 30 giây, Lambda vẫn sẽ thất bại. Sử dụng AWS CLI để đảm bảo chúng khớp nhau:

aws lambda update-function-configuration \
    --function-name data-processor \
    --timeout 900

Xác minhKiểm tra các thay đổi của bạn bằng cách kích hoạt một lần thực thi mới. Mở Graph Inspector trong AWS Console và chọn tác vụ đó. Bây giờ nó sẽ duy trì ở trạng thái "Running" (màu xanh lam) vượt xa mốc 60 giây trước đó. Cuối cùng, hãy kiểm tra CloudWatch Logs để xác nhận rằng Lambda đã trả lại kết quả thành công cho state machine.

Khi nào bạn thực sự nên sử dụng Heartbeats?Heartbeats không phải là vô dụng; chúng chỉ không dành cho các lệnh gọi Lambda đơn giản. Hãy sử dụng chúng trong hai kịch bản sau:

  • Activity Workers: Nếu bạn đang chạy mã trên một thực thể EC2 hoặc máy chủ tại chỗ (on-premise) thực hiện thăm dò (poll) Step Functions để nhận việc, heartbeat là thiết yếu để phát hiện nếu máy chủ đó bị ngoại tuyến.- The Callback Pattern: Nếu tác vụ của bạn bao gồm bước phê duyệt của con người hoặc một công việc kéo dài nhiều giờ, hãy sử dụng .waitForTaskToken. Trong trường hợp này, worker của bạn phải gọi API SendTaskHeartbeat định kỳ để duy trì việc thực thi.Đối với các quy trình Standard hoặc Express thông thường sử dụng Lambda, hãy bám sát TimeoutSeconds và giữ mọi thứ đơn giản.

Related Error Notes