Lamda işlevinin tamamlanması 30 saniyeden uzun sürdüğünde API Ağ Geçidi Zaman Aşımını işleyin

Aug 16 2020

Yardımın lazım! API Ağ Geçidinden bir Lambda işlevini tetiklemeye çalışıyorum. Bu Lambda işlevi bir CloudFormation yığını oluşturacak ve yığın da bir EC2 bulut sunucusunu dağıtacak. Aşağıda, yığın oluşturmayı başlatan ve bir yanıt döndürmeden önce yığın oluşturma durumunun tamamlanmasını bekleyen kodun bir bölümü bulunmaktadır. Konu API Ağ Geçididir, 30 saniyelik sabit kodlanmış bir zaman aşımı değerine sahiptir ve yığın oluşturma 30 saniyeden önce tamamlanmaz. Bu senaryoda, API isteği zaman aşımına uğrar ve dahili bir sunucu hatası verir. Bunu nasıl hallederim?

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

Yanıtlar

ChrisWilliams Aug 16 2020 at 19:04

Belki de Lambda doğrudan CloudFormation yığınını oluşturmak yerine, yalnızca CloudFormation yığınlarını oluşturmak için bir Lambda işleviyle bir adım işlevini tetikleyebilir . Orijinal işlev, start_execution işlevini çalıştırdıktan sonra döndüğünde yürütme kimliğini döndürebilir .

Bunun 2 faydası vardır, ilki çok daha hızlı olacaktır (adım işlevi yürütme başladığında, SDK tarafından bir yanıt geri döndürülür, böylece bu daha hızlı olur), aynı zamanda başarısızlığa karşı dirençlidir (seçeneğiniz vardır. yeniden deneyin veya hataları bildirin).

Alternatif olarak, isteğin istemciden gelen HTTP isteği içinde bunu yapmasını istiyorsanız , trafiği API Ağ Geçidi (maksimum sınıra sahip) yerine Lambda'nıza sunan bir ALB'ye bakmanız gerekir . Bir ALB, 4000 saniyeye kadar daha uzun bir zaman aşımını destekleyebilir .