Imaginez un petit programme que vous voulez exécuter seulement quand quelqu'un l'appelle : recevoir l'avis qu'un client a payé, traiter un formulaire de contact, convertir une image. Vous ne voulez pas d'un serveur allumé 24 heures sur 24 pour cela. C'est à cela que sert Lambda : vous confiez votre code à Amazon, et Amazon l'exécute seulement quand c'est nécessaire et ne vous facture que ce temps-là. Aucune machine à entretenir.
La question est : comment l'appeler ? Le plus universel est de lui donner une adresse web, une URL comme https://algo.on.aws/, de façon que n'importe quel navigateur ou programme puisse « l'ouvrir » et que votre code réponde. Ce guide fait exactement cela avec l'option intégrée à Lambda, appelée URL de fonction. Rien à installer ni à souscrire en plus.
Avant de commencer : ce que signifie chaque chose
- Fonction Lambda
- Un morceau de code à vous (en Python, Node.js, etc.) stocké chez Amazon, qui s'exécute quand quelque chose l'appelle et s'éteint à la fin. Vous payez chaque exécution, pas le fait d'avoir quelque chose d'allumé.
- URL
- Une adresse web, ce qu'on tape dans la barre du navigateur. Ici, l'adresse par laquelle on peut appeler votre fonction.
- Requête et réponse
- Quand un navigateur ou un programme ouvre une URL, il envoie une « requête » (ce qu'il veut) et reçoit une « réponse » (ce qu'on lui renvoie). Votre fonction reçoit la requête et fabrique la réponse.
- Webhook
- Un avis automatique qu'un service (par exemple votre passerelle de paiement) envoie à une URL à vous quand quelque chose se produit. Pour le recevoir, il vous faut une URL qui réponde : ce guide vous la donne.
- API Gateway
- Un autre service d'Amazon, plus complet et plus complexe, qui sert aussi à mettre une adresse web devant une fonction. Pendant des années, c'était la seule option. Aujourd'hui, pour la plupart des cas simples, il n'est pas nécessaire, et ce guide ne l'utilise pas.
- CORS
- Une règle de sécurité des navigateurs : une page web ne peut appeler des adresses d'autres sites que si ces sites l'autorisent expressément. Si votre fonction va être appelée par une page web à vous, il faut dire à Lambda quelles pages peuvent le faire.
- Journaux (logs)
- Le journal de ce que fait votre fonction à chaque exécution : combien de temps elle a mis, si elle a échoué et pourquoi. Ils sont stockés dans un autre service appelé CloudWatch.
Pas à pas
Vérifiez que votre fonction sait répondre à une requête web
Quand la fonction est appelée par son adresse web, Lambda lui remet un paquet de données avec la requête (ce qui était demandé, avec quelles données) et attend que votre code renvoie une réponse avec deux choses : un code d'état (200 veut dire « tout va bien ») et un corps (le texte ou les données que vous renvoyez). Si votre fonction a été écrite pour un autre usage, il faut l'adapter. Un exemple minimal, en Node.js, qui répond « bonjour, monde » :
export const handler = async (event) => ({ statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ hola: "mundo" }) });Si ce n'est pas vous qui programmez, transmettez ce paragraphe à la personne qui le fait : elle saura ce que cela veut dire.
Décidez qui pourra appeler la fonction
C'est la seule décision importante du guide, et il vaut mieux bien la comprendre. Il y a deux options :
- Seulement avec des identifiants AWS (l'option s'appelle
AWS_IAM) : seul un programme à vous ayant des permissions sur votre compte Amazon pourra l'appeler. C'est la plus sûre, mais un navigateur normal ou un service externe ne pourront pas l'utiliser. - Ouverte (l'option s'appelle
NONE) : toute personne qui connaît l'adresse pourra l'appeler. C'est ce qu'il vous faut si elle doit être appelée par un service externe (un webhook) ou par une page web. En contrepartie, c'est votre code qui doit assurer la sécurité : vérifier un mot de passe ou une signature à chaque appel. Nous le voyons à la dernière étape.
Règle simple : si vous ne savez pas laquelle choisir, choisissez la première. Si la fonction doit recevoir des appels de l'extérieur de votre compte, choisissez la seconde et ne sautez pas la dernière étape.
- Seulement avec des identifiants AWS (l'option s'appelle
Activez l'adresse web
Dans la console AWS, entrez dans Lambda, ouvrez votre fonction et cliquez sur l'onglet Configuration. Dans le menu de gauche, choisissez URL de fonction et cliquez sur Créer une URL de fonction. Choisissez le type d'accès de l'étape précédente.
Si elle va être appelée par une page web à vous depuis un autre domaine, dépliez CORS et écrivez l'adresse de cette page dans « Autoriser l'origine » (par exemple
https://miweb.com). Si vous mettez un astérisque, n'importe quel site au monde pourra l'appeler depuis le navigateur ; évitez-le sauf si c'est bien ce que vous voulez. Enregistrez. En haut apparaît la nouvelle adresse, qui ressemble à ceci :https://xxxxxxxx.lambda-url.eu-west-1.on.aws/. C'est votre URL.Testez-la
Si vous avez choisi l'option ouverte, copiez l'adresse et collez-la dans le navigateur : vous devriez voir la réponse de votre fonction (dans l'exemple, le texte « hola, mundo »). Elle fonctionne déjà.
Si vous préférez la tester depuis un terminal, dans CloudShell (l'icône de terminal dans la barre supérieure de la console AWS), tapez :
curl -i https://xxxxxxxx.lambda-url.eu-west-1.on.aws/Si vous avez choisi l'option avec identifiants, le navigateur dira « Forbidden » : c'est attendu, puisqu'il ne porte pas d'identifiants. Le test devra être fait par votre programme qui va l'appeler, en utilisant les bibliothèques AWS, qui savent déjà signer les requêtes.
Regardez le journal des exécutions
Onglet Surveiller, bouton Afficher les journaux CloudWatch. Chaque appel laisse une note avec le temps qu'il a pris et ce que votre code a écrit. Si un appel renvoie une erreur, vous en verrez ici la raison. Un conseil qui fait économiser de l'argent : dans ce groupe de journaux, définissez une rétention de, par exemple, 30 jours ; sinon, les journaux sont conservés pour toujours et facturés.
Si vous l'avez laissée ouverte, protégez-la
Ouverte veut dire que n'importe qui peut l'appeler, donc votre code doit vérifier quelque chose à chaque appel. Le plus courant : le service qui vous envoie le webhook inclut une signature ou une clé secrète dans chaque avis, et votre fonction vérifie qu'elle est correcte avant de faire quoi que ce soit. Gardez cette clé dans les variables d'environnement de la fonction (onglet Configuration), pas écrite dans le code.
Et mettez un plafond au nombre d'exécutions simultanées (simultanéité réservée, dans Configuration) : si quelqu'un bombarde l'adresse, le plafond évite que la facture s'envole.
Ce qui peut mal tourner
La page web parle de « CORS » et ne reçoit pas de réponse
C'est le navigateur qui protège l'utilisateur : votre fonction n'a pas dit que cette page pouvait l'appeler. Modifiez l'URL de fonction, section CORS, et ajoutez l'adresse exacte de votre page et le type de requête qu'elle utilise (GET, POST). Si votre code renvoie aussi des en-têtes CORS de son côté, retirez-les de l'un des deux endroits : en double, ils échouent aussi.
Elle renvoie « Forbidden » alors que je l'ai laissée ouverte
Il manque à la fonction la permission qui autorise n'importe qui à l'appeler. Quand on crée l'URL depuis la console, elle s'ajoute toute seule ; si c'est un programme ou un script qui l'a créée, demandez à son auteur d'ajouter la permission lambda:InvokeFunctionUrl pour le public (principal *).
Le premier appel prend plusieurs secondes, puis ça va vite
Cela s'appelle le « démarrage à froid » : si la fonction n'a pas servi depuis un moment, Amazon doit la recharger. Pour un webhook, peu importe. Pour un site avec des utilisateurs qui attendent, on peut le réduire en rendant la fonction plus petite ou en payant pour la garder toujours prête (simultanéité provisionnée).
J'ai besoin que l'adresse soit sur mon domaine, ou de contrôler qui appelle et combien
Pour cela, il faut API Gateway, le service plus complet mentionné au début, ou mettre CloudFront devant. L'URL de fonction est le chemin court, et pour la plupart des gens elle suffit ; quand elle deviendra trop juste, vous le remarquerez.
Dans Simplio
Dans Simplio, vos fonctions Lambda apparaissent avec leur état et leurs journaux dans une liste ; si elles sont en Python, Node.js ou Ruby, vous pouvez modifier le code, enregistrer avec le double facteur et les tester sur-le-champ en voyant la réponse. Et leur donner une adresse web se fait en un clic, avec le type d'accès expliqué clairement. Chaque personne de votre équipe ne voit que les fonctions que vous lui attribuez.
La même chose, dans AWS et dans Simplio
| Dans la console AWS | Dans Simplio | |
|---|---|---|
| Donner l'adresse web à la fonction | Lambda, Configuration, URL de fonction, type d'accès, CORS : 5 étapes | Bouton « URL publique » sur la fonction, avec le type d'accès expliqué : 1 clic |
| La tester et voir ce qu'elle a renvoyé | Navigateur ou curl, et CloudWatch pour les journaux | Tester depuis Simplio en voyant réponse et journaux sur le même écran |
| Modifier le code | Éditeur de Lambda, sans contrôle de qui y a touché | Éditeur avec double facteur à l'enregistrement, et journal d'activité |