Développement local avec Cloud Functions pour Node.js à l'aide de Visual Studio Code

1. Présentation

Google Cloud Functions est une plate-forme de calcul sans serveur basée sur les événements. Cloud Functions vous permet d'écrire votre code sans vous soucier de provisionner des ressources ni de mettre à l'échelle pour répondre aux exigences changeantes.

Les fonctions Cloud Functions écrites en JavaScript s'exécutent dans un environnement Node.js sur Google Cloud Platform. Vous pouvez exécuter votre fonction Cloud dans n'importe quel environnement d'exécution Node.js standard pour faciliter la portabilité et les tests en local.

Tutoriel

Dans cet atelier de programmation, vous allez créer une fonction Cloud pour Node.js qui indique si une température spécifiée est acceptable ou trop élevée. Vous allez créer, tester et déboguer votre fonction Cloud à l'aide de Visual Studio Code sur votre ordinateur local. Enfin, vous allez déployer votre fonction sur Google Cloud Platform.

Points abordés

  • Framework de fonctions pour Node.js
  • Créer et tester une fonction Cloud HTTP en local
  • Déboguer une fonction HTTP à partir de votre ordinateur local
  • Déployez une fonction HTTP à partir de votre ordinateur local.

2. Préparation

Prérequis

Coûts

Bien que cet atelier de programmation ne nécessite qu'une seule invocation d'une fonction Cloud déployée, vous devez tout de même consulter les informations tarifaires de l'API Cloud Functions pour comprendre le fonctionnement de la facturation.

Bien que de nombreuses API Google puissent être utilisées gratuitement, l'utilisation de Google Cloud Platform (produits et API) est payante. Vous devez disposer d'un compte de facturation actif pour utiliser Cloud Functions. N'oubliez pas que certains produits Google Cloud Platform (GCP) disposent d'un niveau "Always Free" que vous devez dépasser pour que la facturation démarre. Pour les besoins de cet atelier de programmation, chaque appel de Cloud Functions est comptabilisé dans cette version sans frais. Tant que votre utilisation agrégée ne dépasse pas les limites (pour chaque mois), aucuns frais ne vous seront facturés.

3. Installer le framework des fonctions pour Node.js

Le framework des fonctions pour Node.js est un framework FaaS (Functions as a Service) Open Source permettant d'écrire des fonctions Node.js portables. Il est proposé par l'équipe Google Cloud Functions.

Le framework des fonctions vous permet d'écrire des fonctions légères qui s'exécutent dans de nombreux environnements, dont les suivants :

  • Google Cloud Functions
  • Votre ordinateur de développement local
  • Cloud Run et Cloud Run sur GKE
  • Environnements basés sur Knative

Créer une application Node.js

npm init

Lorsque vous acceptez les valeurs par défaut, veillez à utiliser index.js comme point d'entrée de votre application.

Installez ensuite le framework des fonctions pour Node.js.

npm install @google-cloud/functions-framework

Ouvrez votre fichier package.json. Vérifiez que le framework des fonctions est répertorié en tant que dépendance, comme illustré dans l'exemple ci-dessous.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Le framework des fonctions a bien été installé. Vous êtes maintenant prêt à créer votre fonction Cloud.

4. Créer et tester une fonction Cloud HTTP en local

Créer une fonction Cloud locale

Dans cette section, vous allez créer et tester une fonction HTTP qui répond aux requêtes HTTP.

Créez un fichier nommé index.js dans le même répertoire que le fichier package.json.

Ajoutez les éléments suivants :

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

Vous êtes maintenant prêt à tester la fonction.

Tester une fonction dans Visual Studio Code

À partir de maintenant, cet atelier de programmation utilise le terminal intégré de Visual Studio Code.

Dans Visual Studio Code, ouvrez une fenêtre de terminal.

Exécutez la commande suivante :

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Cette commande démarre un serveur local prêt à appeler la fonction validateTemperature lorsqu'il reçoit une requête HTTP.

Le résultat suivant doit s'afficher dans la fenêtre de votre terminal:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

