Comment créer un serveur sans serveur avec AWS Lambda et Node.js

Familiarisez-vous avec FaaS (function-as-a-service), déployez une démonstration sur une plate-forme informatique sans serveur AWS Lambda, connectez une base de données MongoDB en tant que service à une API REST sans serveur, etc.

L'architecture sans serveur est un modèle d'exécution du cloud computing dans lequel un fournisseur de cloud tel qu'AWS, Azure ou Google Cloud est utilisé pour déployer du code backend ou côté serveur. Par rapport aux applications Web déployées de manière traditionnelle, dans une architecture sans serveur, le développeur n'a pas à entretenir les serveurs ou l'infrastructure. Ils doivent uniquement payer un abonnement au fournisseur tiers, ce dernier étant responsable de gérer le fonctionnement de la logique dorsale d'un serveur, ainsi que de son évolutivité, de sa fiabilité et de sa sécurité.

Une architecture sans serveur peut être mise en œuvre de deux manières pour déployer votre code côté serveur. Le premier est Backend as a Service ou BaaS. Firebase est un bon exemple de ce que vous pouvez souvent voir en conjonction entre une application Web ou mobile et une base de données ou en fournissant une authentification d'utilisateur.

Ce que nous allons examiner dans cet article s’appelle Fonction en tant que service ou FaaS. Avec FaaS, le code serveur est exécuté dans des conteneurs généralement déclenchés par des événements courants tels que les requêtes HTTP du client, les opérations de base de données, les téléchargements de fichiers, les événements programmés, etc. Le code sur le fournisseur de cloud déployé et en cours d’exécution se présente sous la forme d’une fonction.

Dans FaaS, ces fonctions sont déployées sous forme modulaire. Une fonction correspond à chaque opération, éliminant ainsi le reste du code et le temps passé à l'écriture du code standard pour la configuration d'un serveur et de modèles de données. Ces fonctions modulaires peuvent en outre être redimensionnées automatiquement et indépendamment. De cette façon, vous pouvez passer plus de temps à écrire la logique de l'application avec laquelle un utilisateur potentiel va interagir. Vous n'êtes pas obligé de faire évoluer la totalité de l'application et de la payer. Les cas d'utilisation courants de FaaS ont jusqu'à présent été implémentés: tâches planifiées (ou tâches cron), automatisation, applications Web et chatbots.

Les fournisseurs de plate-forme de services FaaS courants sont:

  • AWS Lambda
  • Fonctions Google Cloud
  • Fonctions Microsoft Azure
  • Apache OpenWhisk

Dans le didacticiel suivant, nous allons créer une démonstration à déployer sur un fournisseur d'infrastructure sans serveur tel que AWS Lambda.

Qu'est-ce que AWS Lambda?

Afin de créer et de déployer une fonction dorsale pour gérer une opération donnée, je vais commencer par configurer le fournisseur de services que vous allez utiliser pour suivre cet article. AWS Lambda prend en charge différents environnements d'exécution tels que Node.js, Java, Python, .NET Core et Go pour l'exécution d'une fonction.

La fonction s'exécute dans un conteneur avec une AMI Amazon Linux 64 bits. Vous vous demandez peut-être pourquoi je vous raconte tout cela? Eh bien, utiliser un serveur sans serveur pour la première fois peut être un peu pénible et si vous savez ce que vous recevez en retour, c’est toujours bon! Des trucs plus geek sont listés ci-dessous.

  • Mémoire: 128 Mo - 3008 Mo
  • Espace disque éphémère: 512 Mo
  • Durée maximale d'exécution: 300 secondes
  • Taille de l'emballage compressé: 50 Mo
  • Taille de l'emballage non compressé: 250 Mo

La durée d'exécution ici signifie que votre fonction Lambda ne peut s'exécuter que pendant 5 minutes maximum. Cela signifie que cela n'est pas destiné à l'exécution de processus plus longs. L'espace disque est la forme d'un stockage temporaire. La taille du paquet fait référence au code nécessaire pour déclencher la fonction du serveur. Dans le cas de Node.js, cela signifie que toutes les dépendances importées sur notre serveur (par exemple, node_modules / directory).

Une fonction lambda typique dans un serveur Node.js ressemblera à celle ci-dessous.

