Il y a quelques mois en arriĂšre, jâai dĂ©ployĂ© ma premiĂšre fonction Lambda AWS pour le compte de mon client. đ„ł
Le but Ă©tait de mettre en place une Lambda qui dĂ©tecte la crĂ©ation de loggroups puis, de vĂ©rifier qu’ils aient bien une rĂ©tention de deux semaines. Si ce nâĂ©tait pas le cas, la fonction rectifiait le tir en mettant en place la rĂ©tention attendue. Je ne rentrerai pas plus dans le dĂ©tail, ce nâest pas le but de lâarticle.
Pour cela, je me suis attelĂ© Ă lâĂ©criture du code en python. Je fais quelques tests et je valide le bon fonctionnement ! đ„ł
Plusieurs semaines passent, un collĂšgue me fait remarquer quâil y a Ă©normĂ©ment d’invocations de ma lambda dans les logs CloudTrail. đ„”
Je vais de ce pas voir ce quâil se passe. En effet, je constate un nombre dâinvocations faramineux. La lambda se dĂ©clenchait en boucle, essayant de mettre une rĂ©tention de 2 semaines sur un loggroup qui nâexistait plus⊠Inutile de vous prĂ©ciser que la facture AWS à ⊠Un petit peu grimper. đž đž đž
Je me suis rendu compte, que les lambdas Ă©taient un peu plus complexe que juste « oh, câest du serverless, je ne mâoccupe de rien, je push mon code. ».
Jâai eu envie de comprendre (heureusement pour le client đ ) comment fonctionne en dĂ©tail le scaling des Lambdas.
Vous aussi ? Parfait, alors zepartiiiii đđ
Mais dis moi Antoine, une Lambda, c’est quoi ?
AWS Lambda est un service de calcul serverless (sans serveur) qui peut ĂȘtre mis Ă l’Ă©chelle, dâune seule requĂȘte Ă des centaines de milliers par seconde (tient, ça me rappelle quelque chose đ ).
Nous dĂ©ployons notre code dans le cloud et AWS sâoccupe du reste. Soit, de lâinfrastructure et de sa mise Ă l’Ă©chelle.
Vous lâaurez compris, serverless ne veut pas dire quâil nây pas de serveurs (đ€Ż). DerriĂšre, AWS gĂšre toute une ferme de machines qui font tourner nos Lambdas.
Quand nous Ă©crivons notre code pour une fonction, il y a deux composants auxquels il faut penser : la concurrence et les requĂȘtes par seconde. Je vais dĂ©tailler ces points dans la suite de lâarticle.
Sachez que le modĂšle de payement est dit âpay as you goâ, en bon français, âpayer ce que vous utilisezâ. Ce qui va nous ĂȘtre facturĂ© sera uniquement le temps de calcul et les temps dâinvocation de notre Lambda. Ceci explique ma facture đ
Ce mode de paiement est assez commun lorsque lâon parle de Cloud. Cependant, il faut porter une attention particuliĂšre afin de ne pas sur-utiliser nos ressources.
Comment sont invoquées nos Lambda ?
Une fonction Lambda peut ĂȘtre exĂ©cutĂ©e de deux maniĂšres.
La premiĂšre est le modĂšle synchrone, câest-Ă -dire que lâon va âattendreâ pendant l’exĂ©cution de la fonction, avant de recevoir une rĂ©ponse.
Par exemple, vous interrogez une API pour avoir une liste dâutilisateurs. Vous allez devoir attendre l’exĂ©cution de la fonction pour quâelle vous retourne la liste de vos utilisateurs.
La seconde, est le modĂšle asynchrone. On va se baser sur les Ă©vĂ©nements. La fonction lambda place en file d’attente l’Ă©vĂ©nement Ă traiter et renvoie une rĂ©ponse immĂ©diatement.
L’environnement d’exĂ©cution d’une fonction Lambda
Nous avons deux processus de démarrage :
- Un démarrage à froid
- Un démarrage à chaud
Pour faire trĂšs simple, lors de la premiĂšre invocation, on va toujours procĂ©der par un dĂ©marrage Ă froid. AWS va procĂ©der aux Ă©tapes dâinitialisation, permettant de prĂ©parer la phase dâinvocation :

Une fois ces Ă©tapes faites, lorsque nous allons invoquer une nouvelle fois la fonction, ce sera avec un dĂ©marrage Ă chaud. Autrement dit, notre code au sein de la fonction va s’exĂ©cuter avec la phase dâinvocation directement.Â

Lorsquâune requĂȘte arrive pour la premiĂšre fois sur une fonction Lambda, une phase dâinitialisation commence. Durant cette phase, la Lambda ne peut traiter quâune seule requĂȘte Ă la fois.
Cependant, il est tout Ă fait possible dâavoir plusieurs phases dâinitialisation en simultanĂ©e.
On dit q’une requĂȘte est terminĂ©e Ă la fin de la phase d’initialisation et dâinvocation. On peut alors traiter une nouvelle requĂȘte. Mais cette fois-ci avec un dĂ©marrage Ă chaud.
Il paraĂźt quâune image vaut mille mots, alors je vous ai fait un petit schĂ©ma rĂ©capitulatif :