Créez une deuxième fenêtre de terminal dans VS Code en cliquant sur l'icône Plus New Terminal dans le volet de la fenêtre de terminal. Vous allez basculer entre ces deux fenêtres de terminal : la première pour diffuser la fonction et la seconde pour l'appeler à l'aide de curl.

bceb65f366d837ae.png

Vous pouvez passer d'une fenêtre de terminal à l'autre à l'aide du menu déroulant. Si une fenêtre de terminal diffuse actuellement une fonction, elle est appelée node dans la liste déroulante. Sinon, il est fait référence à zsh (ou au shell que vous utilisez).

Dans la deuxième fenêtre de terminal, exécutez la commande suivante pour envoyer une charge utile de température de 50 au serveur local qui diffuse la fonction validateTemperature.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

La fonction Cloud doit vous fournir la réponse suivante:

Temperature OK

Dans la deuxième fenêtre de terminal, testez à nouveau la fonction en envoyant une charge utile de température "trop élevée", comme indiqué ci-dessous:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

Vous devriez recevoir la réponse suivante de la fonction cloud :

Too hot

Enfin, testez la fonction en l'appelant avec une charge utile manquante.

curl -X POST http://localhost:8080

Vous devriez recevoir la réponse suivante de la fonction cloud :

Too hot

Idéalement, la fonction ne doit pas renvoyer "trop chaud" si aucune température n'est fournie. Vous avez découvert un bug dans le code.

Assurez-vous d'arrêter l'exécution de votre fonction en appuyant sur Ctrl + C dans la première fenêtre de terminal qui la diffuse.

5. Déboguer une fonction HTTP depuis votre ordinateur local

Ouvrez la palette de commandes dans Visual Studio Code. Si vous utilisez un Mac, utilisez Cmd + Shift + P. Si vous utilisez Windows, utilisez Ctrl + Shift + P..

Saisissez auto attach dans la palette de commandes et sélectionnez l'élément situé en haut de la liste.

601e542b4ec9f6f9.png

Pour cet atelier de programmation, choisissez Only With Flag, comme illustré dans l'image ci-dessous :

b9e6b762d150e62b.png

Rechargez maintenant la fenêtre de terminal que vous avez utilisée dans VS Code pour exécuter votre fonction en pointant sur l'icône d'avertissement qui s'affiche tout à droite.

Cliquez sur Relaunch Terminal.

37b61e3fb546fc76.png

Dans la fenêtre de terminal actualisée, exécutez à nouveau le framework des fonctions pour diffuser votre fonction à l'aide de la commande suivante :

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

où l'option --inspect indique à Node.js d'écouter un client de débogage. Pour en savoir plus, consultez la documentation Node sur le débogage.

Notez que vous utilisez node_modules/.bin/functions-framework au lieu de node_modules/@google-cloud/functions-framework. Pour utiliser le mode d'inspection, vous devez utiliser l'exécutable associé à un lien symbolique automatiquement dans /node_modules/.bin.

Cette fois, vous devriez voir une barre d'état orange dans VS Code indiquant que le débogueur est associé.

Définissez un point d'arrêt à la ligne 3 en cliquant dans la marge à gauche du numéro de ligne.

2fbb4d5916e1dbfa.png

L'icône de point d'arrêt doit s'allumer en rouge vif, ce qui indique que cette ligne de code est accessible par le débogueur.

846e6c5993cc87f9.png

Dans la deuxième fenêtre de terminal, atteignez le point d'arrêt en exécutant la commande curl suivante.

curl -X POST http://localhost:8080 

Une mise en surbrillance jaune apparaît sur la ligne 3. Cette mise en surbrillance indique que cette ligne est l'instruction en cours d'évaluation par le débogueur.

206c7ed1eb189e90.png

Pointez sur la variable temp pour vérifier que son contenu est undefined, car la requête n'a pas fourni de charge utile de température.

97979025f4bf2842.png

Cliquez sur l'icône de pas à pas pour exécuter l'instruction suivante.

L'instruction actuelle saute alors vers la partie "else" de l'instruction "if".

cf0e8ce7e0388f98.png

