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
- SDK Cloud
- Visual Studio Code
- Node.js 8.6.0 ou version ultérieure (pour installer Node.js, utilisez nvm, et pour vérifier votre version, exécutez node --version)
- Vous avez terminé l'atelier Ma première fonction: guide Node.js.
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.
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.
Pour cet atelier de programmation, choisissez Only With Flag
, comme illustré dans l'image ci-dessous :
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
.
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.
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.
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.
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.
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".
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.
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éevalidateTemperature
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".
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.