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 des événements. Cloud Functions vous permet d'écrire votre code sans vous soucier du provisionnement des ressources ni du scaling pour répondre aux exigences changeantes.

Les fonctions Cloud é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 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 Functions pour Node.js.
  • Créez et testez une fonction Cloud HTTP en local.
  • Déboguez 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'un seul appel d'une fonction Cloud déployée, vous devez tout de même consulter les informations tarifaires de l'API Cloud Functions pour comprendre comment fonctionne la facturation.

Bien que de nombreuses API Google puissent être utilisées sans frais, l'utilisation de Google Cloud Platform (c'est-à-dire ses produits et API) est payante. Vous aurez besoin d'un compte de facturation actif pour utiliser Cloud Functions. N'oubliez pas que certains produits Google Cloud Platform (GCP) disposent d'un niveau "Toujours sans frais" que vous devez dépasser pour que la facturation démarre. Pour les besoins de l'atelier de programmation, chaque appel 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 (Function as a Service) Open Source permettant d'écrire des fonctions Node.js portables. Il vous est fourni 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éez une application Node.js.

npm init

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

Installez maintenant 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 listé comme dépendance, comme indiqué 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 votre 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.

Fonction de test dans Visual Studio Code

À partir de ce point, cet atelier de programmation utilise le terminal intégré dans 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 qui est prêt à appeler la fonction validateTemperature lorsque le serveur 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 appeler la fonction à 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 exécute actuellement une fonction, la liste déroulante la désigne par node. Sinon, il est appelé zsh (ou le 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"}'

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

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.

Veillez à 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 à partir de 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 le premier élément de la liste.

601e542b4ec9f6f9.png

Pour cet atelier de programmation, sélectionnez Only With Flag, comme indiqué dans l'image ci-dessous :

b9e6b762d150e62b.png

Maintenant, rechargez la fenêtre de terminal que vous avez utilisée dans VS Code pour diffuser votre fonction en pointant sur l'icône d'avertissement qui s'affiche à l'extrême droite.

Cliquez sur Relaunch Terminal.

37b61e3fb546fc76.png

Dans la fenêtre de terminal rechargée, réexécutez 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'indicateur --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. Vous devez utiliser l'exécutable lié symboliquement automatiquement dans /node_modules/.bin pour utiliser le mode d'inspection.

Cette fois, une barre d'état orange devrait s'afficher dans VS Code pour indiquer que le débogueur est associé.

Définissez un point d'arrêt sur 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, indiquant que cette ligne de code est accessible par le débogueur.

846e6c5993cc87f9.png

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

curl -X POST http://localhost:8080 

Une mise en surbrillance jaune s'affiche sur la ligne 3. Cette mise en surbrillance indique que cette ligne correspond à 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 "Pas à pas" pour exécuter l'instruction suivante.

L'instruction actuelle passe à la partie "else" de l'instruction "if".

cf0e8ce7e0388f98.png

Pour cette démo, vous pouvez supposer que la spécification exige que toutes les requêtes envoient une lecture de température. Dans le cas peu probable où une température ne serait 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, arrêtez l'exécution de votre fonction en appuyant sur Ctrl + C.

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

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

 try {

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

 ...

Dans votre première fenêtre de terminal, recommencez à exécuter votre fonction cloud en exécutant la commande suivante sans l'indicateur –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 

La réponse à votre requête devrait se présenter comme suit :

Temperature is undefined

Dans la première fenêtre de terminal, vous verrez également l'erreur consigné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 votre 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 Functions 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 exécutant la commande suivante en local :

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 cible pour cette fonction
  • --allow-unauthenticated : autorise l'accès public à l'appel de la fonction

Vous serez 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 la fenêtre de votre 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 vérifiez que votre fonction Cloud a bien été déployée en examinant la réponse appropriée.

Temperature OK

7. Effectuer un nettoyage

Pour éviter des frais involontaires (par exemple, si cette fonction Cloud est invoquée par inadvertance plus de fois que votre quota mensuel d'invocations de fonctions Cloud dans le niveau sans frais), 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 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, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir "Supprimer". Si vous supprimez le projet, vous devrez le modifier dans le SDK Cloud. 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. Pour en savoir plus sur la compatibilité de Cloud Functions avec l'environnement d'exécution Node.js et sur le débogage local avec Cloud Functions, consultez les pages correspondantes.

Points abordés

  • Framework Functions pour Node.js.
  • Créez et testez une fonction Cloud HTTP en local.
  • Déboguez une fonction HTTP à partir de votre ordinateur local.
  • Déployez une fonction HTTP à partir de votre ordinateur local.