Esecuzione di servizi in base a una pianificazione

Puoi utilizzare Cloud Scheduler per attivare in modo sicuro un servizio Cloud Run in base a una pianificazione. in modo simile all'utilizzo dei cron jobs.

I possibili casi d'uso includono:

  • Esecuzione di backup a tempo
  • Eseguire attività di amministrazione ricorrenti, ad esempio:
    • Rigenerazione di una Sitemap
    • Eliminazione di dati, contenuti, configurazioni o revisioni precedenti
    • Sincronizzazione dei contenuti tra sistemi di dati
    • Elaborazione di notifiche email giornaliere
    • Verifica e reporting sull'accesso ai servizi downstream
  • Generazione di documenti, ad esempio fatture

Questa pagina mostra come utilizzare in modo sicuro Cloud Scheduler con Cloud Run nello stesso progetto Google Cloud.

Prima di iniziare

Abilita l'API Cloud Scheduler sul progetto in uso.

Creazione e deployment del servizio

Per creare ed eseguire il deployment:

  1. Nel servizio, implementa il job che vuoi eseguire in base a una pianificazione.

  2. Prendi nota del tipo di richiesta da cui il tuo servizio prevede di ricevere le richieste di job, ad esempio GET o POST. Quando crei il job pianificato che richiama il tuo servizio, devi specificare il metodo HTTP corrispondente.

  3. Quando esegui il deployment del servizio che stai utilizzando con Cloud Scheduler, assicurati di NON consentire le chiamate non autenticate.

L'esempio seguente mostra come eseguire il deployment di un servizio Cloud Run utilizzando 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
  ]
}

Sostituisci us-docker.pkg.dev/cloudrun/container/hello con un riferimento alla tua immagine container.

Creazione di un account di servizio per Cloud Scheduler

Devi creare un account di servizio da associare a Cloud Scheduler e concedergli l'autorizzazione per richiamare il tuo servizio Cloud Run. Puoi utilizzare un account di servizio esistente per rappresentare Cloud Scheduler o crearne uno nuovo.

Per creare un account di servizio e concedergli l'autorizzazione per richiamare il servizio Cloud Run:

Console

  1. Nella console Google Cloud, vai alla pagina Account di servizio.

    Vai ad Account di servizio

  2. Seleziona un progetto.

  3. Inserisci il nome di un account di servizio da visualizzare nella console Google Cloud.

    La console Google Cloud genera un ID account di servizio in base a questo nome. Modifica l'ID, se necessario. Non potrai modificare l'ID in un secondo momento.

  4. (Facoltativo) Inserisci una descrizione dell'account di servizio.

  5. Fai clic su Crea e continua.

  6. (Facoltativo) Fai clic sul campo Seleziona un ruolo.

  7. Seleziona Cloud Run > Invoker di Cloud Run.

  8. Fai clic su Fine.

Riga di comando

  1. Crea l'account di servizio:

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

    Sostituisci

    • SERVICE_ACCOUNT_NAME con un nome minuscolo univoco all'interno del progetto Google Cloud, ad esempio my-invoker-service-account-name.
    • DISPLAYED_SERVICE_ACCOUNT_NAME con il nome che vuoi visualizzare per questo account di servizio, ad esempio nella console, ad esempio My Invoker Service Account.
  2. Per Cloud Run, concedi al tuo account di servizio l'autorizzazione a richiamare il tuo servizio:

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

    Sostituisci

    • SERVICE con il nome del servizio che vuoi richiamare da Cloud Scheduler.
    • SERVICE_ACCOUNT_NAME con il nome dell'account di servizio.
    • PROJECT_ID con il tuo ID progetto Google Cloud.
  3. Concedi al tuo account di servizio l'accesso al progetto in modo che abbia l'autorizzazione per completare azioni specifiche sulle risorse del tuo progetto:

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

    Sostituisci

    • RESOURCE_ID: l'ID del tuo progetto Google Cloud.

    • PRINCIPAL: un identificatore dell'entità o del membro, che in genere ha il seguente formato: PRINCIPAL_TYPE:ID. Ad esempio, user:my-user@example.com. Per un elenco completo dei valori che PRINCIPAL può avere, consulta il riferimento sull'associazione dei criteri.

Terraform

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

Per creare un account di servizio utilizzando Terraform:

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}"
}

Creazione di un job Cloud Scheduler

Devi creare un job che richiami il tuo servizio in orari specifici. Puoi utilizzare la console o la riga di comando:

Per creare un job puoi utilizzare la console o la riga di comando gcloud. Fai clic sulla scheda appropriata:

Console

  1. Visita la pagina della console di Cloud Scheduler.

    Vai a Cloud Scheduler

  2. Fai clic su Crea job.

    screenshot

  3. Specifica un nome per il job.

  4. Specifica la frequenza o l'intervallo del job con cui eseguire il job utilizzando una stringa di configurazione. Ad esempio, la stringa 0 */3 * * * esegue il job ogni 3 ore. La stringa fornita qui può essere qualsiasi stringa compatibile con crontab.

    Per ulteriori informazioni, consulta Configurazione delle pianificazioni dei job.

  5. Dall'elenco a discesa, scegli il fuso orario da utilizzare per la frequenza del job.

  6. Specifica HTTP come target:

    1. Specifica l'URL completo del servizio, ad esempio https://myservice-abcdef-uc.a.run.app Il job invierà richieste a questo URL.

    2. Specifica il metodo HTTP: deve corrispondere a quello previsto dal servizio Cloud Run di cui è stato eseguito il deployment in precedenza. Il valore predefinito è POST.

    3. (Facoltativo) Specifica i dati da inviare alla destinazione. Questi dati vengono inviati nel corpo della richiesta quando viene selezionato il metodo HTTP POST o PUT.

    4. Fai clic su Altro per visualizzare le impostazioni di autenticazione.

    5. Dal menu a discesa, seleziona Aggiungi token OIDC.

    6. Nel campo Account di servizio, copia l'indirizzo email dell'account di servizio che hai creato in precedenza.

    7. Nel campo Pubblico, copia l'URL completo del servizio.

  7. Fai clic su Crea per creare e salvare il job.

Riga di comando

Devi utilizzare l'autenticazione OIDC per accedere a un servizio Cloud Run autenticato da Cloud Scheduler. L'autenticazione OIDC include l'account di servizio e i flag del pubblico. Per ulteriori informazioni, consulta l'articolo Utilizzare l'autenticazione per le destinazioni HTTP.

Per creare il 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

Sostituisci

  • HTTP-METHOD con il metodo HTTP (ad es. GET, POST, PUT e così via).
  • SERVICE-URL con l'URL del tuo servizio.
  • SERVICE-ACCOUNT-EMAIL con l'indirizzo email del tuo account di servizio.

Terraform

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

Per creare un job Cloud Scheduler per il servizio Cloud Run:

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
  ]
}

Il servizio Cloud Run verrà attivato tramite una richiesta da parte del job Cloud Scheduler alla frequenza definita. Puoi confermare e monitorare questo comportamento esaminando i log di questo servizio.

Passaggi successivi