Skip to main content

Step Functions – Error Handling

แนะนำ Error Handling ใน Step Functions

Step Functions ทำงานโดยการเรียกใช้ tasks เล็ก ๆ จำนวนมาก ที่มักทำงานง่าย ๆ เช่น การเรียก API หลักการสำคัญคือ: 👉 การจัดการข้อผิดพลาดควรทำภายนอก Task โดยให้ Step Functions จัดการ ไม่ใช่ให้โค้ด (เช่น Lambda) จัดการเอง

เมื่อไหร่ถึงจะเกิด Error?

ข้อผิดพลาด (Errors) สามารถเกิดได้หลายกรณี เช่น:

  • การนิยาม state machine ผิด เช่น ไม่มี rule ที่ตรงใน Choice State
  • Task ล้มเหลว เช่น Lambda function ขว้าง exception ออกมา
  • ความผิดพลาดชั่วคราว (Transient failures) เช่น ปัญหา network

❌ ไม่ควรเขียนโค้ดดักจับ exception ใน Lambda เอง ✅ แต่ควรให้ Step Functions จัดการด้วยกลไก error handling

ประเภทของ Error Handling ใน Step Functions

มี 2 วิธีหลัก ๆ:

  1. Retry → ลองรันใหม่เมื่อเจอข้อผิดพลาด
  2. Catch → ส่งต่อไปยังเส้นทางจัดการข้อผิดพลาด

สิ่งเหล่านี้ควรนิยามใน State Machine ไม่ใช่ใน Application Code ข้อดีคือจะได้ Execution History ที่ชัดเจนว่า retry / catch เกิดขึ้นเมื่อใด

Error Codes ที่ Step Functions มีมาให้

  • States.All → ตรงกับทุกข้อผิดพลาด
  • States.Timeout → Task ใช้เวลานานเกิน timeout ที่ตั้งไว้
  • States.TaskFailed → Task ทำงานล้มเหลว เช่น Lambda ขว้าง exception
  • States.Permissions → สิทธิ์ไม่เพียงพอที่จะรันโค้ด

กลไก Retry สำหรับ Tasks หรือ Parallel States

คุณสามารถกำหนด Retry Rules ได้ว่า:

  • จะลองใหม่กี่ครั้ง
  • รอเวลานานแค่ไหนก่อน retry
  • จะเพิ่มเวลา delay แบบ exponential backoff หรือไม่

เช่น กรณี Lambda function มี 3 กฎ Retry:

  • ErrorEquals: จับ error แบบเฉพาะ เช่น CustomError, TaskFailed, หรือ States.All
  • IntervalSeconds: เวลารอก่อน retry (เช่น 1 วินาที, 30 วินาที, 5 วินาที)
  • BackoffRate: คูณ delay ในแต่ละครั้ง เช่น 2 → ทำให้เป็น exponential backoff
  • MaxAttempts: จำนวนครั้งสูงสุดที่จะ retry (เช่น 2, 2, 5)

👉 ถ้า retry ครบแล้วแต่ยังไม่สำเร็จ → จะเข้าสู่ Catch Block

ข้อดีของ Retry Logic ภายนอก

  • หลีกเลี่ยงการให้ Lambda ทำงานนานจน timeout
  • สามารถเปลี่ยน logic การจัดการ error ได้โดยไม่ต้อง deploy Lambda ใหม่
  • ทำให้ Lambda ทำงานเสร็จเร็วขึ้นและ Step Functions จัดการต่อเอง

กลไก Catch

Catch ใช้เพื่อกำหนดเส้นทางเมื่อ retry ไม่สำเร็จ หรือเมื่อเจอ error เฉพาะ ลำดับการตรวจสอบจะทำจากบนลงล่าง

ตัวอย่างการตั้งค่า:

  • ErrorEquals: กำหนด error ที่ต้องการจับ เช่น CustomError
  • Next: จะให้ไป State ถัดไปตัวไหน (เช่น Fallback State)
  • ResultPath: ควบคุมว่าจะส่งข้อมูลอะไรไปยัง state ถัดไป

ตัวอย่าง Catch

ถ้าเกิด CustomError → state machine จะเปลี่ยนไปที่ CustomErrorFallback ซึ่งอาจเป็น Pass State ที่จบ workflow เลย หรือเป็น state ที่ทำงาน error handling เช่น logging, ส่งแจ้งเตือน ฯลฯ

การเข้าใจ ResultPath

ResultPath ควบคุมว่า output ของ state จะรวมกับ input อย่างไร

เช่น input:

{ "foo": "bar" }

ถ้าตั้ง ResultPath เป็น .error → output จะเป็น:

{
"foo": "bar",
"error": {
"Error": "CustomError",
"Cause": "Something went wrong"
}
}

สิ่งนี้ช่วยให้ state ถัดไปสามารถเอาข้อมูล error ไปใช้ได้ เช่น ส่ง notification หรือ debug

สรุป

  • Step Functions มี Retry และ Catch เพื่อจัดการ error ได้ยืดหยุ่น
  • ควรทำ error handling ภายนอก (ที่ Step Functions) ไม่ใช่ในโค้ดของ Task
  • Retry → กำหนดจำนวนครั้ง, interval, backoff, max attempts
  • Catch → กำหนด fallback state, เส้นทางสำรอง และส่ง error ไปต่อด้วย ResultPath
  • วิธีนี้ช่วยให้โค้ดเรียบง่ายขึ้น ควบคุม workflow ได้ดีขึ้น และเห็นประวัติการทำงานชัดเจน