Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Une application événementielle bien conçue utilise une combinaison de AWS services et de code personnalisé pour traiter et gérer les demandes et les données. Ce chapitre se concentre sur des sujets spécifiques à Lambda en matière de conception d'applications. Les architectes sans serveur doivent tenir compte de nombreuses considérations importantes lorsqu’ils conçoivent des applications pour des systèmes de production très sollicités.
Bon nombre des pratiques exemplaires applicables au développement de logiciels et aux systèmes distribués s’appliquent également au développement d’applications sans serveur. L’objectif global est de développer des charges de travail qui sont :
-
Fiable : offrez à vos utilisateurs finaux un haut niveau de disponibilité. AWS les services sans serveur sont fiables car ils sont également conçus pour résister aux défaillances.
-
Durable : offre des options de stockage qui répondent aux besoins de durabilité de votre charge de travail.
-
Sécurisé : suivre les meilleures pratiques et utiliser les outils fournis pour sécuriser l'accès aux charges de travail et limiter le rayon d'explosion.
-
Performances : utilisation efficace des ressources informatiques et satisfaction des besoins de performance de vos utilisateurs finaux.
-
Rentabilité : conception d'architectures qui évitent les coûts inutiles, qui peuvent évoluer sans dépenses excessives et être mises hors service sans frais supplémentaires importants.
Les principes de conception suivants peuvent vous aider à créer des charges de travail répondant à ces objectifs. Tous les principes ne s'appliquent peut-être pas à toutes les architectures, mais ils devraient vous guider dans vos décisions générales en matière d'architecture.
Utilisation de services plutôt que de code personnalisé
Les applications sans serveur comprennent généralement plusieurs AWS services, intégrés à du code personnalisé exécuté dans les fonctions Lambda. Lambda peut être intégré à la plupart des AWS services, mais les services les plus couramment utilisés dans les applications sans serveur sont les suivants :
Catégorie | AWS service |
---|---|
Calcul |
AWS Lambda |
Stockage de données |
Amazon S3 Amazon DynamoDB Amazon RDS |
« Hello, World! » |
Amazon API Gateway |
Intégration d’applications |
Amazon EventBridge Amazon SNS Amazon SQS |
Orchestration |
AWS Step Functions |
Données de streaming et analytique |
Amazon Data Firehose |
Il existe de nombreux modèles courants bien établis dans les architectures distribuées que vous pouvez créer vous-même ou implémenter à l'aide de AWS services. Pour la plupart des clients, le développement de ces modèles à partir de zéro présente peu d’intérêt commercial. Lorsque votre application a besoin de l'un de ces modèles, utilisez le AWS service correspondant :
Modèle | AWS service |
---|---|
File d’attente |
Amazon SQS |
Bus d’événement |
Amazon EventBridge |
Publication-abonnement (diffusion en éventail) |
Amazon SNS |
Orchestration |
AWS Step Functions |
« Hello, World! » |
Amazon API Gateway |
Flux d’événement |
Amazon Kinesis |
Ces services sont conçus pour s’intégrer à Lambda et vous pouvez utiliser l’infrastructure en tant que code (IaC) pour créer et supprimer des ressources dans les services. Vous pouvez utiliser n’importe lequel de ces services via le kit SDK AWS
Comprendre les niveaux d'abstraction Lambda
Le service Lambda limite votre accès aux systèmes d’exploitation, aux hyperviseurs et au matériel sous-jacents qui exécutent vos fonctions Lambda. Le service améliore et modifie continuellement l’infrastructure afin d’ajouter des fonctionnalités, de réduire les coûts et de rendre le service plus performant. Votre code ne doit émettre aucune hypothèse quant à l’architecture de Lambda et à l’affinité matérielle.
De même, les intégrations de Lambda avec d'autres services sont gérées par AWS, et seul un petit nombre d'options de configuration vous sont proposées. Par exemple, lorsque API Gateway et Lambda interagissent, il n'existe aucun concept d'équilibrage de charge puisqu'il est entièrement géré par les services. Vous n'avez également aucun contrôle direct sur les zones de disponibilité
Cette abstraction vous permet de vous concentrer sur les aspects d’intégration de votre application, le flux de données et la logique métier dans laquelle votre charge de travail apporte de la valeur à vos utilisateurs finaux. En permettant aux services de gérer les mécanismes sous-jacents, vous pouvez développer des applications plus rapidement avec moins de code personnalisé à gérer.
Intégrer l'apatridie dans les fonctions
Lorsque vous créez des fonctions Lambda, vous devez partir du principe que l’environnement n’existe que pour une seule invocation. La fonction doit initialiser tout état requis lorsqu'elle est démarrée pour la première fois. Par exemple, votre fonction peut nécessiter l'extraction de données depuis une table DynamoDB. Il doit valider toute modification permanente des données dans un magasin durable tel qu'Amazon S3, DynamoDB ou Amazon SQS avant de le quitter. Il ne doit pas s'appuyer sur des structures de données ou des fichiers temporaires existants, ni sur un état interne qui serait géré par de multiples invocations.
Pour initialiser les connexions aux bases de données et les bibliothèques, ou pour initialiser l'état de chargement, vous pouvez tirer parti de l'initialisation statique. Les environnements d’exécution étant réutilisés dans la mesure du possible pour améliorer les performances, vous pouvez amortir le temps nécessaire à l’initialisation de ces ressources sur plusieurs invocations. Cependant, vous ne devez stocker aucune variable ou donnée utilisée dans la fonction dans cette portée globale.
Minimiser le couplage
La plupart des architectures devraient préférer les fonctions plus nombreuses et plus petites aux fonctions moins nombreuses et plus grandes. Le but de chaque fonction doit être de gérer l’événement transmis à la fonction, sans aucune connaissance ni attente quant au flux de travail global ou au volume des transactions. Cela rend la fonction indépendante de la source de l’événement avec un couplage minimal avec les autres services.
Toutes les constantes de portée globale qui changent rarement doivent être implémentées en tant que variables d’environnement afin de permettre les mises à jour sans déploiement. Tous les secrets ou informations sensibles doivent être stockés dans AWS Systems Manager Parameter Store ou dans AWS Secrets Manager
Créez pour des données à la demande plutôt que pour des lots
De nombreux systèmes traditionnels sont conçus pour fonctionner périodiquement et traiter des lots de transactions accumulés au fil du temps. Par exemple, une application bancaire peut s’exécuter toutes les heures pour traiter les transactions des guichets automatiques dans des registres centraux. Dans les applications basées sur Lambda, le traitement personnalisé doit être déclenché par chaque événement, ce qui permet au service d’augmenter verticalement la simultanéité selon les besoins, afin de fournir un traitement des transactions en temps quasi réel.
Bien que vous puissiez exécuter des tâches cron
Par exemple, il n'est pas recommandé d'utiliser un processus par lots qui déclenche une fonction Lambda pour récupérer une liste de nouveaux objets Amazon S3. Cela est dû au fait que le service peut recevoir plus de nouveaux objets entre les lots que ce qui peut être traité dans le cadre d’une fonction Lambda de 15 minutes.

