Dienste nach Zeitplan ausführen

Mit Cloud Scheduler können Sie einen Cloud Run-Dienst sicher nach Zeitplan starten. Der Vorgang ähnelt einem Cronjob.

Mögliche Anwendungsfälle sind:

  • Daten in regelmäßigen Zeitabständen sichern
  • Wiederkehrende Verwaltungsaufgaben durchführen, wie:
    • Sitemap noch einmal erstellen
    • Alte Daten, Inhalte, Konfigurationen oder Überarbeitungen löschen
    • Inhalte zwischen Datensystemen synchronisieren
    • Tägliche E-Mail-Benachrichtigungen verarbeiten
    • Zugriff auf nachgelagerte Dienste verifizieren und entsprechende Berichte erstellen
  • Dokumente generieren, z. B. Rechnungen

In dieser Anleitung wird gezeigt, wie Cloud Scheduler mit Cloud Run sicher im selben Google Cloud-Projekt verwendet werden kann.

Hinweis

Aktivieren Sie die Cloud Scheduler API für das Projekt, das Sie verwenden.

Dienst erstellen und bereitstellen

So erstellen Sie Dienste und stellen sie bereit:

  1. Implementieren Sie in Ihrem Dienst den Job, den Sie nach einem Zeitplan ausführen möchten.

  2. Notieren Sie sich, von welchem Anfragetyp der Dienst die Jobanfragen erwartet, z. B. von GET oder POST. Wenn Sie den geplanten Job erstellen, der Ihren Dienst aufruft, müssen Sie die entsprechende HTTP-Methode angeben.

  3. Achten Sie beim Bereitstellen des Dienstes, den Sie mit Cloud Scheduler verwenden, darauf, keine nicht authentifizierten Aufrufe zuzulassen.

Das folgende Beispiel zeigt, wie Sie einen Cloud Run-Dienst mit Terraform bereitstellen:

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

  deletion_protection = false # set to "true" in production

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

Ersetzen Sie us-docker.pkg.dev/cloudrun/container/hello durch einen Verweis auf Ihr eigenes Container-Image.

Dienstkonto für Cloud Scheduler erstellen

Sie müssen ein Dienstkonto erstellen, das mit Cloud Scheduler verknüpft werden soll, und diesem Dienstkonto die Berechtigung zum Aufrufen Ihres Cloud Run-Dienstes erteilen. Sie können ein vorhandenes Dienstkonto verwenden, um Cloud Scheduler darzustellen, oder ein neues erstellen.

So erstellen Sie ein Dienstkonto und erteilen ihm die Berechtigung zum Aufrufen des Cloud Run-Dienstes:

Console

  1. Rufen Sie in der Google Cloud Console die Seite Dienstkonten auf:

    Zur Seite „Dienstkonten“

  2. Wählen Sie ein Projekt aus.

  3. Geben Sie einen Dienstkontonamen ein, der in der Google Cloud Console angezeigt werden soll.

    Die Google Cloud Console generiert anhand dieses Namens eine Dienstkonto-ID. Bearbeiten Sie gegebenenfalls die ID. Sie können die ID später nicht mehr ändern.

  4. Optional: Geben Sie eine Beschreibung für das Dienstkonto ein.

  5. Klicken Sie auf Erstellen und fortfahren.

  6. Optional: Klicken Sie auf das Feld Rolle auswählen.

  7. Wählen Sie Cloud Run > Cloud Run Invoker aus.

  8. Klicken Sie auf Fertig.

Befehlszeile

  1. Erstellen Sie das Dienstkonto:

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

    Ersetzen

    • SERVICE_ACCOUNT_NAME durch einen Namen in Kleinbuchstaben, der in Ihrem Google Cloud-Projekt eindeutig ist, z. B. my-invoker-service-account-name.
    • DISPLAYED_SERVICE_ACCOUNT_NAME durch den Namen, den Sie für dieses Dienstkonto anzeigen möchten, z. B. in der Konsole wie etwa My Invoker Service Account.
  2. Erteilen Sie Ihrem Dienstkonto für Cloud Run die Berechtigung, den Dienst aufzurufen:

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

    Ersetzen

    • SERVICE durch den Namen des Dienstes, der von Cloud Scheduler aufgerufen werden soll.
    • SERVICE_ACCOUNT_NAME durch den Namen des Dienstkontos.
    • PROJECT_ID durch Ihre Google Cloud-Projekt-ID.
  3. Gewähren Sie Ihrem Dienstkonto Zugriff auf das Projekt, damit es berechtigt ist, bestimmte Aktionen für die Ressourcen in Ihrem Projekt auszuführen:

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

    Ersetzen

    • RESOURCE_ID: Ihre Google Cloud-Projekt-ID.

    • PRINCIPAL: Eine Kennung für das Hauptkonto bzw. Mitglied, die normalerweise die folgende Form hat: PRINCIPAL_TYPE:ID. Beispiel: user:my-user@example.com. Eine vollständige Liste der für PRINCIPAL zulässigen Werte finden Sie in der Referenz zur Richtlinienbindung.

