web-dev-qa-db-fra.com

Est-il possible (ou efficace) d'exécuter un backend complet avec AWS Lambda (vs dire Elastic Beanstalk)

Je suis relativement nouveau dans le monde des serveurs, alors pardonnez-moi si c'est en partie fondamental (et le premier fragment de texte expliquera ma logique pour m'assurer que ce n'est pas imparfait). Toutes mes questions seront en gras, pour rendre votre aide plus facile :).

J'ai étudié et appris moi-même certaines des technologies AWS, et j'ai remarqué dans leur Mobile Hub que, si vous voulez la logique cloud, elles ne permettent que la configuration "automatique" des fonctions Lambda. Après avoir lu et fait des recherches, j'ai trouvé quelques ressources pointant vers une architecture "sans serveur" (prise en charge par l'introduction de Lambda). Auparavant, je pensais que Elastic Beanstalk avait été introduit pour simplifier considérablement la gestion des serveurs (en particulier pour les mobiles).

Pour les développeurs mobiles, il y a 2 options (évidemment plus, mais pour des raisons de simplicité, nous serons d'accord):

  • Configurez un haricot élastique avec au moins une instance fonctionnant 24h/24 et 7j/7 et disposant de plusieurs points de terminaison pour chaque URL.
  • Avec API Gateway, nous pouvons facilement acheminer les URL vers des fonctions Lambda spécifiques. Avec cela, nous pouvons traiter toutes les demandes (un peu comme installer une application Elastic Beanstalk).

Tout cela me porte à croire qu'un backend Lambda complet serait tout à fait possible et facile à créer pour une fraction du coût d'un serveur fonctionnant 24h/24 et 7j/7. Est-ce exact?

Maintenant, en supposant que ce qui précède est correct, nous devons déterminer si l’utilisation de Lambda est réellement bénéfique par rapport à Elastic Beanstalk.

Pour les serveurs simples, nous pourrions configurer quelques fonctions Lambda et les appeler un jour (et c’est probablement beaucoup plus simple et moins cher (du moins pour les petits projets) que d’utiliser Elastic Beanstalk).

Cependant, pour des serveurs plus complexes avec plus d'URL et de connexions à la base de données, les choses deviennent plus intéressantes.

Ce sont les problèmes que je vois avec l'utilisation de Lambda dans la situation ci-dessus

  • Chaque URL aurait sa propre passerelle API avec sa propre fonction Lambda. Si du code ou des modules sont utilisés dans plusieurs fonctions, nous devons les copier et les coller dans chaque fonction. 
  • Gérer plusieurs fonctions Lambda (et passerelles API) représente simplement plus de travail que de gérer un seul projet/référentiel/tout ce que vous voulez, appelez votre base de code.
  • Chaque fonction nécessitant une connexion à une base de données doit être connectée à l’intérieur de la fonction (par opposition à une connexion constante dans une application Node.js).

La seule façon (à laquelle je pouvais penser) d’éviter les deux premiers problèmes est de créer une fonction robuste qui joue le rôle de dispatch (la fonction principale prend un paramètre de la passerelle API et détermine le fichier à exécuter dans la fonction Lambda).

Y a-t-il des points importants qui me manquent pour déterminer si l'utilisation de Lambda sur Elastic Beanstalk en vaut la peine?

27
Matt

On dirait que vous l'avez déjà compris. Vous avez raison de dire que l’utilisation de Lambda au lieu d’avoir un serveur fonctionnant 24h/24 et 7j/7 peut entraîner des économies considérables. Cet article fait la demande:

Et cela fait économiser beaucoup d'argent à certains clients d'Amazon, avec au moins Un client Lambda satisfait économise 80% sur ses factures cloud.

Vous voudrez peut-être consulter le Serverless Framework , qui gère certains des problèmes.

Je pense qu'avec le temps, de nombreux problèmes disparaîtront au fur et à mesure qu'Amazon ajoute davantage de fonctionnalités à Lambda et que davantage d'outils tiers sont conçus à cet effet. Je découvre constamment de nouvelles utilisations pour Lambda, mais je découvre aussi constamment des utilisations qui semblent bien convenir au début, mais qui ne fonctionnent pas vraiment sur Lambda, du moins pas encore. Par exemple, il me faut vraiment un moyen de limiter le nombre d'instances d'une fonction Lambda pouvant être exécutées simultanément pour éviter de limiter le nombre maximal de connexions de base de données disponibles ou d'atteindre les limites d'utilisation des API tierces. J'ai aussi vraiment besoin de fonctions Lambda pour fonctionner dans mon VPC, mais cela est supposé arriver très bientôt.

12
Mark B

Comme d'autres l'ont déjà souligné, l'exécution de Lambda vs Elastic Beanstalk ou de vos instances EC2 auto-gérées présente certains avantages.

Frais

AWS prend en charge Auto-Scaling pour Elastic Beanstalk et EC2. Il est recommandé de toujours exécuter au moins deux instances pour le comportement de basculement. L'exécution de deux instances "nano" au minimum pour le basculement, chaque instance vous coûte (sans remises sur les instances réservées): 0,0059 USD * 24 * 30.5 = 4,31 USD pour le VM et 0,05 * 8 Go = 0,40 USD. Donc, une instance coûte 4,81 € et deux instances 9,62 €. Cependant, pour que l'AutoScaling fonctionne, vous avez besoin d'un équilibreur de charge qui vous redonne au moins 0,0225 USD * 24 * 30.5 = 16,47 USD (sans tenir compte des charges de la LCU). Load-Balancer peut être partagé par plusieurs services. Pour ce calcul, je viens de le fractionner artificiellement par 10 et de conclure qu'un microservice utilisant Eleastic Beanstalk ou EC2 vous coûtera 9,62 $ + 1,65 $ = 11,27 $.

Alors, comment cela se compare-t-il à Lambda? Avec Lambda, vous payez par appel et par gigaoctet seconde. J'ignore les coûts des appels, car ils représentent 0,20 USD par million de demandes. 1 million de demandes correspond à 0,4 demande par seconde par mois. Si vous avez des charges plus élevées, vous devrez également payer les coûts de la LCU Load Balancer . Lambda coûte 0,00001667 USD par Go-seconde . Elastic Beanstalk et EC2 consommeront tous deux une partie de la mémoire de 512 Mo le système d'exploitation et le conteneur. Je suppose simplement que 256 Mo sont réellement utilisables. Si vous avez deux instances, cela correspond à 2 * 256 Mo/1024 Mo * 60 * 60 * 24 * 30.5 = 1317600 Go-secondes. Ce montant en Go-secondes vous coûterait 1317600 * 0,00001667 $ = 21,96 dollars. Bien que cela semble plus coûteux, gardez à l’esprit que votre trafic ne se répartit probablement pas de manière uniforme; vous aurez donc probablement besoin de plus d’instances, ce qui augmente les coûts. Avec Lambda, vous ne payez que ce que vous utilisez réellement.

Mise à l'échelle

Lambda s'adapte à la demande et comme déjà dit, vous ne payez que ce dont vous avez réellement besoin au lieu d'une valeur de base sous-utilisée.

Performance imprévisible

Un piège de Lambda est la performance imprévisible. Bien que les conteneurs soient réutilisés, ils doivent être réchauffés à chaque nouvelle instance. Les premières requêtes seront généralement lentes, surtout si vous utilisez Java. Node.js est supposé être plus léger au démarrage, mais plus lent lors de l'exécution. Par exemple, lorsqu'une nouvelle instance Java à faible mémoire de 128 Mo est créée et que votre bibliothèque Lambda contient des bibliothèques, le premier appel peut durer 30 secondes ou plus. Les instances sont figées entre les requêtes. Si l'instance n'est pas utilisée pendant un certain temps, il faut plus de temps pour se réveiller. L'augmentation de la mémoire peut réduire le temps de préchauffage et de réveil. Cependant, l’un des principaux problèmes peut être l’accès à des sources de données externes. Comme les instances sont gelées entre les demandes, le regroupement de connexions approprié n'est pas pris en charge. Si vous faites le regroupement de connexion de toute façon, vous pouvez finir par avoir des connexions obsolètes. En fonction de la base de données et du pilote, l’ouverture et la fermeture d’une connexion peut coûter très cher.

Autres limites

Comme mentionné ci-dessus, le regroupement de connexions n'est pas directement pris en charge, ce qui peut poser problème pour l'accès à la base de données ou l'accès à d'autres systèmes en général ... Si vous utilisez des frameworks pour accélérer votre développement, ils risquent de ne pas convenir à Lambda.

Les limites mentionnées par Mark B ont maintenant disparu. De nos jours, Lambdas peut fonctionner dans un VPC. Même si je ne connais pas de moyen officiel de limiter le nombre d'instances simultanées, si vous utilisez un VPC, vous pouvez restreindre le sous-réseau d'adresses IP disponibles et chaque Lambda nécessite une adresse IP pour pouvoir limiter indirectement le nombre d'instances Lambda.

Bons cas d'utilisation

Si vous ne vous souciez pas trop des performances constantes, Lambda est économique et évolutif. Un très bon ajustement est le traitement de petits lots.

7
Udo Held

La question est en fait FAAS vs PAAS. L'architecture Lambda/Serverless peut être considérée comme un Fonctionne en tant que service , tandis que Beanstalk relève de Platform en tant que service

Il y a eu beaucoup de confusion entre FAAS et PAAS. Beaucoup disent que FAAS est aussi un PAAS. Je voudrais souligner les caractéristiques distinctives entre FAAS et PAAS.

Dis, j'ai une application CRUD qui a Créer, Lire, Mettre à jour et Supprimer opérations. Généralement, une application Web reçoit plus de trafic sur l'opération Lecture .

+---------------------------------------------+--------------------------------------------------------+
|                     FAAS                    |                          PAAS                          |
+---------------------------------------------+--------------------------------------------------------+
| In case of traffic, it scales that specific | But it scales the whole application,                   |
| function handling the read operation.       | a separate auto-scaled instance in case of bean stalk. |
+---------------------------------------------+--------------------------------------------------------+
| Pay one and only when your function         | Have to pay for atleast a single instance,             |
| is invoked.                                 | even though there is no traffic.                       |
+---------------------------------------------+--------------------------------------------------------+

De mon point de vue, ces deux points différencient FAAS, une architecture dite "sans serveur", de PAAS.

6
Lakshman Diwaakar

Consultez le client DynamoDB DAX pour vos fonctions lambda. La latence est réduite de quelques millisecondes à quelques microsecondes si la vitesse de connexion à la base de données vous préoccupe.

0
Steve Freed