Dans la syntaxe ci-dessus, handlerFunction est le nom de notre fonction Lambda. L'objet événement contient des informations sur l'événement qui déclenche l'exécution de la fonction lambda. L'objet de contexte contient des informations sur le runtime. Le reste du code est écrit dans la fonction Lambda et un rappel est enfin appelé avec un objet d'erreur et un objet de résultat. Nous en apprendrons plus sur ces objets plus tard, lorsque nous les mettrons en œuvre.

Configuration d'AWS Lambda

Pour configurer une fonction Lambda sur AWS, nous devons d’abord enregistrer un compte pour les clés d’accès. Utilisez vos informations d'identification pour vous connecter ou vous inscrire à un nouveau compte sur console.amazon.com. Une fois le processus de vérification terminé, l'écran suivant vous accueillera.

Pour obtenir les clés et les autorisations nécessaires au déploiement d'une fonction, nous devons passer à Gestion des identités et des accès (IAM). Cliquez ensuite sur l'onglet Utilisateurs dans la barre latérale gauche et cliquez sur le bouton Ajouter un utilisateur. Complétez les informations dans le formulaire ci-dessous et activez Type d'accès> Accès par programme.

Ensuite, sur la page suivante, sélectionnez Attacher directement les stratégies existantes, puis sélectionnez un nom de stratégie AdministratorAccess.

Cliquez sur le bouton Suivant: Vérifier, puis sur le bouton Créer un utilisateur lorsqu'il est affiché. En passant à l'étape suivante, vous verrez que l'utilisateur a été créé. Maintenant, et seulement maintenant, aurez-vous accès aux identifiants de clé d'accès et de clé d'accès secret des utilisateurs Cette information est unique pour chaque utilisateur que vous créez.

Créer une fonction sans serveur

Nous allons d’abord utiliser l’installation d’une dépendance npm pour procéder à l’échafaudage d’un nouveau projet. Ouvrez votre terminal et installez ce qui suit.

Une fois installé, vous pouvez exécuter la structure sans serveur dans le terminal en exécutant la commande suivante:

Ou utilisez le raccourci sls pour serverless. Cette commande affichera toutes les commandes disponibles fournies avec la structure sans serveur.

Après avoir installé la dépendance sans serveur en tant que package global, vous êtes prêt à créer votre première fonction. Pour commencer, vous devez configurer vos informations d'identification d'utilisateur enregistré AWS. AWS vous fournit un lien pour télécharger les clés d'accès lors de la création d'un utilisateur.

Vous pouvez également visiter votre nom d'utilisateur et visiter les informations d'identification de sécurité comme ci-dessous.

Maintenant, laissez-nous configurer AWS avec le paquet sans serveur.

Si la commande ci-dessus s'exécute avec succès, vous recevrez un message de succès comme ci-dessous.

L'avantage de l'utilisation du package npm sans serveur est qu'il est fourni avec des modèles prédéfinis que vous pouvez créer dans votre projet à l'aide d'une commande et qu'il crée également une configuration de base nécessaire au déploiement de notre fonction Lambda. Pour commencer, je vais utiliser le modèle aws-nodejs dans un nouveau répertoire.

L'option -p créera un nouveau répertoire nommé aws-serverless-demo. L'indicateur -t utilise le passe-partout prédéfini. Le résultat de ceci créera trois nouveaux fichiers dans votre répertoire de projet.

  • .Gitignore habituel
  • handler.js où nous écrirons notre fonction handle
  • serverless.yml contient la configuration

Le fichier de gestionnaire par défaut ressemble à celui ci-dessous.

Dans le fichier ci-dessus, hello est la fonction qui a deux paramètres: event et context. module.exports est la syntaxe de base des nœuds ainsi que le reste du code. Vous pouvez voir clairement qu'il prend également en charge les fonctionnalités ES6. Un événement est un objet contenant toutes les données de demande nécessaires. L'objet de contexte contient des valeurs spécifiques à AWS. Nous en avons déjà discuté auparavant. Modifions cette fonction selon nos besoins et ajoutons un troisième paramètre appelé thecallback. Ouvrez le fichier handler.js et modifiez la fonction hello.

