Cloud Run-Job mit Workflows ausführen


Mit Workflows können Sie Cloud Run-Jobs als Teil eines Workflows ausführen, um eine komplexere Datenverarbeitung durchzuführen oder ein System vorhandener Jobs zu orchestrieren.

In dieser Anleitung wird gezeigt, wie Sie mit Workflows einen Cloud Run-Job ausführen, der Daten verarbeitet, die als Umgebungsvariablen an den Job übergeben werden, als Reaktion auf ein Ereignis aus Cloud Storage.

Sie können die Ereignisdaten auch in einem Cloud Storage-Bucket speichern, um sie mit vom Kunden verwalteten Verschlüsselungsschlüsseln zu verschlüsseln. Weitere Informationen finden Sie unter Cloud Run-Job ausführen, der in Cloud Storage gespeicherte Ereignisdaten verarbeitet.

Lernziele

In dieser Anleitung werden Sie:

  1. Erstellen Sie einen Cloud Run-Job, der Datendateien in einem Cloud Storage-Bucket verarbeitet.
  2. Stellen Sie einen Workflow bereit, der Folgendes ausführt:
    1. Akzeptiert ein Cloud Storage-Ereignis als Argument.
    2. Prüft, ob der im Ereignis angegebene Cloud Storage-Bucket mit dem Bucket übereinstimmt, der vom Cloud Run-Job verwendet wird.
    3. In diesem Fall wird der Cloud Run Admin API-Connector zum Ausführen des Cloud Run-Jobs verwendet.
  3. Erstellen Sie einen Eventarc-Trigger, der den Workflow als Reaktion auf Ereignisse ausführt, die sich auf den Cloud Storage-Bucket auswirken.
  4. Triggern Sie den Workflow, indem Sie eine Eingabedatendatei im Cloud Storage-Bucket aktualisieren.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Vorbereitung

Von Ihrer Organisation definierte Sicherheitsbeschränkungen verhindern möglicherweise, dass die folgenden Schritte ausgeführt werden. Informationen zur Fehlerbehebung finden Sie unter Anwendungen in einer eingeschränkten Google Cloud-Umgebung entwickeln.

Console

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs.

    Enable the APIs

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs.

    Enable the APIs

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  10. Bevor Sie einen Trigger für direkte Ereignisse aus Cloud Storage erstellen, weisen Sie dem Cloud Storage-Dienst-Agent die Pub/Sub-Publisher-Rolle (roles/pubsub.publisher) zu:
    1. Öffnen Sie in der Google Cloud Console die Seite IAM.

      IAM aufrufen

    2. Klicken Sie auf das Kästchen Von Google bereitgestellte Rollenzuweisungen einschließen.
    3. Suchen Sie in der Spalte Hauptkonto nach dem Cloud Storage-Dienst-Agent im Formular service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com und klicken Sie in der entsprechenden Zeile auf Hauptkonto bearbeiten.
    4. Klicken Sie entweder auf Rolle hinzufügen oder Weitere Rolle hinzufügen.
    5. Filtern Sie in der Liste Rolle auswählen nach Pub/Sub-Publisher und wählen Sie dann die Rolle aus.
    6. Klicken Sie auf Speichern.
  11. Wenn Sie den Cloud Pub/Sub-Dienst-Agent am oder vor dem 8. April 2021 aktiviert haben, um authentifizierte Pub/Sub-Push-Anfragen zu unterstützen, weisen Sie dem Dienst-Agent die Rolle Ersteller von Dienstkonto-Tokens (roles/iam.serviceAccountTokenCreator) zu. Andernfalls wird diese Rolle standardmäßig zugewiesen:
    1. Öffnen Sie in der Google Cloud Console die Seite IAM.

      IAM aufrufen

    2. Klicken Sie auf das Kästchen Von Google bereitgestellte Rollenzuweisungen einschließen.
    3. Suchen Sie in der Spalte Name nach dem Cloud Pub/Sub-Dienstkonto und klicken Sie dann in der entsprechenden Zeile auf Hauptkonto bearbeiten.
    4. Klicken Sie entweder auf Rolle hinzufügen oder Weitere Rolle hinzufügen.
    5. Filtern Sie in der Liste Rolle auswählen nach Ersteller von Dienstkonto-Tokens und wählen Sie dann die Rolle aus.
    6. Klicken Sie auf Speichern.
  12. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  13. Cloud Shell unterstützt die /dev/urandom-Befehle in dieser Anleitung, mit denen Pseudozufallszahlen generiert werden.

