Ce tutoriel explique comment utiliser Cloud Scheduler et les fonctions Cloud Run pour démarrer et arrêter automatiquement des instances Compute Engine selon un calendrier régulier, à l'aide d'étiquettes de ressources.
Objectifs
- Écrire et déployer un ensemble de fonctions avec des fonctions Cloud Run qui démarrent et arrêtent 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 Run 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.
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
Architecture de l'application
Cette solution comprend les composants Google Cloud suivants :
- Instance Compute Engine que nous souhaitons exécuter selon un calendrier spécifique.
- Fonctions Cloud Run pour démarrer et arrêter l'instance pour laquelle nous souhaitons définir un calendrier d'exécution.
- Messages Pub/Sub envoyés et reçus pour chaque événement de démarrage ou d'arrêt.
- Tâches Cloud Scheduler permettant d'appeler les fonctions de démarrage et d'arrêt de l'instance en fonction du calendrier défini.
Exigences relatives aux emplacements
Certains composants ne sont compatibles qu'avec certaines régions :
- Instance Compute Engine: compatible avec toutes les régions listées dans la section Régions et zones.
- Fonctions Cloud Run: compatibles avec les régions listées dans la section Emplacements.
- Messages Pub/Sub: compatibilité mondiale, car Pub/Sub est un service mondial
- Tâches 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 pouvez utiliser les déclencheurs HTTP des fonctions Cloud Run au lieu des déclencheurs Pub/Sub.
Ce tutoriel utilise Pub/Sub comme déclencheur de fonctions Cloud Run, car cette méthode était auparavant plus sécurisée que l'utilisation de HTTP. Toutefois, HTTP est également un choix valide et peut désormais être sécurisé en exigeant une authentification.
Pour découvrir comment sécuriser les fonctions Cloud Run, consultez la présentation de la sécurité des fonctions Cloud Run. Pour comparer les déclencheurs HTTP et Pub/Sub, consultez la documentation sur les déclencheurs Cloud Run 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 le champ Clé etdev
pour 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 des fonctions Cloud Run
Créer et déployer les fonctions
Console
Créez la fonction de démarrage.
- Accédez à la page Fonctions Cloud Run dans la console Google Cloud.
Accéder à la page "Cloud Run 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.
- Pour Type de déclencheur, sélectionnez Cloud Pub/Sub.
- Pour le champ Select a Cloud Pub/Sub topic (Sélectionner un sujet Cloud Pub/Sub), cliquez sur Create a topic (Créer un sujet).
- La boîte de dialogue Créer un sujet s'affiche.
- 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 Environnement d'exécution, sélectionnez Node.js 16 ou version ultérieure.
- Dans le champ Point d'entrée, saisissez
startInstancePubSub
. - Dans la partie gauche de l'éditeur de code, sélectionnez index.js.
Remplacez le code de démarrage par le code suivant :
Dans la partie gauche de l'éditeur de code, sélectionnez 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 devez vous trouver sur la page Fonctions Cloud Run 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.
- Pour Type de déclencheur, sélectionnez Cloud Pub/Sub.
- Pour le champ Select a Cloud Pub/Sub topic (Sélectionner un sujet Cloud Pub/Sub), cliquez sur Create a topic (Créer un sujet).
- La boîte de dialogue Créer un sujet s'affiche.
- 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 Environnement d'exécution, sélectionnez Node.js 16 ou version ultérieure.
- Dans le champ Point d'entrée, saisissez
stopInstancePubSub
. - Dans la partie gauche de l'éditeur de code, sélectionnez index.js.
Remplacez le code de démarrage par le code suivant :
Dans la partie gauche de l'éditeur de code, sélectionnez 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 Fonctions Cloud Run dans la console Google Cloud.
Accéder à la page "Cloud Run 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 Fonctions Cloud Run dans la console Google Cloud.
Accéder à la page "Cloud Run 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 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
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 sujets. - 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 devez 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 sujets. - 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 Run
Accédez à la page Fonctions Cloud Run 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 :
- In the Google Cloud console, go to the VM instances page.
- Select the checkbox for the instance that you want to delete.
- To delete the instance, click More actions, click Delete, and then follow the 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 :
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Étapes suivantes
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Cloud Architecture Center.