Planifier le démarrage ou l'arrêt d'une instance Cloud SQL

Vous pouvez utiliser Cloud Scheduler pour démarrer et arrêter des instances Cloud SQL de manière régulière. Par exemple, vous pouvez souhaiter que vos instances ne s'exécutent qu'à certaines heures.

Ce tutoriel explique comment démarrer et arrêter automatiquement une instance Cloud SQL pour SQL Server en créant une architecture événementielle à l'aide des produits Google Cloud .

Objectifs

Dans ce tutoriel, vous allez créer des jobs Cloud Scheduler qui planifient l'exécution des instances Cloud SQL dotées d'une étiquette de ressource env=dev pendant des heures spécifiques. Vous ne planifierez qu'une seule instance. Cependant, l'architecture décrite dans ce tutoriel peut être utilisée pour arrêter et démarrer plusieurs instances dans lesquelles l'étiquette de ressource est env=dev.

Pour ce faire, procédez comme suit :

  1. Créez une instance Cloud SQL pour SQL Server et attribuez-lui un libellé de ressource spécifique (env=dev).
  2. Créez deux sujets Pub/Sub qui serviront de sources d'événements pour vos déclencheurs Eventarc et d'agents de messages.
  3. Créez et déployez deux fonctions Cloud Run basées sur des événements déclenchées par les sujets Pub/Sub. Lorsqu'elles sont déclenchées, les fonctions recherchent les instances Cloud SQL de votre projet qui correspondent au libellé fourni dans la charge utile du message Pub/Sub (env=dev).
  4. Créez et déployez deux déclencheurs Eventarc. Les événements de sujet Pub/Sub sont acheminés vers vos fonctions en tant que requêtes HTTP, et le contenu du message d'événement est transmis en tant que données d'entrée aux fonctions.
  5. Créez deux tâches Cron Cloud Scheduler pour publier un message contenant le libellé cible dans les sujets Pub/Sub à des moments spécifiques. Programmez le démarrage des instances à 9h et leur arrêt à 17h, du lundi au vendredi.

Le diagramme suivant présente une vue d'ensemble de l'architecture événementielle :

