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 de la mise à l'échelle pour gérer les 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 activer la portabilité et les tests locaux.
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éer et tester une fonction Cloud HTTP en local
- Déboguer une fonction HTTP à partir de votre ordinateur local
- Déployer 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. Pour vérifier votre version, exécutez node –version)
- Avoir suivi le guide Ma première fonction : Node.js
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 sur les tarifs 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 (c'est-à-dire ses 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 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 (Function 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 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 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 la fonction 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 prêt à appeler la fonction validateTemperature lorsque le serveur reçoit une requête HTTP.
Vous devriez voir la sortie suivante dans votre fenêtre de 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 basculerez 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 basculer entre les fenêtres de terminal à l'aide du menu déroulant. Si une fenêtre de terminal diffuse actuellement une fonction, la liste déroulante la désigne par node. Sinon, elle est appelée 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 diffusant 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 diffusant votre fonction.
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, appuyez sur Cmd + Shift + P. Si vous utilisez Windows, appuyez sur 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, sélectionnez Only With Flag (Uniquement avec un indicateur), comme illustré dans l'image ci-dessous :

Rechargez maintenant 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 (Relancer le terminal).

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 automatiquement dans /node_modules/.bin pour utiliser le mode d'inspection.
Cette fois, une barre d'état orange doit s'afficher 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, indiquant 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 surbrillance jaune s'affiche sur la ligne 3. Cette 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 "step-over" (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 la spécification exige que toutes les requêtes envoient une lecture de température. Dans le cas peu probable où aucune lecture de température n'est fournie, la fonction doit générer une exception.
Cliquez sur le bouton "Disconnect" (Déconnecter) pour déconnecter le débogueur.

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, redémarrez 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 voir la sortie suivante renvoyée par votre requête :
Temperature is undefined
Dans votre 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 à partir de 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éevalidateTemperatureavec 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é, vous verrez ce qui suit dans la sortie :
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"}'
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 des frais involontaires (par exemple, si cette fonction Cloud est appelée plus de fois que votre allocation mensuelle 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. Cliquez ensuite sur "Supprimer".

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 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. Vous pouvez en savoir plus sur la façon dont Cloud Functions est compatible avec l'environnement d'exécution Node.js et sur le fonctionnement du débogage local avec Cloud Functions.
Points abordés
- Framework des 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éployer une fonction HTTP à partir de votre ordinateur local