La fonction de rappel doit être invoquée avec une réponse d'erreur comme premier argument. Dans notre cas, elle est nulle à l'heure actuelle ou une réponse valide comme deuxième argument qui envoie actuellement un simple message Hello World. Nous pouvons maintenant déployer cette fonction de gestionnaire en utilisant la commande ci-dessous à partir de la fenêtre de votre terminal.

Il faudra quelques minutes pour terminer le processus. Notre fonction sans serveur est emballée dans un fichier .zip. Prenez note des informations de service ci-dessous. Il contient toutes les informations sur les noeuds finaux disponibles, sur notre fonction, sur son déploiement, etc.

Vous pouvez essayer l'attribut invoke comme suit pour exécuter la fonction et voir le résultat.

La sortie ressemblera à celle ci-dessous.

Regardez la configuration dans serverless.yml.

API REST avec pile sans serveur

Dans cette partie du didacticiel, je vais vous montrer comment connecter une base de données MongoDB en tant que service à une API REST Serverless. Nous allons avoir besoin de trois choses pour compléter notre pile technologique. Elles sont:

  • AWS Lambda
  • Node.js
  • MongoDB Atlas

Nous avons déjà les deux premiers, tout ce dont nous avons besoin est de configurer une base de données en nuage MongoDB appelée Atlas. MongoDB Atlas est une base de données en tant que service développé par l'équipe à l'origine de MongoDB. En plus de fournir un niveau gratuit / payant pour le stockage de vos données sur le cloud, MongoDB Atlas fournit de nombreuses analyses indispensables à la gestion et au suivi de votre application. MongoDB Atlas fournit un niveau gratuit que nous utiliserons avec notre pile sans serveur.

Création d'une base de données sur MongoDB Atlas

Nous allons commencer par créer une base de données sur l’atlas MongoDB. Connectez-vous au site et créez un compte si vous ne l'avez pas déjà. Nous avons juste besoin d'un environnement sandbox pour acquérir une expérience pratique, nous devons donc opter pour le niveau gratuit. Une fois votre compte configuré, ouvrez la page de votre compte et ajoutez une nouvelle organisation.

Maintenant, après avoir entré le nom, continuez et cliquez sur Créer une organisation.

Vous serez alors invité à l'écran principal où vous pouvez créer un nouveau projet. Tapez le nom de votre projet et continuez plus loin.

MongoDB Atlas est sécurisé par défaut. Vous devez définir des autorisations avant de tirer parti de son utilisation dans notre application. Vous pouvez nommer la base de données dans le champ indiqué ci-dessous.

Maintenant, nous pouvons ajouter notre sandbox gratuit à ce projet. Cela s'appelle un cluster.

Après tout cela, ajoutez simplement un utilisateur administrateur pour le cluster et donnez-lui un mot de passe très fort. Comme vous pouvez le constater, le prix de ce cluster sera de 0,00 $ pour toujours. Votre cluster prendra quelques minutes pour se déployer. Pendant ce temps, commençons enfin à écrire du code.

Construire l'API

Ensuite, nous installons toutes les dépendances nécessaires pour créer l’API.

Après cela, nous configurons serverless.yml et ajoutons les autres fonctions de gestionnaire que nous devons déployer.

Les opérations CRUD qui gèreront les fonctionnalités de l'API REST seront dans le fichier handler.js. Chaque événement contient les informations sur l'événement en cours qui sera appelé à partir du fichier handler.js. Dans le fichier de configuration ci-dessus, nous avons défini chaque opération CRUD avec un événement et son nom. Notez également que lorsque vous définissez les événements dans le fichier ci-dessus, nous associons une requête HTTP à un chemin qui sera le point de terminaison de l'opération CRUD dans l'API, la méthode HTTP et enfin l'option cors.

Je vais vous présenter une application de prise de notes simple via notre API REST. Ces opérations CRUD vont être au cœur de celle-ci. Puisque notre API va être hébergée à distance, nous devons activer le partage de ressources d'origine croisée. Pas besoin d'installer une autre dépendance à ce sujet. Le fichier de configuration sans serveur est pris en charge. Spécifiez simplement dans la section des événements comme cors: true. Par défaut, c'est faux.

Définir les fonctions du gestionnaire

