Obsługuj limit czasu bramy API, gdy działanie funkcji Lamda trwa dłużej niż 30 sekund
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
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 .