gcloud

  1. Wenn Sie ein Onlineterminal mit bereits eingerichteter gcloud CLI verwenden möchten, aktivieren Sie Cloud Shell.

    Unten auf dieser Seite wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Das Initialisieren der Sitzung kann einige Sekunden dauern.

    Cloud Shell unterstützt die /dev/urandom-Befehle in dieser Anleitung, mit denen Pseudozufallszahlen generiert werden.

  2. Google Cloud-Projekt erstellen oder auswählen.
    • Erstellen Sie ein Google Cloud-Projekt:

      gcloud projects create PROJECT_ID
    • Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:

      gcloud config set project PROJECT_ID
  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
  4. Aktivieren Sie die Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Erstellen Sie ein Dienstkonto für Ihren Workflow, das zur Authentifizierung bei anderen Google Cloud-Diensten verwendet werden soll, und gewähren Sie ihm die entsprechenden Rollen.
    1. Erstellen Sie das Dienstkonto:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Ersetzen Sie SERVICE_ACCOUNT_NAME durch einen Namen für das Dienstkonto.

    2. Weisen Sie dem nutzerverwalteten Dienstkonto, das Sie im vorherigen Schritt erstellt haben, Rollen zu. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus. Sie können das Flag --role auch mehrmals in einem einzigen Befehl verwenden:
      • roles/eventarc.eventReceiver: Ereignisse zu empfangen
      • roles/logging.logWriter: zum Schreiben von Protokollen
      • roles/run.admin: zum Ausführen des Cloud Run-Jobs
      • roles/workflows.invoker: zum Aufrufen von Workflows
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE

      Ersetzen Sie Folgendes:

      • PROJECT_ID: die Projekt-ID, unter der Sie das Dienstkonto erstellt haben
      • ROLE: Die Rolle, die dem nutzerverwalteten Dienstkonto zugewiesen werden soll.
  6. Bevor Sie einen Trigger für direkte Ereignisse aus Cloud Storage erstellen, weisen Sie dem Cloud Storage-Dienst-Agent die Pub/Sub-Publisher-Rolle (roles/pubsub.publisher) zu:

    SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
  7. Wenn Sie den Cloud Pub/Sub-Dienst-Agent am oder vor dem 8. April 2021 aktiviert haben, um authentifizierte Pub/Sub-Push-Anfragen zu unterstützen, weisen Sie dem von Google verwalteten Dienstkonto die Rolle „Ersteller von Dienstkonto-Tokens“ (roles/iam.serviceAccountTokenCreator) zu. Andernfalls wird diese Rolle standardmäßig zugewiesen:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  8. Ersetzen Sie PROJECT_NUMBER durch Ihre Google Cloud-Projektnummer. Sie finden Ihre Projektnummer auf der Willkommensseite der Google Cloud Console oder durch Ausführen des folgenden Befehls:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Terraform

  1. Wenn Sie ein Onlineterminal mit bereits eingerichteter gcloud CLI verwenden möchten, aktivieren Sie Cloud Shell.

    Unten auf dieser Seite wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Das Initialisieren der Sitzung kann einige Sekunden dauern.

    Cloud Shell unterstützt die /dev/urandom-Befehle in dieser Anleitung, mit denen Pseudozufallszahlen generiert werden.

  2. Google Cloud-Projekt erstellen oder auswählen.
    • Erstellen Sie ein Google Cloud-Projekt:

      gcloud projects create PROJECT_ID
    • Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:

      gcloud config set project PROJECT_ID
  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
  4. Aktivieren Sie die Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Erstellen Sie ein Dienstkonto für Ihren Workflow, das zur Authentifizierung bei anderen Google Cloud-Diensten verwendet werden soll, und gewähren Sie ihm die entsprechenden Rollen. Um direkte Ereignisse aus Cloud Storage zu unterstützen, weisen Sie dem Cloud Storage-Dienst-Agent außerdem die Rolle Pub/Sub-Publisher (roles/pubsub.publisher) zu.

    Ändern Sie die main.tf-Datei wie im folgenden Beispiel gezeigt. Weitere Informationen finden Sie in der Dokumentation zum Google-Anbieter für Terraform.

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

    In einem typischen Terraform-Workflow wird der gesamte Plan auf einmal angewendet. Für diese Anleitung können Sie jedoch die Ausrichtung auf eine bestimmte Ressource festlegen. Beispiel:

    terraform apply -target="google_service_account.workflows"

    # Used to retrieve project information later
    data "google_project" "project" {}
    
    # Create a dedicated service account
    resource "google_service_account" "workflows" {
      account_id   = "workflows-run-job-sa"
      display_name = "Workflows Cloud Run Job Service Account"
    }
    
    # Grant permission to receive Eventarc events
    resource "google_project_iam_member" "eventreceiver" {
      project = data.google_project.project.id
      role    = "roles/eventarc.eventReceiver"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to write logs
    resource "google_project_iam_member" "logwriter" {
      project = data.google_project.project.id
      role    = "roles/logging.logWriter"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to execute Cloud Run jobs
    resource "google_project_iam_member" "runadmin" {
      project = data.google_project.project.id
      role    = "roles/run.admin"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to invoke workflows
    resource "google_project_iam_member" "workflowsinvoker" {
      project = data.google_project.project.id
      role    = "roles/workflows.invoker"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant the Cloud Storage service agent permission to publish Pub/Sub topics
    data "google_storage_project_service_account" "gcs_account" {}
    resource "google_project_iam_member" "pubsubpublisher" {
      project = data.google_project.project.id
      role    = "roles/pubsub.publisher"
      member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
    }
    
  6. Wenn Sie den Cloud Pub/Sub-Dienst-Agent am oder vor dem 8. April 2021 aktiviert haben, um authentifizierte Pub/Sub-Push-Anfragen zu unterstützen, weisen Sie dem von Google verwalteten Dienstkonto die Rolle „Ersteller von Dienstkonto-Tokens“ (roles/iam.serviceAccountTokenCreator) zu. Andernfalls wird diese Rolle standardmäßig zugewiesen:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  7. Ersetzen Sie PROJECT_NUMBER durch Ihre Google Cloud-Projektnummer. Sie finden Ihre Projektnummer auf der Willkommensseite der Google Cloud Console oder durch Ausführen des folgenden Befehls:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Cloud Run-Job erstellen

In dieser Anleitung wird ein Beispiel für einen Cloud Run-Job von GitHub verwendet. Der Job liest Daten aus einer Eingabedatei in Cloud Storage und führt eine beliebige Verarbeitung für jede Zeile in der Datei aus.

  1. Rufen Sie den Beispielcode ab, indem Sie das Repository der Beispiel-App auf Ihren lokalen Computer klonen:

    git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

    Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.

  2. Wechseln Sie zu dem Verzeichnis, das den Beispielcode enthält:

    cd jobs-demos/parallel-processing
  3. Erstellen Sie einen Cloud Storage-Bucket zum Speichern einer Eingabedatei, in die geschrieben werden kann und die ein Ereignis auslöst:

    Console

    1. Wechseln Sie in der Cloud Console zur Seite Cloud Storage-Buckets.

      Buckets aufrufen

    2. Klicke auf Hinzufügen Erstellen.
    3. Geben Sie auf der Seite Bucket erstellen einen Namen für den Bucket ein:
      input-PROJECT_ID
      Ersetzen Sie PROJECT_ID durch die ID Ihres Google Cloud-Projekts.
    4. Behalten Sie die anderen Standardeinstellungen bei.
    5. Klicken Sie auf Erstellen.

    gcloud

    Führen Sie den Befehl gcloud storage buckets create aus:

    gcloud storage buckets create gs://input-PROJECT_ID

    Wenn die Anfrage erfolgreich ist, gibt der Befehl die folgende Meldung zurück:

    Creating gs://input-PROJECT_ID/...

    Terraform

    Verwenden Sie zum Erstellen eines Cloud Storage-Bucket die Ressource google_storage_bucket und ändern Sie die Datei main.tf wie im folgenden Beispiel gezeigt.

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

    In einem typischen Terraform-Workflow wird der gesamte Plan auf einmal angewendet. Für diese Anleitung können Sie jedoch eine bestimmte Ressource als Ziel festlegen. Beispiel:

    terraform apply -target="random_id.bucket_name_suffix"
    und
    terraform apply -target="google_storage_bucket.default"

    # Cloud Storage bucket names must be globally unique
    resource "random_id" "bucket_name_suffix" {
      byte_length = 4
    }
    
    # Create a Cloud Storage bucket
    resource "google_storage_bucket" "default" {
      name                        = "input-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
      location                    = "us-central1"
      storage_class               = "STANDARD"
      force_destroy               = false
      uniform_bucket_level_access = true
    }
  4. Erstellen Sie ein Artifact Registry-Standard-Repository, in dem Sie Ihr Container-Image speichern können:

    Console

    1. Rufen Sie in der Google Cloud Console die Seite Repositories der Artifact Registry auf:

      Zu Repositories

    2. Klicken Sie auf Repository erstellen.

    3. Geben Sie einen Namen für das Repository ein, z. B. my-repo. Repository-Namen können für jeden Repository-Speicherort in einem Projekt nur einmal vorkommen.

    4. Behalten Sie das Standardformat bei, das Docker sein sollte.

    5. Behalten Sie den Standardmodus bei, der Standard sein sollte.

    6. Wählen Sie als Region us-central1 (Iowa) aus.

    7. Behalten Sie alle anderen Standardeinstellungen bei.

    8. Klicken Sie auf Erstellen.

    gcloud

    Führen Sie diesen Befehl aus:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=us-central1

    Ersetzen Sie REPOSITORY durch einen eindeutigen Namen für das Repository, z. B. my-repo. Repository-Namen können für jeden Repository-Speicherort in einem Projekt nur einmal vorkommen.

    Terraform

    Verwenden Sie zum Erstellen eines Artifact Registry-Repositories die Ressource google_artifact_registry_repository und ändern Sie die Datei main.tf wie im folgenden Beispiel gezeigt.

    In einem typischen Terraform-Workflow wird der gesamte Plan auf einmal angewendet. Für diese Anleitung können Sie jedoch die Ausrichtung auf eine bestimmte Ressource festlegen. Beispiel:

    terraform apply -target="google_artifact_registry_repository.default"

    # Create an Artifact Registry repository
    resource "google_artifact_registry_repository" "default" {
      location      = "us-central1"
      repository_id = "my-repo"
      format        = "docker"
    }
  5. Erstellen Sie das Container-Image mit einem Standard-Buildpack von Google Cloud:

    export SERVICE_NAME=parallel-job
    gcloud builds submit \
        --pack image=us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}

    Ersetzen Sie dabei REPOSITORY durch den Namen Ihres Artifact Registry-Repositorys.

    Es kann einige Minuten dauern, bis der Build abgeschlossen ist.

  6. Erstellen Sie einen Cloud Run-Job, mit dem das Container-Image bereitgestellt wird:

    Console

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

      Zu Cloud Run

    2. Klicken Sie auf Job erstellen, um das Formular Job erstellen aufzurufen.

      1. Wählen Sie im Formular us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest als URL des Artifact Registry-Container-Images aus.
      2. Optional: Geben Sie als Jobnamen parallel-job ein.
      3. Optional: Wählen Sie als Region us-central1 (Iowa) aus.
      4. Geben Sie für die Anzahl der Aufgaben, die im Job ausgeführt werden sollen, 10 ein. Ein Job ist erst erfolgreich, wenn alle Aufgaben erfolgreich ausgeführt werden. Die Aufgaben werden standardmäßig parallel ausgeführt.
    3. Maximieren Sie den Abschnitt Container, Variablen und Secrets, Verbindungen, Sicherheit und behalten Sie alle Standardeinstellungen mit Ausnahme der folgenden bei:

      1. Klicken Sie auf den Tab Allgemein.

        1. Geben Sie für den Containerbefehl python ein.
        2. Geben Sie als Containerargument process.py ein.
      2. Klicken Sie auf den Tab Variablen und Secrets.

        1. Klicken Sie auf Variable hinzufügen und geben Sie INPUT_BUCKET für den Namen und input-PROJECT_ID für den Wert ein.
        2. Klicken Sie auf Variable hinzufügen und geben Sie INPUT_FILE für den Namen und input_file.txt für den Wert ein.
    4. Klicken Sie auf Erstellen, um den Job zu erstellen.

    gcloud

    1. Legen Sie die Standard-Cloud Run-Region fest:

      gcloud config set run/region us-central1
    2. Erstellen Sie den Cloud Run-Job:

      gcloud run jobs create parallel-job \
          --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest \
          --command python \
          --args process.py \
          --tasks 10 \
          --set-env-vars=INPUT_BUCKET=input-PROJECT_ID,INPUT_FILE=input_file.txt

      Wenn Sie kein Image-Tag angeben, sucht Artifact Registry nach dem Image mit dem Standard-Tag latest.

      Eine vollständige Liste der verfügbaren Optionen beim Erstellen eines Jobs finden Sie in der Dokumentation zur Befehlszeilenschnittstelle gcloud run jobs create.

      Sobald der Job erstellt wurde, sollte eine entsprechende Meldung angezeigt werden.

    Terraform

    Verwenden Sie zum Erstellen eines Cloud Run-Jobs die Ressource google_cloud_run_v2_job und ändern Sie die Datei main.tf wie im folgenden Beispiel gezeigt.

    In einem typischen Terraform-Workflow wird der gesamte Plan auf einmal angewendet. Für diese Anleitung können Sie jedoch die Ausrichtung auf eine bestimmte Ressource festlegen. Beispiel:

    terraform apply -target="google_cloud_run_v2_job.default"

    # Create a Cloud Run job
    resource "google_cloud_run_v2_job" "default" {
      name     = "parallel-job"
      location = "us-central1"
    
      template {
        task_count = 10
        template {
          containers {
            image   = "us-central1-docker.pkg.dev/${data.google_project.project.name}/${google_artifact_registry_repository.default.repository_id}/parallel-job:latest"
            command = ["python"]
            args    = ["process.py"]
            env {
              name  = "INPUT_BUCKET"
              value = google_storage_bucket.default.name
            }
            env {
              name  = "INPUT_FILE"
              value = "input_file.txt"
            }
          }
        }
      }
    }

Workflow bereitstellen, der den Cloud Run-Job ausführt

Definieren und implementieren Sie einen Workflow, der den gerade erstellten Cloud Run-Job ausführt. Eine Workflowdefinition besteht aus einer Reihe von Schritten, die mit der Workflows-Syntax beschrieben werden.

Console

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

    Zur Seite "Workflows"

  2. Klicken Sie auf Erstellen.

  3. Geben Sie einen Namen für den neuen Workflow ein, z. B. cloud-run-job-workflow.

  4. Wählen Sie als Region us-central1 (Iowa) aus.

  5. Wählen Sie im Feld Dienstkonto das zuvor erstellte Dienstkonto aus.

    Das Dienstkonto dient als Identität des Workflows. Sie sollten dem Dienstkonto bereits die Rolle Cloud Run-Administrator zugewiesen haben, damit der Workflow den Cloud Run-Job ausführen kann.

  6. Klicken Sie auf Weiter.

  7. Geben Sie im Workflow-Editor die Definition für Ihren Workflow ein:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  8. Klicken Sie auf Bereitstellen.

gcloud

  1. Erstellen Sie eine Quellcodedatei für Ihren Workflow:

    touch cloud-run-job-workflow.yaml
  2. Kopieren Sie die folgende Workflowdefinition in Ihre Quellcodedatei:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  3. Stellen Sie den Workflow bereit. Geben Sie hierzu den folgenden Befehl ein:

    gcloud workflows deploy cloud-run-job-workflow \
        --location=us-central1 \
        --source=cloud-run-job-workflow.yaml \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    Ersetzen Sie Folgendes:

    • SERVICE_ACCOUNT_NAME: Der Name des zuvor erstellten Dienstkontos.
    • PROJECT_ID: die ID Ihres Google Cloud-Projekts

    Das Dienstkonto dient als Identität des Workflows. Sie sollten dem Dienstkonto bereits die Rolle roles/run.admin zugewiesen haben, damit der Workflow den Cloud Run-Job ausführen kann.

Terraform

Verwenden Sie zum Erstellen eines Workflows die Ressource google_workflows_workflow und ändern Sie die Datei main.tf wie im folgenden Beispiel gezeigt.

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

In einem typischen Terraform-Workflow wird der gesamte Plan auf einmal angewendet. Für diese Anleitung können Sie jedoch eine bestimmte Ressource als Ziel festlegen. Beispiel:

terraform apply -target="google_workflows_workflow.default"

# Create a workflow
resource "google_workflows_workflow" "default" {
  name        = "cloud-run-job-workflow"
  region      = "us-central1"
  description = "Workflow that routes a Cloud Storage event and executes a Cloud Run job"

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
      params: [event]
      steps:
          - init:
              assign:
                  - project_id: $${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - event_bucket: $${event.data.bucket}
                  - event_file: $${event.data.name}
                  - target_bucket: "${google_storage_bucket.default.name}"
                  - job_name: parallel-job
                  - job_location: us-central1
          - check_input_file:
              switch:
                  - condition: $${event_bucket == target_bucket}
                    next: run_job
                  - condition: true
                    next: end
          - run_job:
              call: googleapis.run.v1.namespaces.jobs.run
              args:
                  name: $${"namespaces/" + project_id + "/jobs/" + job_name}
                  location: $${job_location}
                  body:
                      overrides:
                          containerOverrides:
                              env:
                                  - name: INPUT_BUCKET
                                    value: $${event_bucket}
                                  - name: INPUT_FILE
                                    value: $${event_file}
              result: job_execution
          - finish:
              return: $${job_execution}
  EOF
}

Der Workflow führt Folgendes aus:

  1. init-Schritt: Nimmt ein Cloud Storage-Ereignis als Argument entgegen und legt dann die erforderlichen Variablen fest.

  2. Schritt check_input_file: Prüft, ob der im Ereignis angegebene Cloud Storage-Bucket der Bucket ist, der vom Cloud Run-Job verwendet wird.

    • Wenn ja, fährt der Workflow mit Schritt run_job fort.
    • Andernfalls wird der Workflow beendet und die weitere Verarbeitung unterbrochen.
  3. Schritt run_job: Hier wird die googleapis.run.v1.namespaces.jobs.run-Methode des Cloud Run Admin API-Connectors verwendet, um den Job auszuführen. Die Namen des Cloud Storage-Bucket und der Datendatei werden als Überschreibungsvariablen vom Workflow an den Job übergeben.

  4. finish-Schritt: Gibt Informationen zur Jobausführung als Ergebnis des Workflows zurück.

Eventarc-Trigger für den Workflow erstellen

Wenn Sie den Workflow und damit den Cloud Run-Job automatisch ausführen möchten, sobald die Eingabedatendatei aktualisiert wird, erstellen Sie einen Eventarc-Trigger, der auf Cloud Storage-Ereignisse im Bucket reagiert, der die Eingabedatendatei enthält.

Console

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

    Zur Seite "Workflows"

  2. Klicken Sie auf den Namen Ihres Workflows, z. B. cloud-run-job-workflow.

  3. Klicken Sie auf der Seite Workflow-Details auf Bearbeiten.

  4. Klicken Sie auf der Seite Workflow bearbeiten im Bereich Trigger auf Neuen Trigger hinzufügen > Eventarc.

    Der Bereich Eventarc-Trigger wird geöffnet.

  5. Geben Sie im Feld Triggername einen Namen für den Trigger ein, z. B. cloud-run-job-workflow-trigger.

  6. Wählen Sie in der Liste Ereignisanbieter die Option Cloud Storage aus.

  7. Wählen Sie in der Liste Ereignis die Option google.cloud.storage.object.v1.finalized aus.

  8. Wählen Sie im Feld Bucket den Bucket mit der Eingabedatendatei aus. Der Bucket-Name hat das Format input-PROJECT_ID.

  9. Wählen Sie im Feld Dienstkonto das zuvor erstellte Dienstkonto aus.

    Das Dienstkonto dient als Identität des Triggers. Sie sollten dem Dienstkonto bereits die folgenden Rollen zugewiesen haben:

    • Eventarc-Ereignisempfänger: zum Empfangen von Ereignissen
    • Workflow-Aufrufer: zum Ausführen von Workflows
  10. Klicken Sie auf Trigger speichern.

    Der Eventarc-Trigger wird jetzt auf der Seite Workflow bearbeiten im Abschnitt Trigger angezeigt.

  11. Klicken Sie auf Weiter.

  12. Klicken Sie auf Bereitstellen.

gcloud

Erstellen Sie einen Eventarc-Trigger mit dem folgenden Befehl:

gcloud eventarc triggers create cloud-run-job-workflow-trigger \
    --location=us \
    --destination-workflow=cloud-run-job-workflow  \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=input-PROJECT_ID" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Ersetzen Sie Folgendes:

  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • SERVICE_ACCOUNT_NAME: Der Name des zuvor erstellten Dienstkontos.

Das Dienstkonto dient als Identität des Triggers. Sie sollten dem Dienstkonto bereits die folgenden Rollen zugewiesen haben:

  • roles/eventarc.eventReceiver: Ereignisse zu empfangen
  • roles/workflows.invoker: zum Ausführen von Workflows

Terraform

Verwenden Sie zum Erstellen eines Triggers die Ressource google_eventarc_trigger und ändern Sie die Datei main.tf wie im folgenden Beispiel gezeigt.

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

In einem typischen Terraform-Workflow wird der gesamte Plan auf einmal angewendet. Für diese Anleitung können Sie jedoch eine bestimmte Ressource als Ziel festlegen. Beispiel:

terraform apply -target="google_eventarc_trigger.default"

# Create an Eventarc trigger that routes Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "cloud-run-job-trigger"
  location = google_workflows_workflow.default.region

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Workflows
  destination {
    workflow = google_workflows_workflow.default.id
  }

  service_account = google_service_account.workflows.email

}

Jedes Mal, wenn eine Datei in den Cloud Storage-Bucket mit der Eingabedatendatei hochgeladen oder überschrieben wird, wird der Workflow mit dem entsprechenden Cloud Storage-Ereignis als Argument ausgeführt.

Workflow auslösen

Testen Sie das End-to-End-System, indem Sie die Eingabedatendatei in Cloud Storage aktualisieren.

  1. Generieren Sie neue Daten für die Eingabedatei und laden Sie sie an den vom Cloud Run-Job erwarteten Speicherort in Cloud Storage hoch:

    base64 /dev/urandom | head -c 100000 >input_file.txt
    gcloud storage cp input_file.txt gs://input-PROJECT_ID/input_file.txt

    Wenn Sie einen Cloud Storage-Bucket mit Terraform erstellt haben, können Sie den Namen des Buckets mit dem folgenden Befehl abrufen:

    gcloud storage buckets list gs://input*

    Die Ausführung des Cloud Run-Jobs kann einige Minuten dauern.

  2. Prüfen Sie, ob der Cloud Run-Job wie erwartet ausgeführt wurde, indem Sie sich die Jobausführungen ansehen:

    gcloud config set run/region us-central1
    gcloud run jobs executions list --job=parallel-job

    In der Ausgabe sollte eine erfolgreiche Jobausführung angezeigt werden, die angibt, dass 10/10 Aufgaben abgeschlossen wurden.

Weitere Informationen zum Auslösen eines Workflows mit Ereignissen oder Pub/Sub-Nachrichten

Bereinigen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Anleitungsressourcen löschen

Löschen Sie die in dieser Anleitung erstellten Ressourcen:

  1. Löschen Sie den Eventarc-Trigger:

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
  2. So löschen Sie den Workflow:

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
  3. Löschen Sie den Cloud Run-Job:

    gcloud run jobs delete parallel-job
  4. Löschen Sie den Cloud Storage-Bucket, der für die Eingabedaten erstellt wurde:

    gcloud storage rm --recursive gs://input-PROJECT_ID/
  5. Löschen Sie das Artifact Registry-Repository:

    gcloud artifacts repositories delete REPOSITORY --location=us-central1

Nächste Schritte