Si vous connaissez Node.js et le framework Express, vous remarquerez que la création d'une fonction de contrôleur menant à la logique métier d'un itinéraire présente peu de différences. L'approche similaire que nous allons utiliser pour définir chaque fonction de gestionnaire.

Le contexte contient toutes les informations sur la fonction de gestionnaire. Combien de temps il a fonctionné, combien de mémoire il consomme entre autres choses. Dans ce qui précède, chaque fonction a la même valeur que context.callbackWaitsForEmptyEventLoop définie sur false et commence par l'appel de la fonction connectToDatabase. La valeur de la propriété d'objet context callbackWaitsForEmptyEventLoop est définie par défaut sur true. Cette propriété est utilisée pour modifier le comportement d'un rappel.

Par défaut, le rappel attendra que la boucle d'événements soit vide avant de geler le processus et de renvoyer les résultats à la fonction invoquée. En définissant la valeur de cette propriété sur false, il demande à AWS Lambda de geler le processus après l'appel du rappel, même s'il existe des événements dans la boucle d'événements. Vous pouvez en savoir plus sur cette propriété de contexte dans la documentation Lambda officielle.

Connecter MongoDB

Nous devons créer une connexion entre la base de données et nos fonctions sans serveur afin de pouvoir utiliser les opérations CRUD en temps réel. Créez un nouveau fichier appelé db.js à la racine et ajoutez-le avec ce qui suit.

Il s'agit d'une connexion Mongoose courante que vous auriez peut-être vue dans d'autres applications Nodejs si vous utilisez MongoDB comme base de données. La seule différence ici est que nous exportons connectToDatabase pour l'importer dans handler.js pour chaque opération CRUD. Modifiez le fichier handler.js et importez-le en haut.

La prochaine étape consiste à définir le modèle de données dont nous avons besoin pour que tout fonctionne correctement. Mongoose fournit également cette fonctionnalité. La pile sans serveur n’indique pas quel ODM ou ORM vous utilisez dans votre application. Créez un nouveau fichier nommé notes.model.js et ajoutez ce qui suit.

Maintenant, importez ce modèle dans handler.js pour nos rappels en haut du fichier.

Utilisation de variables Dotenv et Environment

La protection de nos clés et autres éléments essentiels constitue la première étape d’une application sécurisée. Créez un nouveau fichier appelé variables.env. Dans ce fichier, nous allons ajouter notre URL de connexion MONGODB que nous avons déjà utilisée dans db.js en tant que process.env.DB. La bonne chose à propos des variables d'environnement est qu'elles sont globales à la portée de l'application.

Pour connaître notre URL MongoDB, nous devons revenir à l’atlas mongodb, afin de sortir du cluster créé précédemment. Cliquez sur le bouton Connecter pour afficher une page vous permettant de choisir le mode d'accès à l'application. Cliquez sur Autoriser l'accès depuis n'importe où.

Copiez l'URL mongodb ci-dessus et collez-le dans le fichier variables.env.

Remplacez le champ utilisateur et mot de passe par vos informations d'identification. Maintenant, pour que cela fonctionne, il suffit d’ajouter la ligne suivante dans notre fichier handler.js.

Déploiement

Tout ce que vous avez à faire est d’exécuter la commande deploy à partir du terminal.

Puisque nous avons connecté notre fonction Lambda, cette commande nous incitera à utiliser des points de terminaison différents. Chaque fonction de gestionnaire est déployée en tant que noeud final REST distinct.

Vous pouvez tester votre API à l'aide de la commande CURL depuis le terminal, comme ci-dessous.

Vous pouvez trouver le code complet de cet article dans le référentiel Github ci-dessous.

Merci à William Wickey pour l'aide à l'édition.

Construire une application Web ou mobile?

Crowdbotics est le moyen le plus rapide de créer, lancer et mettre à l'échelle une application.

Développeur? Testez Crowdbotics App Builder pour échafauder et déployer rapidement des applications avec une variété d’instruments populaires.

Occupé ou non technique? Rejoignez des centaines d’équipes heureuses pour créer des logiciels avec des chefs de projet Crowdbotics et des développeurs experts. Portée de la chronologie et des coûts avec Crowdbotics Managed App Development gratuitement.