Tangani API Gateway Timeout ketika fungsi Lamda membutuhkan lebih dari 30 detik untuk menyelesaikannya

Aug 16 2020

Butuh bantuanmu! Dari API Gateway, saya mencoba memicu fungsi Lambda. Fungsi Lambda ini akan membuat tumpukan CloudFormation dan tumpukan tersebut pada gilirannya akan menerapkan instans EC2. Di bawah ini adalah bagian dari kode yang memulai pembuatan tumpukan dan menunggu status pembuatan tumpukan disetel selesai sebelum dapat mengembalikan respons. Masalahnya adalah API Gateway memiliki nilai batas waktu hard-code 30 detik dan pembuatan tumpukan tidak selesai sebelum 30 detik. Dalam skenario ini, permintaan API hanya time-out yang menghasilkan kesalahan server internal. Bagaimana cara saya menangani ini?

# 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
    }
)

Jawaban

ChrisWilliams Aug 16 2020 at 19:04

Mungkin alih-alih Lambda membuat tumpukan CloudFormation secara langsung, ia dapat memicu fungsi langkah dengan fungsi Lambda hanya untuk membuat tumpukan CloudFormation. Fungsi asli bisa mengembalikan id eksekusi ketika kembali setelah menjalankan fungsi start_execution .

Ini memberikan 2 manfaat, yang pertama adalah akan jauh lebih cepat (setelah eksekusi fungsi langkah dimulai, respons dikembalikan oleh SDK sehingga ini akan lebih cepat), serta tahan terhadap kegagalan (Anda memiliki opsi untuk coba lagi atau beri tahu jika ada kesalahan).

Atau jika Anda ingin permintaan itu sendiri melakukan ini dalam permintaan HTTP dari klien, Anda perlu melihat ALB yang melayani lalu lintas ke Lambda Anda, bukan API Gateway (yang memiliki batas maksimum). ALB dapat mendukung waktu tunggu yang lebih lama hingga 4000 detik .