Lancer une exécution planifiée de services

Avec Cloud Scheduler, vous pouvez déclencher un service Cloud Run de manière planifiée et sécurisée. Cette méthode revient à utiliser des tâches Cron.

Exemples d'utilisation possible :

  • Sauvegarde à intervalles réguliers
  • Exécution de tâches d'administration récurrentes, telles que les suivantes :
    • Nouvelle génération d'un sitemap
    • Suppression d'anciens contenus, données, configurations ou révisions
    • Synchronisation du contenu entre les systèmes de données
    • Traitement des notifications quotidiennes par e-mail
    • Validation et création de rapports sur l'accès aux services en aval
  • Génération de documents, tels que des factures

Cette page décrit comment utiliser Cloud Scheduler avec Cloud Run dans le même projet Google Cloud en toute sécurité.

Avant de commencer

Activez l'API Cloud Scheduler sur le projet que vous utilisez.

Créer et déployer votre service

Pour créer et déployer un service, procédez comme suit :

  1. Dans votre service, mettez en œuvre la tâche que vous souhaitez exécuter de manière planifiée.

  2. Notez le type de requête avec lequel votre service s'attend à recevoir des requêtes de tâche. Par exemple, GET ou POST. Lorsque vous créez la tâche planifiée qui appelle votre service, vous devez spécifier la méthode HTTP qui correspond à ce service.

  3. Lorsque vous déployez le service que vous utilisez avec Cloud Scheduler, assurez-vous de NE PAS autoriser les appels non authentifiés.

L'exemple suivant montre comment déployer un service Cloud Run à l'aide de Terraform :

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

Remplacez us-docker.pkg.dev/cloudrun/container/hello par une référence à votre propre image de conteneur.

Créer un compte de service pour Cloud Scheduler

Vous devez créer un compte de service à associer à Cloud Scheduler et l'autoriser à appeler votre service Cloud Run. Vous pouvez utiliser un compte de service existant pour représenter Cloud Scheduler ou en créer un.

Pour créer un compte de service et l'autoriser à appeler le service Cloud Run, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Sélectionnez un projet.

  3. Saisissez le nom du compte de service à afficher dans la console Google Cloud.

    La console Google Cloud génère un ID de compte de service basé sur ce nom. Modifiez l'ID si nécessaire. Vous ne pourrez pas le modifier par la suite.

  4. Facultatif : saisissez la description du compte de service.

  5. Cliquez sur Créer et continuer.

  6. Facultatif : cliquez sur le champ Sélectionner un rôle.

  7. Sélectionnez Cloud Run > Demandeur Cloud Run.

  8. Cliquez sur OK.

Ligne de commande

  1. Créez le compte de service :

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    Remplacez

    • SERVICE_ACCOUNT_NAME par un nom écrit en minuscules unique dans votre projet Google Cloud, par exemple my-invoker-service-account-name ;
    • DISPLAYED_SERVICE_ACCOUNT_NAME par le nom que vous souhaitez afficher pour ce compte de service, par exemple dans la console : My Invoker Service Account.
  2. Pour Cloud Run, autorisez votre compte de service à appeler votre service :

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    Remplacez

    • SERVICE par le nom du service que vous souhaitez que Cloud Scheduler appelle.
    • SERVICE_ACCOUNT_NAME par le nom du compte de service.
    • PROJECT_ID par l'ID de votre projet Google Cloud
  3. Accordez à votre compte de service l'accès au projet afin qu'il soit autorisé à effectuer des actions spécifiques sur les ressources de votre projet :

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    Remplacer

    • RESOURCE_ID : ID de votre projet Google Cloud.

    • PRINCIPAL : l'identifiant du compte principal, qui se présente généralement sous la forme suivante : PRINCIPAL_TYPE:ID. Exemple : user:my-user@example.com. Pour obtenir la liste complète des valeurs possibles pour PRINCIPAL, consultez la documentation de référence sur les liaisons de stratégie.

Terraform

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Pour créer un compte de service à l'aide de Terraform, procédez comme suit :

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

Créer une tâche Cloud Scheduler

Vous devez créer une tâche qui appelle votre service aux moments spécifiés. Vous pouvez utiliser la console ou la ligne de commande :

Pour créer une tâche, vous pouvez utiliser la console ou l'outil de ligne de commande gcloud. Cliquez sur l'onglet approprié :

Console

  1. Accédez à la page Cloud Scheduler de la console.

    Accéder à Cloud Scheduler

  2. Cliquez sur Créer une tâche.

    capture d'écran

  3. Indiquez un nom pour la tâche.

  4. Spécifiez la fréquence (intervalle de tâche) à laquelle la tâche doit être exécutée à l'aide d'une chaîne de configuration. Par exemple, la chaîne 0 */3 * * * exécute la tâche toutes les trois heures. La chaîne que vous fournissez ici peut être n'importe quelle chaîne compatible avec crontab.

    Pour plus d'informations, reportez-vous à la rubrique Configurer la planification de tâches.

  5. Dans la liste déroulante, choisissez le fuseau horaire à utiliser pour la fréquence de tâche.

  6. Spécifiez HTTP comme cible :

    1. Spécifiez l'URL complète de votre service, par exemple https://myservice-abcdef-uc.a.run.app. La tâche enverra des requêtes à cette URL.

    2. Spécifiez la méthode HTTP : celle-ci doit correspondre à celle attendue par votre service Cloud Run précédemment déployé. La valeur par défaut est POST.

    3. Vous pouvez éventuellement spécifier les données à envoyer à la cible. Ces données sont envoyées dans le corps de la requête lorsque la méthode HTTP POST ou PUT est sélectionnée.

    4. Cliquez sur Plus pour afficher les paramètres d'authentification.

    5. Dans le menu déroulant, sélectionnez Ajouter un jeton OIDC.

    6. Dans le champ Compte de service, copiez l'adresse e-mail du compte de service que vous avez créé précédemment.

    7. Dans le champ Audience, copiez l'URL complète de votre service.

  7. Cliquez sur Créer pour créer et enregistrer la tâche.

Ligne de commande

Vous devez utiliser l'authentification OIDC pour accéder à un service Cloud Run authentifié à partir de Cloud Scheduler. L'authentification OIDC inclut les options de compte de service et d'audience. Pour en savoir plus, consultez la section Utiliser l'authentification pour les cibles HTTP.

Pour créer le job Cloud Scheduler :

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

Remplacer

  • HTTP-METHOD par la méthode HTTP (GET, POST, PUT, etc…).
  • SERVICE-URL par votre URL de service.
  • SERVICE-ACCOUNT-EMAIL par l'adresse e-mail de votre compte de service.

Terraform

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Pour créer une tâche Cloud Scheduler pour le service Cloud Run, procédez comme suit :

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

Votre service Cloud Run sera déclenché via une requête de la tâche Cloud Scheduler à la fréquence que vous avez définie. Vous pouvez vérifier et surveiller ce comportement en examinant les journaux de ce service.

Étape suivante