Pour cette démonstration, vous pouvez supposer que les spécifications exigent que toutes les requêtes envoient une lecture de température. Dans le cas peu probable où une lecture de température n'est pas fournie, la fonction doit générer une exception.

Cliquez sur le bouton "Déconnecter" pour déconnecter le débogueur.

1070d059775ad769.png

Dans votre première fenêtre de terminal, appuyez sur Ctrl + C pour interrompre l'exécution de votre fonction.

Modifiez votre fonction pour ajouter une instruction "si" afin de générer une exception si la température n'est pas définie, comme illustré ci-dessous :

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

Dans la première fenêtre de terminal, exécutez à nouveau votre fonction Cloud en exécutant la commande suivante sans l'option –inspect pour éviter d'associer le débogueur.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Vérifiez qu'une exception est générée en exécutant la commande suivante dans votre deuxième fenêtre de terminal :

curl -X POST http://localhost:8080 

Votre requête doit renvoyer le résultat suivant:

Temperature is undefined

Dans la première fenêtre de terminal, vous verrez également l'erreur enregistrée par votre fonction.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

Vous pouvez maintenant arrêter l'exécution de votre fonction en appuyant sur Ctrl+C dans la première fenêtre de terminal.

6. Déployer une fonction HTTP depuis votre ordinateur local vers Google Cloud

Maintenant que vous avez créé, testé et débogué une fonction Cloud sur votre ordinateur local, vous êtes prêt à la déployer sur Google Cloud.

Vérifiez que vous utilisez le projet que vous avez créé à l'étape 2 en local en exécutant la commande suivante :

gcloud config get-value project

Si le projet que vous avez spécifié à l'étape 2 n'est pas la configuration active, exécutez la commande suivante :

gcloud config set project <project-name-created-step-2>

Dans n'importe quelle fenêtre de terminal, exécutez la commande suivante:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

où les paramètres sont expliqués comme suit:

  • deploy validateTemperature : sous-commande gcloud permettant de déployer une fonction Cloud nommée validateTemperature avec un point d'entrée nommé validateTemperature
  • --trigger-http : type d'événement déclencheur
  • --runtime nodejs12 : environnement d'exécution ciblé pour cette fonction
  • --allow-unauthenticated : permet à l'accès public d'appeler la fonction

Vous êtes invité à activer les API Cloud Functions. Saisissez y pour activer les API.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

Une fois le déploiement terminé, le résultat suivant s'affiche :

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

Dans votre fenêtre de terminal, utilisez curl pour appeler ce point de terminaison public.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

et confirmer que votre fonction Cloud a bien été déployée en vérifiant la réponse appropriée.

Temperature OK

7. Effectuer un nettoyage

Pour éviter que des frais ne vous soient facturés par inadvertance (par exemple, si cette fonction Cloud est appelée par inadvertance plus de fois que votre quota mensuel d'appels de fonctions Cloud dans le niveau gratuit), vous pouvez supprimer la fonction Cloud ou le projet que vous avez créé à l'étape 2.

Pour supprimer la fonction Cloud, accédez à la console Cloud Functions à l'adresse https://console.cloud.google.com/functions/. Assurez-vous que le projet que vous avez créé à l'étape 2 est le projet actuellement sélectionné.

Sélectionnez la fonction validateTemperature que vous avez déployée à l'étape 6. Appuyez ensuite sur "Supprimer".

4dada486485a935a.png

Si vous choisissez de supprimer l'ensemble du projet, accédez à https://console.cloud.google.com/cloud-resource-manager, sélectionnez le projet que vous avez créé à l'étape 2, puis choisissez "Supprimer". Si vous supprimez le projet, vous devrez le modifier dans Cloud SDK. Vous pouvez afficher la liste de tous les projets disponibles en exécutant la commande gcloud projects list.

8. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation. Découvrez comment Cloud Functions est compatible avec l'environnement d'exécution Node.js et comment le débogage local fonctionne avec Cloud Functions.

Points abordés

  • Framework de fonctions pour Node.js
  • Créer et tester une fonction Cloud HTTP en local
  • Déboguer une fonction HTTP à partir de votre ordinateur local
  • Déployez une fonction HTTP à partir de votre ordinateur local.