Une fois la requĂȘte 1 terminĂ©e, l’environnement d’exĂ©cution est disponible pour traiter une autre requĂȘte. Lorsque la requĂȘte 4 arrive, Lambda rĂ©utilise l’environnement d’exĂ©cution de la requĂȘte 1 et exĂ©cute l’invocation suivante, et ainsi de suite avec les requĂȘtes 5 et 6.
Comprendre le principe de concurrence
La notion de transaction par seconde est la somme de toutes les invocations Ă un instant T. Si une fonction prend 1 seconde Ă s’exĂ©cuter et quâil y a 3 autres invocations qui arrivent en mĂȘme temps, Lambda va crĂ©er 4 environnements d’exĂ©cution.
Dans ce cas de figure, Lambda va exĂ©cuter 4 requĂȘtes par seconde. Une nouvelle fois, voici un schĂ©ma reprĂ©sentant ce principe :

Dans le schĂ©ma ci-dessus, nous nous retrouvons dans le cas de figure oĂč la concurrence et les transactions par seconde sont identiques.
Cependant, ce nâest pas toujours le cas. Imaginons que notre Lambda Ă un temps d’exĂ©cution de 500 millisecondes. Nous aurons toujours une concurrence de 4, mais les transactions par seconde seront au nombre de 8. Un petit schĂ©ma ? đ

Sur le schĂ©ma, on constate que lâon a 4 invocations et 4 requĂȘtes simultanĂ©es. Elles s’exĂ©cutent en une demie seconde, nous pouvons dans ce cas, utiliser les dĂ©marrages Ă chaud sur une mĂȘme pĂ©riode de temps. Nous avons donc 8 transactions par seconde.
Il est possible de voir la concurrence de vos Lambda avec CloudWatch metrics. En utilisant la métrique ConcurrentExecutions.
Le principe de concurrence réservée
Avec ce que lâon a vu prĂ©cĂ©demment et lâintroduction de cet article, vous imaginez bien que si lâon ne fait pas attention, on peut invoquer notre Lambda un peu (beaucoup) trop souvent đ .
Câest pourquoi il existe un paramĂštre de concurrence rĂ©servĂ©e qui nous permet dâappliquer une limite Ă ne pas dĂ©passer. En cela, nous sommes en mesure de contrĂŽler la mise Ă l’Ă©chelle de notre fonction jusquâĂ la valeur de la concurrence rĂ©servĂ©e.

Je ne peux que vous conseiller de mettre en place cette protection et dâĂ©viter des centaines et des centaines dâinvocations concurrentes non souhaitĂ©es (votre service financier vous remerciera đ€đ€).
Je vais introduire trÚÚÚÚs briĂšvement le principe de concurrence provisionnĂ©e. Cette derniĂšre permet de paramĂ©trer un nombre minimum dâenvironnements d’exĂ©cution prĂȘt Ă lâemploi, rĂ©duisant lâimpact du dĂ©marrage Ă froid. Votre fonction sera prĂȘte Ă ĂȘtre invoquĂ©e directement.
Ce principe peut vous intĂ©resser lors de requĂȘtes synchrones ou lors dâun pic de trafic attendu.
Les quotas
Nous avons vu quâune fonction Lambda pouvait scale trĂšs facilement et trĂšs rapidement.
Parlons Ă prĂ©sent des quotas. đ
Nous avons le Burst concurrency quota, qui permet de lancer jusquâĂ 3 000 Lambdas concurrentes par minutes, dans les grandes rĂ©gions (Oregon, Virginia, Ireland).
Pour les autres régions, le quota est entre 1000 (Tokyo, Frankfurt, Ohio) et 500 pour toutes les autres.
Ă noter que câest une hard limit, il nây a pas de moyen dâaugmenter ce quota et il est partagĂ© pour toutes les fonctions dâun compte.
Le deuxiĂšme type de quota est le Account concurrency quota. Câest le nombre concurrence par dĂ©faut dâune rĂ©gion sur un compte AWS. Il est de 1000 et il est partagĂ© pour toutes les Lambdas du compte, mais celui-ci peut ĂȘtre augmentĂ©.
Conclusion
On arrive Ă la fin de cet article.
On peut mettre en lumiĂšre plusieurs points.
Le premier, câest que les services managĂ©s ou serverless ne sont pas si simples. Ok, on sâabstrait du cĂŽtĂ© infrastructure, mais nous ne sommes pas exempts de coĂ»ts.
Le deuxiĂšme et dernier point que je souhaite aborder, câest quâil nous arrive parfois de faire des erreurs liĂ©es Ă une mĂ©connaissance sur un sujet, une techno.
Ce nâest pas grave. La preuve, cela mâa donnĂ© envie de creuser ce sujet, permit dâapprendre et de comprendre comment fonctionne le scaling des lambdas. Et en plus, jâai le luxe de pouvoir vous partager tout ça ! GĂ©nial non ? đ
Cela ne serait certainement jamais arrivĂ© sans ma petite boulette. đ

Comments are closed.