Ce tutoriel explique comment utiliser Cloud Scheduler et Cloud Functions pour démarrer et arrêter automatiquement des instances Compute Engine selon un calendrier régulier, à l'aide d'étiquettes de ressources.
Objectifs
- Apprendre à utiliser Cloud Functions pour écrire et déployer un ensemble de fonctions permettant de démarrer et d'arrêter des instances Compute Engine.
- À l'aide de Cloud Scheduler, créez un ensemble de tâches qui programment les instances avec un libellé de ressource
dev
, de sorte qu'elles s'exécutent du lundi au vendredi de 9h00 à 17h00 en concordance avec les horaires de bureau habituels.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
- Cloud Scheduler
- Cloud Functions
- Pub/Sub
- Compute Engine
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Avant de commencer
- Configurez votre environnement pour Cloud Scheduler.
-
Activer les API Cloud Functions, Pub/Sub, and Compute Engine.
Architecture de l'application
Cette solution comprend les composants Google Cloud suivants :
- instance Compute Engine que nous souhaitons exécuter selon un calendrier.
- Cloud Functions pour démarrer et arrêter l'instance que nous souhaitons planifier.
- Les messages Pub/Sub envoyés et reçus pour chaque événement de démarrage et d'arrêt.
- Les tâches Cloud Scheduler, pour passer des appels selon un calendrier défini afin de démarrer et d'arrêter l'instance.
Exigences relatives aux lieux
Certains composants ne sont compatibles qu'avec certaines régions :
- Instance Compute Engine: compatible avec toutes les régions listées dans Régions et zones.
- Cloud Functions: fonctionnalité disponible dans les régions répertoriées dans la section Emplacements
- Messages Pub/Sub: pris en charge dans le monde entier, car Pub/Sub est un service mondial.
- Jobs Cloud Scheduler avec des cibles Pub/Sub : compatibilité avec n'importe quel emplacement Google Cloud
Pourquoi pas HTTP au lieu de Pub/Sub ?
Pour simplifier cette architecture, vous pourriez utiliser les déclencheurs HTTP de Cloud Functions au lieu des déclencheurs Pub/Sub.
Ce tutoriel utilise Pub/Sub comme déclencheur Cloud Functions, car cette méthode était auparavant plus sécurisée que HTTP. Cependant, HTTP est également un choix valide et peut désormais être sécurisé en exigeant une authentification.
Pour en savoir plus sur la sécurisation de Cloud Functions, consultez la présentation sur la sécurité de Cloud Functions. Pour une comparaison entre les déclencheurs HTTP et Pub/Sub, consultez la documentation sur les déclencheurs Cloud Functions.
Configurer l'instance Compute Engine
Console
- Accédez à la page Instances de VM de la console Google Cloud.
Accéder à la page "Instances de VM" - Cliquez sur Créer une instance.
- Définissez le paramètre Nom sur
dev-instance
. - Sous Libellés, cliquez sur Ajouter des libellés.
- Cliquez sur Ajouter une étiquette.
- Saisissez
env
pour Key (Clé) etdev
pour Value (Valeur). - Pour le paramètre Région, sélectionnez us-west1.
- Pour le paramètre Zone, sélectionnez us-west1-b.
- Cliquez sur Enregistrer.
- Cliquez sur Créer en bas de la page.
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Déployer des fonctions déclenchées par Pub/Sub via Cloud Functions
Créer et déployer les fonctions
Console
Créez la fonction de démarrage.
- Accédez à la page de présentation de Cloud Functions dans la console Google Cloud.
Accéder à la page Cloud Functions - Cliquez sur Créer une fonction.
- Dans la section Environnement, sélectionnez 1re génération.
- Définissez le paramètre Nom de la fonction sur
startInstancePubSub
. - Conservez la valeur par défaut du paramètre Région.
- Dans le champ Type de déclencheur, sélectionnez Cloud Pub/Sub.
- Dans le champ Select a Cloud Pub/Sub topic (Sélectionner un sujet Cloud Pub/Sub), cliquez sur Create a topic (Créer un sujet).
- Une boîte de dialogue Créer un sujet doit s'afficher.
- Sous ID du sujet, saisissez
start-instance-event
. - Cliquez sur Créer pour fermer la boîte de dialogue.
- Sous ID du sujet, saisissez
- Cliquez sur Enregistrer au bas de la zone Déclencheur.
- Cliquez sur Suivant au bas de la page.
- Pour le champ Environnement d'exécution, sélectionnez Node.js 16 ou version ultérieure.
- Dans le champ Point d'entrée, saisissez
startInstancePubSub
. - À gauche de l'éditeur de code, sélectionnez index.js.
Remplacez le code de démarrage par le code suivant :
À gauche de l'éditeur de code, sélectionnez le fichier package.json.
Remplacez le code de démarrage par le code suivant :
Cliquez sur Déployer au bas de la page.
Créez la fonction d'arrêt.
- Vous devriez vous trouver sur la page Cloud Functions de la console Google Cloud.
- Cliquez sur Créer une fonction.
- Dans la section Environnement, sélectionnez 1re génération.
- Définissez le paramètre Nom de la fonction sur
stopInstancePubSub
. - Conservez la valeur par défaut du paramètre Région.
- Dans le champ Type de déclencheur, sélectionnez Cloud Pub/Sub.
- Dans le champ Select a Cloud Pub/Sub topic (Sélectionner un sujet Cloud Pub/Sub), cliquez sur Create a topic (Créer un sujet).
- Une boîte de dialogue Créer un sujet doit s'afficher.
- Sous ID du sujet, saisissez
stop-instance-event
. - Cliquez sur Créer pour fermer la boîte de dialogue.
- Sous ID du sujet, saisissez
- Cliquez sur Enregistrer au bas de la zone Déclencheur.
- Cliquez sur Suivant au bas de la page.
- Pour le champ Environnement d'exécution, sélectionnez Node.js 16 ou version ultérieure.
- Dans le champ Point d'entrée, saisissez
stopInstancePubSub
. - À gauche de l'éditeur de code, sélectionnez index.js.
Remplacez le code de démarrage par le code suivant :
À gauche de l'éditeur de code, sélectionnez le fichier package.json.
Remplacez le code de démarrage par le code suivant :
Cliquez sur Déployer au bas de la page.
gcloud
Créez les sujets Pub/Sub.
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
Obtenir le code
Téléchargez le code.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Accédez au répertoire approprié.
cd nodejs-docs-samples/functions/scheduleinstance/
Créez les fonctions de démarrage et d'arrêt.
Vous devez vous trouver dans le répertoire nodejs-docs-samples/functions/scheduleinstance/
.
gcloud functions deploy startInstancePubSub \ --trigger-topic start-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
gcloud functions deploy stopInstancePubSub \ --trigger-topic stop-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
Vérifier que les fonctions sont opérationnelles (facultatif)
Console
Arrêter l'instance
- Accédez à la page de présentation de Cloud Functions dans la console Google Cloud.
Accéder à la page Cloud Functions - Cliquez sur la fonction nommée
stopInstancePubSub
. - Plusieurs onglets doivent s'afficher : Général, Déclencheur, Source, Autorisations et Test. Cliquez sur l'onglet Test.
Pour le paramètre Événement déclencheur, saisissez les informations suivantes :
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
Il s'agit simplement de la chaîne encodée en base64 pour
{"zone":"us-west1-b", "label":"env=dev"}
.Si vous souhaitez encoder votre propre chaîne, vous pouvez utiliser n'importe quel outil d'encodage base64 en ligne.
Cliquez sur le bouton Tester la fonction.
Une fois l'exécution terminée,
Successfully stopped instance dev-instance
devrait s'afficher sous Sortie. L'arrêt total de l'instance peut prendre jusqu'à 60 secondes.Si au lieu de cela
error: 'Error: function failed to load.'
s'affiche, attendez 10 secondes environ pour que la fonction termine le déploiement, puis réessayez.Si au lieu de cela
error: 'Error: function execution attempt timed out.'
s'affiche, passez simplement à l'étape suivante pour déterminer si l'instance prend simplement un certain temps à s'arrêter.Si la fonction s'exécute correctement et que rien ne s'affiche, cela peut indiquer que le délai d'exécution a été dépassé. Passez à l'étape suivante pour vérifier si cela vient du fait que l'instance met beaucoup de temps à s'arrêter.
Accédez à la page Instances de VM de la console Google Cloud.
Accéder à la page "Instances de VM"Vérifiez qu'un carré gris est présent à côté du nom de l'instance nommée
dev-instance
. Ce carré indique que l'instance s'est arrêtée. L'arrêt total de l'instance peut prendre jusqu'à 30 secondes.- Si l'instance ne semble pas s'arrêter, essayez de cliquer sur Actualiser en haut de la page.
Démarrer l'instance
- Accédez à la page de présentation de Cloud Functions dans la console Google Cloud.
Accéder à la page Cloud Functions - Cliquez sur la fonction nommée
startInstancePubSub
. - Plusieurs onglets doivent s'afficher : Général, Déclencheur, Source, Autorisations et Test. Cliquez sur l'onglet Test.
Pour le paramètre Événement déclencheur, saisissez les informations suivantes :
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- Encore une fois, il s'agit simplement de la chaîne encodée en base64 pour
{"zone":"us-west1-b", "label":"env=dev"}
.
- Encore une fois, il s'agit simplement de la chaîne encodée en base64 pour
Cliquez sur le bouton Tester la fonction.
Une fois l'exécution terminée,
Successfully started instance dev-instance
devrait s'afficher sous Sortie.Accédez à la page Instances de VM de la console Google Cloud.
Accéder à la page "Instances de VM"Vérifiez qu'une coche verte est présente à côté du nom de l'instance nommée
dev-instance
. Cette coche indique que l'instance s'est arrêtée. Le démarrage effectif de l'instance peut prendre jusqu'à 30 secondes.
gcloud
Pour arrêter l'instance, procédez comme suit :
Appelez la fonction permettant d'arrêter l'instance.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
Il s'agit simplement de la chaîne encodée en base64 pour
{"zone":"us-west1-b", "label":"env=dev"}
.Si vous voulez encoder votre propre chaîne, vous pouvez utiliser n'importe quel outil d'encodage base64. Voici un exemple d'utilisation avec l'outil de ligne de commande
base64
:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
Lorsque la fonction a terminé, le résultat suivant doit s'afficher :
result: Successfully stopped instance dev-instance
L'arrêt total de l'instance peut prendre jusqu'à 60 secondes.
Si au lieu de ce résultat, l'erreur suivante s'affiche :
error: 'Error: function failed to load.`
Patientez environ 10 secondes pour que le déploiement de la fonction s'achève, puis réessayez.
Si au lieu de ce résultat, l'erreur suivante s'affiche :
error: `Error: function execution attempt timed out.`
Passez à l'étape suivante pour vérifier si cela vient du fait que l'instance met beaucoup de temps à s'arrêter.
Si vous n'obtenez aucun résultat, cela peut indiquer que le délai d'exécution de la fonction a été dépassé. Passez à l'étape suivante pour vérifier si cela vient du fait que l'instance met beaucoup de temps à s'arrêter.
Vérifiez que l'instance est à l'état
TERMINATED
. L'arrêt total peut prendre jusqu'à 30 secondes.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Démarrer l'instance
Appelez la fonction permettant de démarrer l'instance.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- Encore une fois, il s'agit simplement de la chaîne encodée en base64 pour
{"zone":"us-west1-b", "label":"env=dev"}
.
Lorsque la fonction a terminé, le résultat suivant doit s'afficher :
result: Successfully started instance dev-instance
- Encore une fois, il s'agit simplement de la chaîne encodée en base64 pour
Vérifiez que l'instance est à l'état
RUNNING
. Le démarrage effectif de l'instance peut prendre jusqu'à 30 secondes.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Configurer les tâches Cloud Scheduler pour qu'elles appellent Pub/Sub
Créer les tâches
Console
Créez la tâche de démarrage.
- Accédez à la page Cloud Scheduler dans la console Google Cloud.
Accéder à la page Cloud Scheduler - Cliquez sur Create a job (Créer une tâche).
- Conservez la région par défaut.
- Définissez le paramètre Nom sur
startup-dev-instances
. - Pour le paramètre Fréquence, saisissez
0 9 * * 1-5
.- Cette opération est effectuée tous les jours à 9h du lundi au vendredi.
- Pour le paramètre Fuseau horaire, sélectionnez le pays et le fuseau horaire souhaités. Cet exemple utilisera
United States
etLos Angeles
. - Cliquez sur Continuer.
- Pour Type de cible, sélectionnez
Pub/Sub
. - Sélectionnez
start-instance-event
dans le menu déroulant des thèmes. - Dans le champ Message, saisissez ce qui suit:
{"zone":"us-west1-b","label":"env=dev"}
- Cliquez sur Créer.
Créez la tâche d'arrêt.
- Vous devriez vous trouver sur la page Cloud Scheduler de la console Google Cloud.
- Cliquez sur Créer une tâche.
- Conservez la région par défaut, puis cliquez sur Suivant au bas de la page.
- Définissez le paramètre Nom sur
shutdown-dev-instances
. - Pour le paramètre Fréquence, saisissez
0 17 * * 1-5
.- Cette opération est effectuée tous les jours à 17h du lundi au vendredi.
- Pour le paramètre Fuseau horaire, sélectionnez le pays et le fuseau horaire souhaités. Cet exemple utilisera
United States
etLos Angeles
. - Cliquez sur Continuer.
- Pour Type de cible, sélectionnez
Pub/Sub
. - Sélectionnez
stop-instance-event
dans le menu déroulant des thèmes. - Dans le champ Message, saisissez ce qui suit:
{"zone":"us-west1-b","label":"env=dev"}
- Cliquez sur Créer.
gcloud
Créez la tâche de démarrage.
gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
Créez la tâche d'arrêt.
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
Vérifier que les tâches sont opérationnelles (facultatif)
Console
Arrêter l'instance
- Accédez à la page Cloud Scheduler dans la console Google Cloud.
Accéder à la page Cloud Scheduler - Pour la tâche nommée
shutdown-dev-instances
, cliquez sur le bouton Exécuter maintenant situé à l'extrémité droite de la page. - Accédez à la page Instances de VM de la console Google Cloud.
Accéder à la page "Instances de VM" - Vérifiez qu'un carré gris est présent à côté du nom de l'instance nommée
dev-instance
. Ce carré indique que l'instance s'est arrêtée. L'arrêt total de l'instance peut prendre jusqu'à 30 secondes.
Démarrer l'instance
- Accédez à la page Cloud Scheduler dans la console Google Cloud.
Accéder à la page Cloud Scheduler - Pour la tâche nommée
startup-dev-instances
, cliquez sur le bouton Exécuter maintenant situé à l'extrémité droite de la page. - Accédez à la page Instances de VM de la console Google Cloud.
Accéder à la page "Instances de VM" - Vérifiez qu'une coche verte est présente à côté du nom de l'instance nommée
dev-instance
. Cette coche indique que l'instance s'est arrêtée. Le démarrage effectif de l'instance peut prendre jusqu'à 30 secondes.
gcloud
Pour arrêter l'instance, procédez comme suit :
Exécutez la tâche Scheduler permettant d'arrêter l'instance.
gcloud beta scheduler jobs run shutdown-dev-instances
Vérifiez que l'instance est à l'état
TERMINATED
. L'arrêt total de l'instance peut prendre jusqu'à 30 secondes.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Démarrer l'instance
Exécutez la tâche Scheduler permettant de démarrer l'instance.
gcloud beta scheduler jobs run startup-dev-instances
Vérifiez que l'instance est à l'état
RUNNING
. Le démarrage effectif de l'instance peut prendre jusqu'à 30 secondes.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Effectuer un nettoyage
Une fois le tutoriel terminé, vous pouvez procéder au nettoyage des ressources que vous avez créées afin qu'elles ne soient plus comptabilisées dans votre quota et qu'elles ne vous soient plus facturées. Dans les sections suivantes, nous allons voir comment supprimer ou désactiver ces ressources.
Supprimer les tâches Cloud Scheduler
Accédez à la page Cloud Scheduler dans la console Google Cloud.
Cochez les cases situées en regard de vos tâches.
Cliquez sur le bouton Supprimer en haut de la page et confirmez la suppression.
Supprimer les sujets Pub/Sub
Accédez à la page Pub/Sub dans la console Google Cloud.
Cochez les cases situées en regard de vos sujets.
Cliquez sur le bouton Supprimer en haut de la page et confirmez la suppression.
Supprimer les fonctions déployées via Cloud Functions
Accédez à la page de présentation de Cloud Functions dans la console Google Cloud.
Cochez les cases situées en regard de vos fonctions.
Cliquez sur le bouton Supprimer en haut de la page et confirmez la suppression.
Supprimer l'instance Compute Engine
Pour supprimer une instance Compute Engine, procédez comme suit :
- Dans la console Google Cloud, accédez à la page Instances de VM.
- Cochez la case correspondant à instance que vous souhaitez supprimer.
- Pour supprimer l'instance, cliquez sur Autres actions , cliquez sur Supprimer, puis suivez les instructions.
Supprimer le projet
Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.
Pour supprimer le projet :
- Dans la console Google Cloud, accédez à la page Gérer les ressources.
- Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
- Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
Étapes suivantes
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.