Na przykład, jeśli chcę zwrócić określony błąd 400 dla nieprawidłowych parametrów lub być może 201, gdy wywołanie funkcji lambda spowodowało utworzenie.
Chciałbym mieć różne kody statusu http, ale wygląda na to, że brama API zawsze zwraca kod statusu 200, nawet jeśli funkcja lambda zwraca błąd.
amazon-web-services
aws-lambda
aws-api-gateway
MonkeyBonkey
źródło
źródło
Odpowiedzi:
Aktualizacja na 20-9-2016
Amazon w końcu ułatwił to dzięki integracji Lambda Proxy . Dzięki temu funkcja Lambda zwraca prawidłowe kody HTTP i nagłówki:
Pożegnaj mapowanie żądań / odpowiedzi w bramie interfejsu API!
Opcja 2
Zintegruj istniejącą aplikację Express z Lambda / API Gateway za pomocą aws-serverless-express .
źródło
callback
stylu. Po prostu zróbcallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Oto najszybszy sposób na zwrócenie niestandardowych kodów stanu HTTP i niestandardowego
errorMessage
:Na pulpicie nawigacyjnym API Gateway wykonaj następujące czynności:
Dodaj odpowiedź dotyczącą integracji dla każdego utworzonego wcześniej kodu stanu HTTP. Upewnij się, że przekazywanie danych wejściowych jest zaznaczone. Użyj wyrażenia regularnego błędu lambda, aby określić, który kod stanu powinien zostać użyty, gdy zwracasz komunikat o błędzie z funkcji lambda. Na przykład:
Twoja trasa API Gateway powinna zwrócić to:
Nie widzę sposobu na skopiowanie tych ustawień i ponowne użycie ich do innych metod, więc mamy do zrobienia wiele irytujących, zbędnych ręcznych ustawień!
Moje odpowiedzi dotyczące integracji wyglądają następująco:
źródło
return context.fail(new Error('bad one'))
Aby móc zwrócić niestandardowy obiekt błędu jako JSON, musisz przejść przez kilka obręczy.
Po pierwsze, musisz zawieść Lambda i przekazać do niej łańcuchowy obiekt JSON:
Następnie konfigurujesz mapowanie wyrażeń regularnych dla każdego z kodów stanu, które chcesz zwrócić. Używając obiektu, który zdefiniowałem powyżej, skonfigurowałbyś to wyrażenie regularne dla 400:
. * "status": 400. *
Na koniec konfigurujesz szablon mapowania, aby wyodrębnić odpowiedź JSON z właściwości errorMessage zwróconej przez Lambda. Szablon mapowania wygląda następująco:
$ input.path („$. errorMessage”)
Napisałem artykuł na ten temat, który jest bardziej szczegółowy i wyjaśnia przepływ odpowiedzi z Lambda do API Gateway tutaj: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -and-status-code-from-api-gateway-with-lambda /
źródło
1) Skonfiguruj swój zasób API Gateway do korzystania z integracji Lambda Proxy , zaznaczając pole wyboru oznaczone „Use Lambda Proxy Integration” na ekranie „Integration Request” w definicji zasobów API Gateway. (Lub zdefiniuj to w konfiguracji cloudformation / terraform / serverless / etc)
2) Zmień swój kod lambda na 2 sposoby
event
(pierwszy argument funkcji). Nie jest już tylko zwykłym ładunkiem, reprezentuje całe żądanie HTTP, w tym nagłówki, ciąg zapytania i treść. Próbka poniżej. Najważniejsze jest to, że treści JSON będą ciągami wymagającymi jawnegoJSON.parse(event.body)
wywołania (nie zapomnijtry/catch
o tym). Przykład poniżej.statusCode
,body
orazheaders
.body
powinien być ciągiem, więc zróbJSON.stringify(payload)
w razie potrzebystatusCode
może być liczbąheaders
jest obiektem nazw nagłówków do wartościPrzykładowy argument zdarzenia Lambda dla integracji proxy
Przykładowy kształt odpowiedzi na wywołanie zwrotne
Uwagi - uważam, że metody na
context
takich jakcontext.succeed()
są przestarzałe. Nie są już udokumentowane, chociaż nadal wydają się działać. Myślę, że kodowanie do API zwrotnego jest właściwą rzeczą w przyszłości.źródło
Chciałem, żeby błąd z Lambdy był poprawny Błąd 500, po przeprowadzeniu wielu badań wymyśliłem poniższe, które działa:
Na LAMBDA
Aby uzyskać dobrą odpowiedź, wracam jak poniżej:
W przypadku złej odpowiedzi wracam jak poniżej
W API Gateway
Aby uzyskać metodę GET, powiedz GET of / res1 / service1:
Następnie,
Teraz opublikuj / res1 / service1, kliknij opublikowany adres URL, który jest połączony z powyższą lambdą
Używając zaawansowanej wtyczki Chrome klienta REST (lub Postman), zobaczysz odpowiednie kody http, takie jak błąd serwera (500) lub 400, zamiast kodu odpowiedzi 200 http dla wszystkich żądań, które zostały podane w "httpStatusCode".
W 'Pulpicie nawigacyjnym' API, w API Gateway, możemy zobaczyć kody statusu http, jak poniżej:
źródło
Najłatwiej to zrobić, używając integracji LAMBDA_PROXY . Przy użyciu tej metody nie trzeba ustawiać żadnych specjalnych przekształceń w potoku API Gateway.
Twój zwracany obiekt musiałby być podobny do poniższego fragmentu:
module.exports.lambdaHandler = (event, context, done) => { // ... let response = { statusCode: 200, // or any other HTTP code headers: { // optional "any-http-header" : "my custom header value" }, body: JSON.stringify(payload) // data returned by the API Gateway endpoint }; done(null, response); // always return as a success };
Ma kilka wad: trzeba szczególnie uważać na obsługę błędów i sprzęganie funkcji lambda z punktem końcowym API Gateway; To powiedziawszy, jeśli tak naprawdę nie zamierzasz go używać nigdzie indziej, nie stanowi to dużego problemu.
źródło
Dla tych, którzy próbowali wszystkiego, co postawili na to pytanie i nie mogli tego zrobić (jak ja), sprawdź komentarz devkit do tego postu (uratował mój dzień):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Odtwarzając go w całości poniżej:
źródło
W ten sposób jest to zalecane na blogu AWS Compute w przypadku korzystania z bramy API. Sprawdzanie, czy integracja działa z bezpośrednim wywołaniem Lambda.
W przypadku bezpośrednich wywołań Lambda wydaje się, że jest to najlepsze rozwiązanie analizujące po stronie klienta.
źródło
Używam bezserwerowej wersji 0.5. Tak to działa w moim przypadku
s-function.json:
handler.js:
źródło
Jeśli nie chcesz korzystać z serwera proxy, możesz użyć tego szablonu:
źródło