Obsługuj limit czasu bramy API, gdy działanie funkcji Lamda trwa dłużej niż 30 sekund

Aug 16 2020

Potrzebuję twojej pomocy! Z bramy API próbuję wyzwolić funkcję Lambda. Ta funkcja Lambda utworzy stos CloudFormation, a stos z kolei wdroży instancję EC2. Poniżej znajduje się część kodu, który inicjuje tworzenie stosu i czeka na zakończenie stanu tworzenia stosu, zanim będzie mógł zwrócić odpowiedź. Rzecz w tym, że brama interfejsu API ma zakodowaną na stałe wartość limitu czasu wynoszącą 30 sekund, a tworzenie stosu nie kończy się przed upływem 30 sekund. W tym scenariuszu żądanie API po prostu przekroczyło limit czasu, zwracając wewnętrzny błąd serwera. Jak sobie z tym poradzić?

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

Odpowiedzi

ChrisWilliams Aug 16 2020 at 19:04

Być może zamiast Lambda bezpośrednio tworzącego stos CloudFormation może wywołać funkcję krokową z funkcją Lambda wyłącznie do tworzenia stosów CloudFormation. Oryginalna funkcja może zwrócić identyfikator wykonania, gdy powróci po uruchomieniu funkcji start_execution .

Służy to 2 korzyściom, po pierwsze, będzie znacznie szybsze (po rozpoczęciu wykonywania funkcji krokowej odpowiedź jest zwracana przez SDK, więc będzie to szybsze), a także jest odporna na awarie (masz możliwość spróbuj ponownie lub powiadom o błędach).

Alternatywnie, jeśli chcesz, aby samo żądanie robiło to w ramach żądania HTTP od klienta, musisz spojrzeć na ALB obsługujący ruch do twojej Lambdy, a nie API Gateway (który ma maksymalne odcięcie). ALB może obsługiwać dłuższy limit czasu do 4000 sekund .