จัดการ API Gateway Timeout เมื่อฟังก์ชัน Lamda ต้องใช้เวลามากกว่า 30 วินาทีในการดำเนินการให้เสร็จสมบูรณ์

Aug 16 2020

ต้องการความช่วยเหลือของคุณ! จาก API Gateway ฉันกำลังพยายามเรียกใช้ฟังก์ชัน Lambda ฟังก์ชัน Lambda นี้จะสร้างสแต็ก CloudFormation และสแต็กกำลังจะปรับใช้อินสแตนซ์ EC2 ด้านล่างนี้เป็นส่วนหนึ่งของโค้ดที่เริ่มต้นการสร้างสแต็กและรอให้สถานะการสร้างสแตกเสร็จสมบูรณ์ก่อนที่จะสามารถส่งคืนการตอบกลับ สิ่งนี้คือ API Gateway มีค่าการหมดเวลาแบบฮาร์ดโค้ด 30 วินาทีและการสร้างสแต็กจะไม่เสร็จสมบูรณ์ก่อน 30 วินาที ในสถานการณ์นี้คำขอ API หมดเวลาเพียงส่งคืนข้อผิดพลาดภายในเซิร์ฟเวอร์ ฉันจะจัดการกับปัญหานี้ได้อย่างไร?

# Create the CloudFormation Stack
StackID = cf_client.create_stack(
    StackName=stackname,
    TemplateURL='https://s3-bucket/template1.template',
    Capabilities=['CAPABILITY_NAMED_IAM']
)
waiter = cf_client.get_waiter('stack_create_complete')
waiter.wait(
    StackName=stackname,
    WaiterConfig={
        'Delay' : 5,
        'MaxAttempts' : 50
    }
)

คำตอบ

ChrisWilliams Aug 16 2020 at 19:04

บางทีแทนที่จะเป็นแลมบ์ดาที่สร้างสแต็ก CloudFormation โดยตรงมันอาจทริกเกอร์ฟังก์ชันขั้นตอนด้วยฟังก์ชัน Lambda เพื่อสร้างสแต็ก CloudFormation เท่านั้น ฟังก์ชันดั้งเดิมสามารถส่งคืน ID การดำเนินการเมื่อส่งคืนหลังจากรันฟังก์ชันstart_execution

สิ่งนี้มีประโยชน์ 2 ประการประการแรกคือมันจะเร็วขึ้นมาก (เมื่อการเรียกใช้ฟังก์ชันขั้นตอนเริ่มต้นการตอบสนองจะถูกส่งกลับโดย SDK ดังนั้นสิ่งนี้จะเร็วขึ้น) รวมทั้งมีความยืดหยุ่นต่อความล้มเหลว (คุณมีตัวเลือกในการ ลองใหม่หรือแจ้งข้อผิดพลาด)

หรืออีกวิธีหนึ่งหากคุณต้องการให้คำขอทำสิ่งนี้ภายในคำขอ HTTP จากไคลเอนต์คุณจะต้องดูALB ที่ให้บริการทราฟฟิกไปยัง Lambda ของคุณแทนที่จะเป็น API Gateway (ซึ่งมีการตัดสูงสุด) ALB สามารถรองรับหมดเวลานานเกิน 4000 วินาที