Skip to content

Comment fonctionne le scaling des Lambdas AWS

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. 😅

Published inNon classé

Comments are closed.