Par exemple, si je veux renvoyer une erreur spécifique 400 pour des paramètres non valides ou peut-être un 201 lorsque l'appel de la fonction lambda a abouti à une création.
J'aimerais avoir différents codes d'état http, mais il semble que la passerelle api renvoie toujours un code d'état 200 même si la fonction lambda renvoie une erreur.
amazon-web-services
aws-lambda
aws-api-gateway
SingeBonkey
la source
la source
Réponses:
Mise à jour du 20-9-2016
Amazon a finalement rendu cela facile en utilisant l' intégration du proxy Lambda . Cela permet à votre fonction Lambda de renvoyer les codes HTTP et les en-têtes appropriés:
Dites adieu au mappage des requêtes / réponses dans la passerelle API!
Option 2
Intégrez une application Express existante à Lambda / API Gateway à l'aide de aws-serverless-express .
la source
callback
style. Fais justecallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Voici le moyen le plus rapide de renvoyer des codes d'état HTTP personnalisés et un
errorMessage
:Dans le tableau de bord API Gateway, procédez comme suit:
Ajoutez une réponse d'intégration pour chacun des codes d'état HTTP que vous avez créés précédemment. Assurez-vous que le passthrough d'entrée est coché. Utilisez l' expression régulière d'erreur lambda pour identifier le code d'état à utiliser lorsque vous renvoyez un message d'erreur à partir de votre fonction lambda. Par exemple:
Votre route API Gateway doit renvoyer ceci:
Je ne vois aucun moyen de copier ces paramètres et de les réutiliser pour différentes méthodes, nous avons donc beaucoup de saisie manuelle redondante ennuyeuse à faire!
Mes réponses d'intégration ressemblent à ceci:
la source
return context.fail(new Error('bad one'))
Pour pouvoir renvoyer un objet d'erreur personnalisé au format JSON, vous devez franchir quelques obstacles.
Tout d'abord, vous devez échouer le Lambda et lui passer un objet JSON stringifié:
Ensuite, vous configurez le mappage d'expression régulière pour chacun des codes d'état que vous souhaitez renvoyer. En utilisant l'objet que j'ai défini ci-dessus, vous configureriez cette regex pour 400:
. * "statut": 400. *
Enfin, vous configurez un modèle de mappage pour extraire la réponse JSON de la propriété errorMessage renvoyée par Lambda. Le modèle de mappage ressemble à ceci:
$ input.path ('$. errorMessage')
J'ai écrit un article à ce sujet qui entre plus en détail et explique le flux de réponse de Lambda à API Gateway ici: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -et-code-d'état-de-passerelle-api-avec-lambda /
la source
1) Configurez votre ressource API Gateway pour utiliser l' intégration du proxy Lambda en cochant la case intitulée «Utiliser l'intégration du proxy Lambda» sur l'écran «Demande d'intégration» de la définition de la ressource API Gateway. (Ou définissez-le dans votre configuration cloudformation / terraform / serverless / etc)
2) Changez votre code lambda de 2 façons
event
correctement l'entrée (1er argument de fonction). Ce n'est plus seulement la charge utile nue, il représente la requête HTTP entière, y compris les en-têtes, la chaîne de requête et le corps. Exemple ci-dessous. Le point clé est que les corps JSON seront des chaînes nécessitant unJSON.parse(event.body)
appel explicite (n'oubliez pastry/catch
). L'exemple est ci-dessous.statusCode
, y comprisbody
, etheaders
.body
devrait être une chaîne, alors faites-leJSON.stringify(payload)
si nécessairestatusCode
peut être un nombreheaders
est un objet de noms d'en-tête à valeursExemple d'argument d'événement Lambda pour l'intégration du proxy
Exemple de forme de réponse de rappel
Remarques - Je crois que les méthodes
context
telles quecontext.succeed()
sont obsolètes. Ils ne sont plus documentés bien qu'ils semblent toujours fonctionner. Je pense que le codage de l'API de rappel est la bonne chose pour l'avenir.la source
Je voulais qu'une erreur de Lambda soit une erreur 500 correcte, après avoir fait beaucoup de recherches, j'ai trouvé ce qui suit, qui fonctionne:
Sur LAMBDA
Pour une bonne réponse, je reviens comme ci-dessous:
Pour une mauvaise réponse, retour comme ci-dessous
Sur API Gateway
Pour une MÉTHODE GET, dites GET de / res1 / service1:
Ensuite,
Maintenant, publiez / res1 / service1, appuyez sur l'URL publiée, qui est connectée à lambda ci-dessus
Utilisé le plugin Chrome Advanced REST client (ou Postman), vous verrez les codes http appropriés comme l'erreur de serveur (500) ou 400, au lieu de 200 codes de réponse http pour toutes les requêtes qui ont été données dans "httpStatusCode".
Depuis le `` tableau de bord '' de l'API, dans API Gateway, nous pouvons voir les codes d'état http comme ci-dessous:
la source
Le moyen le plus simple de procéder consiste à utiliser l'intégration LAMBDA_PROXY . En utilisant cette méthode, vous n'avez besoin d'aucune transformation spéciale pour être définie dans le pipeline API Gateway.
Votre objet de retour devrait être similaire à l'extrait ci-dessous:
Cela présente quelques inconvénients: comme devoir être particulièrement prudent dans la gestion des erreurs et coupler votre fonction lambda au point de terminaison API Gateway; Cela dit, si vous n'alliez pas vraiment l'utiliser ailleurs, ce n'est pas vraiment un problème.
la source
Pour ceux qui ont tout essayé sur cette question et n'ont pas pu faire fonctionner cela (comme moi), consultez le commentaire thedevkit sur ce post (a sauvé ma journée):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Le reproduire entièrement ci-dessous:
la source
C'est ainsi qu'il est recommandé sur un blog AWS Compute si vous utilisez API Gateway. Vérification pour voir si l'intégration fonctionne avec un appel Lambda direct.
Pour les appels Lambda directs, cela semble être la meilleure solution d'analyse du côté client.
la source
J'utilise 0.5 sans serveur. C'est comme ça que ça marche, pour mon cas
s-function.json:
handler.js:
la source
Si vous ne souhaitez pas utiliser de proxy, vous pouvez utiliser ce modèle:
la source