Démarrer et arrêter des instances Cloud SQL selon un calendrier
Démarrer et arrêter des instances Cloud SQL selon une programmation (cliquez sur le schéma pour l'agrandir).

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai sans frais.

Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour en savoir plus sur la résolution de ce problème, consultez Développer des applications dans un environnement Google Cloud limité.

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. Installez la Google Cloud CLI.

  3. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  4. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  5. Créez ou sélectionnez un projet Google Cloud .

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un projet Google Cloud  :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud .

  6. Si vous utilisez un projet existant pour ce guide, vérifiez que vous disposez des autorisations nécessaires pour suivre les instructions. Si vous avez créé un projet, vous disposez déjà des autorisations requises.

  7. Vérifiez que la facturation est activée pour votre projet Google Cloud .

  8. Activez les API Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin et Eventarc :

    Rôles requis pour activer les API

    Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    gcloud services enable cloudbuild.googleapis.com cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com
  9. Configurez l'authentification :

    1. Assurez-vous de disposer des rôles IAM "Créateur de compte de service" (roles/iam.serviceAccountCreator) et "Administrateur IAM du projet" (roles/resourcemanager.projectIamAdmin). Découvrez comment attribuer des rôles.
    2. Créez le compte de service :

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Remplacez SERVICE_ACCOUNT_NAME par le nom que vous souhaitez donner au compte de service.

    3. Attribuez des rôles au compte de service. Exécutez la commande suivante une fois pour chacun des rôles IAM suivants : roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker :

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Remplacez les éléments suivants :

      • SERVICE_ACCOUNT_NAME : nom du compte de service.
      • PROJECT_ID : ID du projet dans lequel vous avez créé le compte de service.
      • ROLE : rôle à accorder
  10. Installez la Google Cloud CLI.

  11. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  12. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  13. Créez ou sélectionnez un projet Google Cloud .

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un projet Google Cloud  :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud .

  14. Si vous utilisez un projet existant pour ce guide, vérifiez que vous disposez des autorisations nécessaires pour suivre les instructions. Si vous avez créé un projet, vous disposez déjà des autorisations requises.

  15. Vérifiez que la facturation est activée pour votre projet Google Cloud .

  16. Activez les API Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin et Eventarc :

    Rôles requis pour activer les API

    Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    gcloud services enable cloudbuild.googleapis.com cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com
  17. Configurez l'authentification :

    1. Assurez-vous de disposer des rôles IAM "Créateur de compte de service" (roles/iam.serviceAccountCreator) et "Administrateur IAM du projet" (roles/resourcemanager.projectIamAdmin). Découvrez comment attribuer des rôles.
    2. Créez le compte de service :

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Remplacez SERVICE_ACCOUNT_NAME par le nom que vous souhaitez donner au compte de service.

    3. Attribuez des rôles au compte de service. Exécutez la commande suivante une fois pour chacun des rôles IAM suivants : roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker :

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Remplacez les éléments suivants :

      • SERVICE_ACCOUNT_NAME : nom du compte de service.
      • PROJECT_ID : ID du projet dans lequel vous avez créé le compte de service.
      • ROLE : rôle à accorder

Créer une instance Cloud SQL

Pour créer une instance Cloud SQL pour SQL Server avec le libellé de ressource env=dev, utilisez la commande gcloud beta sql instances create :

gcloud beta sql instances create dev-instance \
    --database-version=SQLSERVER_2019_EXPRESS \
    --region=us-west1 \
    --tier=db-custom-2-3840 \
    --root-password=YourStrongPassword123! \
    --labels=env=dev

La création de l'instance peut prendre quelques minutes. Pour en savoir plus, consultez la page Créer des instances.

Créer des sujets Pub/Sub

Pour créer les deux sujets Pub/Sub qui servent de sources d'événements pour vos déclencheurs Eventarc, utilisez la commande gcloud pubsub topics create :

gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event

Pour en savoir plus, consultez Créer un sujet.

Créer et déployer des fonctions Cloud Run

Créez et déployez deux fonctions Cloud Run (Node.js) déclenchées par Eventarc via des sujets Pub/Sub. Lorsqu'elles sont déclenchées, les fonctions recherchent les instances Cloud SQL de votre projet qui correspondent au libellé fourni dans la charge utile du message Pub/Sub (env=dev) :

  • La fonction de démarrage met à jour le activationPolicy de l'instance sur ALWAYS, ce qui l'active.
  • La fonction d'arrêt met à jour activationPolicy sur NEVER, ce qui arrête l'instance.

Pour en savoir plus, consultez Écrire des fonctions Cloud Run et Déclencheurs des fonctions Cloud Run.

Créer les fonctions

Créez des fonctions Cloud Run Functions basées sur des événements qui annulent automatiquement les événements conformes à la spécification CloudEvents. Cette spécification standard du secteur décrit les données d'événement de manière courante.

Votre code source doit définir un point d'entrée de fonction, qui est le code qui s'exécute lorsque Cloud Run appelle votre fonction. Vous spécifiez ce point d'entrée lorsque vous déployez votre fonction.

  1. 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.

  2. Accédez au répertoire approprié.

    cd nodejs-docs-samples/functions/scheduleinstance/

Déployer les fonctions basées sur des événements

Pour déployer les fonctions sur Cloud Run, utilisez la commande gcloud run deploy.

  1. Déployez la fonction qui démarre l'instance Cloud SQL :

    gcloud run deploy startinstance \
        --source . \
        --function startInstanceEvent \
        --base-image nodejs24 \
        --region=us-west1 \
        --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  2. Si vous êtes invité à créer un dépôt dans la région spécifiée, saisissez y.

  3. À l'invite Allow unauthenticated invocations, saisissez n.

  4. Déployez la fonction qui arrête l'instance Cloud SQL :

    gcloud run deploy stopinstance \
        --source . \
        --function stopInstanceEvent \
        --base-image nodejs24 \
        --region=us-west1 \
        --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  5. Si vous êtes invité à créer un dépôt dans la région spécifiée, saisissez y.

  6. À l'invite Allow unauthenticated invocations, saisissez n.

Une fois le déploiement terminé, la Google Cloud CLI affiche une URL sur laquelle le service est en cours d'exécution.

Créer des déclencheurs Eventarc

Pour créer des déclencheurs Eventarc qui acheminent les événements depuis Pub/Sub, utilisez la commande gcloud eventarc triggers create. Chaque message publié dans le sujet Pub/Sub déclenche la fonction correspondante, et son contenu est transmis sous forme de données d'entrée.

  1. Créez un déclencheur qui démarre l'instance Cloud SQL :

    gcloud eventarc triggers create start-instance-trigger \
        --location=us-west1 \
        --destination-run-service=startinstance \
        --destination-run-region=us-west1 \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=start-instance-event \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  2. Créez un déclencheur qui arrête l'instance Cloud SQL :

    gcloud eventarc triggers create stop-instance-trigger \
        --location=us-west1 \
        --destination-run-service=stopinstance \
        --destination-run-region=us-west1 \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=stop-instance-event \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

L'activation d'un nouveau déclencheur peut prendre jusqu'à deux minutes.

Facultatif : Vérifier que les fonctions sont opérationnelles

Vous pouvez vérifier que vos fonctions fonctionnent en publiant directement des messages dans les sujets Pub/Sub. La mise à jour de l'instance Cloud SQL peut prendre quelques minutes.

  1. Pour arrêter les instances portant le libellé env=dev, utilisez la commande gcloud pubsub topics publish pour publier un message dans le sujet d'arrêt :

    gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
  2. Pour vérifier que l'instance est arrêtée, vérifiez sa règle d'activation à l'aide de la commande gcloud sql instances describe :

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    Le résultat NEVER doit s'afficher.

  3. Pour démarrer des instances avec le libellé env=dev, publiez un message dans le sujet de démarrage :

    gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
  4. Vérifiez que l'instance a démarré en consultant sa règle d'activation :

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    Le résultat ALWAYS doit s'afficher.

Créer les tâches Cloud Scheduler

Créez des tâches Cloud Scheduler qui publient des messages dans les sujets Pub/Sub à intervalles réguliers.

  1. Pour créer un job qui s'exécute à 9h du lundi au vendredi et qui démarre les instances, utilisez la commande gcloud scheduler jobs create :

    gcloud scheduler jobs create pubsub startup-dev-instances \
        --schedule '0 9 * * 1-5' \
        --topic start-instance-event \
        --message-body '{"label":"env=dev"}' \
        --time-zone 'America/Los_Angeles' \
        --location us-east1
  2. Créez un job qui s'exécute à 17h du lundi au vendredi et qui arrête les instances :

    gcloud scheduler jobs create pubsub shutdown-dev-instances \
        --schedule '0 17 * * 1-5' \
        --topic stop-instance-event \
        --message-body '{"label":"env=dev"}' \
        --time-zone 'America/Los_Angeles' \
        --location us-east1

En raison d'une configuration initiale, l'exécution de la première tâche créée dans un projet peut prendre quelques minutes.

Facultatif : Vérifier que les jobs fonctionnent

Vous pouvez exécuter manuellement vos tâches Cloud Scheduler pour vérifier qu'elles déclenchent correctement les fonctions de démarrage et d'arrêt. La mise à jour de l'instance Cloud SQL peut prendre quelques minutes.

  1. Pour exécuter le job et arrêter l'instance Cloud SQL, utilisez la commande gcloud scheduler jobs run :

    gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
  2. Vérifiez que la règle d'activation de dev-instance est NEVER :

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
  3. Exécutez le job pour démarrer l'instance :

    gcloud scheduler jobs run startup-dev-instances --location="us-east1"
  4. Vérifiez que la règle d'activation de dev-instance est ALWAYS :

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel ne soient facturées, supprimez-les.

  1. Supprimez les jobs Cloud Scheduler :
    gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet
    gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
  2. Supprimez les déclencheurs Eventarc :
    gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet
    gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
  3. Supprimez les services Cloud Run :
    gcloud run services delete startinstance --region=us-west1 --quiet
    gcloud run services delete stopinstance --region=us-west1 --quiet
  4. Supprimez les sujets Pub/Sub :
    gcloud pubsub topics delete start-instance-event
    gcloud pubsub topics delete stop-instance-event
  5. Supprimez l'instance Cloud SQL :
    gcloud sql instances delete dev-instance --quiet
  6. Vous pouvez également supprimer votre projet Google Cloud pour éviter des frais. La suppression de votre projet Google Cloud arrête la facturation de toutes les ressources utilisées dans ce projet.

    Supprimer un projet Google Cloud  :

    gcloud projects delete PROJECT_ID

É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.