Terraform

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

So erstellen Sie ein Dienstkonto mit 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}"
}

Cloud Scheduler-Job erstellen

Sie müssen einen Job erstellen, der Ihren Dienst zu bestimmten Zeiten aufruft. Sie können entweder die Konsole oder die Befehlszeile verwenden:

Jobs werden entweder in der Konsole oder in der gcloud-Befehlszeile erstellt. Klicken Sie auf den entsprechenden Tab:

Console

  1. Gehen Sie in der Konsole zur Cloud Scheduler-Seite.

    Zu Cloud Scheduler

  2. Klicken Sie auf Job erstellen.

    Screenshot

  3. Geben Sie einen Namen für den Job an.

  4. Geben Sie an, mit welcher Häufigkeit bzw. in welchem Intervall der Job ausgeführt werden soll. Verwenden Sie dafür einen Konfigurationsstring. Beispiel: Bei Angabe des Strings 0 */3 * * * wird der Job alle 3 Stunden ausgeführt. Hier kann jeder beliebige mit Crontab kompatible String angegeben werden.

    Weitere Informationen finden Sie unter Jobzeitpläne konfigurieren.

  5. Wählen Sie aus der Drop-down-Liste die Zeitzone für die Jobhäufigkeit aus.

  6. Geben Sie HTTP als Ziel an:

    1. Geben Sie die voll qualifizierte URL Ihres Dienstes an, z. B. https://myservice-abcdef-uc.a.run.app. Der Job sendet Anfragen an diese URL.

    2. Geben Sie die HTTP-Methode an: Die Methode muss mit dem übereinstimmen, was der zuvor bereitgestellte Cloud Run-Dienst erwartet. Der Standardwert ist POST.

    3. Geben Sie optional die Daten an, die an das Ziel gesendet werden sollen. Die Daten werden im Anfragetext gesendet, wenn die HTTP-Methode POST oder PUT ausgewählt wurde.

    4. Klicken Sie auf Mehr, um die Authentifizierungseinstellungen anzuzeigen.

    5. Wählen Sie im Drop-down-Menü die Option OIDC-Token hinzufügen aus.

    6. Kopieren Sie im Feld Dienstkonto die E-Mail-Adresse des zuvor erstellten Dienstkontos.

    7. Kopieren Sie im Feld Zielgruppe die vollständige URL Ihres Dienstes.

  7. Klicken Sie auf Erstellen, um den Job zu erstellen und zu speichern.

Befehlszeile

Sie müssen die OIDC-Authentifizierung verwenden, um über Cloud Scheduler auf einen authentifizierten Cloud Run-Dienst zuzugreifen. Die OIDC-Authentifizierung umfasst das Dienstkonto und die Zielgruppen-Flags. Weitere Informationen finden Sie unter Authentifizierung für HTTP-Ziele verwenden.

So erstellen Sie den Cloud Scheduler-Job:

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

Ersetzen

  • HTTP-METHOD durch die HTTP-Methode (d. h. GET, POST, PUT usw.).
  • SERVICE-URL durch Ihre Dienst-URL.
  • SERVICE-ACCOUNT-EMAIL durch die E-Mail-Adresse Ihres Dienstkontos.

Terraform

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

So erstellen Sie einen Cloud Scheduler-Job für den Cloud Run-Dienst:

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

Ihr Cloud Run-Dienst wird durch eine Anfrage des Cloud Scheduler-Jobs in der von Ihnen definierten Häufigkeit ausgelöst. Sie können dies in den Logs für diesen Dienst prüfen und überwachen.

Nächste Schritte