Amazon S3 doit plutôt invoquer la fonction Lambda chaque fois qu'un nouvel objet est placé dans le compartiment. Cette approche est nettement plus évolutive et fonctionne quasiment en temps réel.

Pensez à AWS Step Functions l'orchestration
Les flux de travail qui impliquent une logique de branchement, différents types de modèles d'échec et une logique de nouvelle tentative utilisent généralement un orchestrateur pour suivre l'état de l'exécution globale. Évitez d'utiliser les fonctions Lambda à cette fin, car cela entraîne un couplage étroit et un routage de gestion de code complexe.
Avec AWS Step Functions
Il est courant que les flux de travail simplifiés dans les fonctions Lambda se complexifient au fil du temps. Lorsque vous utilisez une application de production sans serveur, il est important d’identifier le moment où cela se produit, afin de pouvoir migrer cette logique vers une machine d’état.
Implémenter l'idempuissance
AWS les services sans serveur, y compris Lambda, sont tolérants aux pannes et conçus pour gérer les défaillances. Par exemple, si un service invoque une fonction Lambda et qu'il y a une interruption de service, Lambda invoque votre fonction dans une autre zone de disponibilité. Si votre fonction génère une erreur, Lambda tente à nouveau l'invocation.
Comme le même événement peut être reçu plusieurs fois, les fonctions doivent être conçues pour être idempotentes
Vous pouvez implémenter l'idempotencie dans les fonctions Lambda en utilisant une table DynamoDB pour suivre les identifiants récemment traités afin de déterminer si la transaction a déjà été traitée précédemment. La table DynamoDB implémente généralement une valeur de durée de vie (TTL) pour faire expirer les éléments afin de limiter l’espace de stockage utilisé.
Utiliser plusieurs AWS comptes pour gérer les quotas
De nombreux quotas de service AWS sont définis au niveau du compte. Cela signifie qu'au fur et à mesure que vous ajoutez de nouvelles charges de travail, vous pouvez rapidement épuiser vos limites.
Un moyen efficace de résoudre ce problème consiste à utiliser plusieurs AWS comptes, en consacrant chaque charge de travail à son propre compte. Cela empêche le partage des quotas avec d’autres charges de travail ou des ressources non liées à la production.
En outre, en utilisant AWS Organizations
Une approche courante consiste à fournir un AWS compte à chaque développeur, puis à utiliser des comptes distincts pour la phase de déploiement et de production de la version bêta :

Dans ce modèle, chaque développeur a son propre ensemble de limites pour le compte, de sorte que leur utilisation n'a aucun impact sur votre environnement de production. Cette approche permet également aux développeurs de tester les fonctions Lambda localement sur leurs machines de développement par rapport aux ressources cloud actives de leurs comptes individuels.