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 é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 des fonctions pour Node.js
- Créez et testez une fonction Cloud HTTP localement.
- 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)
- Avoir terminé le guide "Ma première fonction: 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 sans frais, l'utilisation de Google Cloud Platform (produits et API) est payante. Vous avez 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 "Always Free" que vous devez dépasser pour que la facturation démarre. Pour les besoins de l'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éez 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 listé 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 localement
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.
Tester une fonction dans Visual Studio Code
À partir de ce point, 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.
Vous devriez voir la sortie suivante dans la fenêtre du 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 exécute actuellement une fonction, la liste déroulante la désigne par node
. 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 °C au serveur local qui héberge 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.
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, puis sélectionnez le premier élément 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'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. Pour utiliser le mode d'inspection, vous devez utiliser l'exécutable associé à un lien symbolique automatiquement dans /node_modules/.bin.
Cette fois, une barre d'état orange doit s'afficher dans VS Code pour indiquer 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 du point d'arrêt doit s'allumer en rouge vif, ce qui indique que le débogueur peut accéder à cette ligne de code.
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 passe à 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 "Se déconnecter" pour déconnecter le débogueur.
Dans la première fenêtre de terminal, arrêtez l'exécution de votre fonction en appuyant sur Ctrl + C
.
Modifiez votre fonction pour ajouter une instruction "if" 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, relancez l'exécution de 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
Vous devriez obtenir la sortie suivante:
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 ne correspond pas à la configuration active, exécutez la commande suivante:
gcloud config set project <project-name-created-step-2>
Dans une 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 avec le nomvalidateTemperature
et 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 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"}'
Vérifiez 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 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 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 modifier les projets dans votre 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. 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 des fonctions pour Node.js
- Créez et testez une fonction Cloud HTTP localement.
- Déboguer une fonction HTTP à partir de votre ordinateur local
- Déployez une fonction HTTP à partir de votre ordinateur local.