Ejecuta un trabajo de Cloud Run con Workflows


Workflows te permiten ejecutar trabajos de Cloud Run como parte de un flujo de trabajo para realizar procesamientos de datos más complejos, o bien organizar un sistema de trabajos existentes.

En este instructivo, se muestra cómo usar Workflows para ejecutar un trabajo de Cloud Run que procesa datos que se pasaron como variables de entorno al trabajo en respuesta a un evento de Cloud Storage.

Ten en cuenta que también puedes almacenar los datos del evento en un bucket de Cloud Storage, lo que te permite encriptar los datos con claves de encriptación administradas por el cliente. Para obtener más información, consulta Ejecuta un trabajo de Cloud Run que procese datos de eventos guardados en Cloud Storage.

Objetivos

En este instructivo, realizarás las siguientes acciones:

  1. Crear un trabajo de Cloud Run que procese archivos de datos en un bucket de Cloud Storage
  2. Implementa un flujo de trabajo que haga lo siguiente:
    1. Acepta un evento de Cloud Storage como argumento.
    2. Comprueba si el bucket de Cloud Storage especificado en el evento es el mismo que usa el trabajo de Cloud Run.
    3. Si es así, usa el conector de la API de Cloud Run Admin para ejecutar el trabajo de Cloud Run.
  3. Crear un activador de Eventarc que ejecute el flujo de trabajo en respuesta a eventos que afecten al bucket de Cloud Storage
  4. Actualizar un archivo de datos de entrada en el bucket de Cloud Storage para activar el flujo de trabajo

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.

Console

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, y Workflows.

    Habilita las API

  5. Crear una cuenta de servicio:

    1. En la consola de Google Cloud, ve a la página Crear cuenta de servicio.

      Ve a Crear cuenta de servicio
    2. Elige tu proyecto.
    3. Ingresa un nombre en el campo Nombre de cuenta de servicio. La consola de Google Cloud completa el campo ID de cuenta de servicio en función de este nombre.

      Opcional: en el campo Descripción de la cuenta de servicio, ingresa una descripción. Por ejemplo, Service account for quickstart.

    4. Haz clic en Crear y continuar.
    5. Otorga los siguientes roles a la cuenta de servicio: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      Para otorgar un rol, busca la lista Selecciona un rol y, luego, selecciona el rol.

      Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.

    6. Haga clic en Continuar.
    7. Haz clic en Listo para terminar de crear la cuenta de servicio.

  6. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  7. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  8. Habilita las API de Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, y Workflows.

    Habilita las API

  9. Crear una cuenta de servicio:

    1. En la consola de Google Cloud, ve a la página Crear cuenta de servicio.

      Ve a Crear cuenta de servicio
    2. Elige tu proyecto.
    3. Ingresa un nombre en el campo Nombre de cuenta de servicio. La consola de Google Cloud completa el campo ID de cuenta de servicio en función de este nombre.

      Opcional: en el campo Descripción de la cuenta de servicio, ingresa una descripción. Por ejemplo, Service account for quickstart.

    4. Haz clic en Crear y continuar.
    5. Otorga los siguientes roles a la cuenta de servicio: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      Para otorgar un rol, busca la lista Selecciona un rol y, luego, selecciona el rol.

      Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.

    6. Haga clic en Continuar.
    7. Haz clic en Listo para terminar de crear la cuenta de servicio.

  10. Antes de crear un activador para eventos directos de Cloud Storage, otorga la función de publicador de Pub/Sub (roles/pubsub.publisher) al agente de servicio de Cloud Storage, una cuenta de servicio administrada por Google:
    1. En la consola de Google Cloud, ve a la página IAM.

      Ir a IAM

    2. Selecciona la casilla de verificación Incluir asignaciones de roles proporcionadas por Google.
    3. En la columna Principal, busca el agente de servicio de Cloud Storage con el formulario service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com y, luego, haz clic en Editar principal en la fila correspondiente.
    4. Haz clic en Agregar rol o Agregar otro rol.
    5. En la lista Selecciona un rol, filtra por Publicador de Pub/Sub y, luego, selecciona el rol.
    6. Haz clic en Guardar.
  11. Si habilitaste el agente de servicio de Cloud Pub/Sub el 8 de abril de 2021 o antes, para admitir las solicitudes push autenticadas de Pub/Sub, otorga la función de creador de tokens de cuentas de servicio (roles/iam.serviceAccountTokenCreator) a la cuenta de servicio administrada por Google. De lo contrario, esta función se otorga de forma predeterminada:
    1. En la consola de Google Cloud, ve a la página IAM.

      Ir a IAM

    2. Selecciona la casilla de verificación Incluir asignaciones de roles proporcionadas por Google.
    3. En la columna Nombre, busca la Cuenta de servicio de Cloud Pub/Sub y, luego, haz clic en Editar principal en la fila correspondiente.
    4. Haz clic en Agregar rol o Agregar otro rol.
    5. En la lista Selecciona un rol, filtra por Creador de tokens de cuenta de servicio y, luego, selecciona el rol.
    6. Haz clic en Guardar.
  12. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  13. En este instructivo, Cloud Shell es compatible con los comandos de /dev/urandom que generan números pseudoaleatorios.

gcloud

  1. Para usar una terminal en línea con gcloud CLI ya configurada, activa Cloud Shell:

    En la parte inferior de esta página, se inicia una sesión de Cloud Shell y se muestra una ventana emergente de línea de comandos. La sesión puede tardar unos segundos en inicializarse.

    Cloud Shell es compatible con los comandos de /dev/urandom en este instructivo que generan números pseudoaleatorios.

  2. Crea o selecciona un proyecto de Google Cloud.
    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID
    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID
  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
  4. Habilita las APIs de Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, y Workflows:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crea una cuenta de servicio para que tu flujo de trabajo la use en la autenticación con otros servicios de Google Cloud y otórgale las funciones adecuadas.
    1. Crea la cuenta de servicio:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      Reemplaza SERVICE_ACCOUNT_NAME por un nombre para la cuenta de servicio.

    2. Otorga roles a la cuenta de servicio administrada por el usuario que creaste en el paso anterior. Ejecuta el siguiente comando una vez para cada una de las siguientes funciones de IAM o puedes usar la marca --role varias veces en un solo comando:
      • roles/eventarc.eventReceiver: Para recibir eventos
      • roles/logging.logWriter: Para escribir registros
      • roles/run.admin: Para ejecutar el trabajo de Cloud Run
      • roles/workflows.invoker: Para invocar flujos de trabajo
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE
      

      Reemplaza lo siguiente:

      • PROJECT_ID: El ID del proyecto en el que creaste la cuenta de servicio
      • ROLE: Es la función que se otorgará a la cuenta de servicio administrada por el usuario.
  6. Antes de crear un activador para eventos directos desde Cloud Storage, otorga el Rol de publicador de Pub/Sub (roles/pubsub.publisher) al agente de servicio de Cloud Storage, una de servicio administrada por Google:

    SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    
  7. Si habilitaste el agente de servicio de Cloud Pub/Sub el 8 de abril de 2021 o antes de esa fecha, para admitir las solicitudes de envío de Pub/Sub autenticadas, otorga la función Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) a la cuenta de servicio administrada por Google. De lo contrario, este rol se otorga de forma predeterminada:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  8. Reemplaza PROJECT_NUMBER por el número de proyecto de Google Cloud. Para encontrar el número del proyecto, ve a la página de bienvenida de la consola de Google Cloud o ejecuta el siguiente comando:

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

Terraform

  1. Para usar una terminal en línea con gcloud CLI ya configurada, activa Cloud Shell:

    En la parte inferior de esta página, se inicia una sesión de Cloud Shell y se muestra una ventana emergente de línea de comandos. La sesión puede tardar unos segundos en inicializarse.

    Cloud Shell es compatible con los comandos de /dev/urandom en este instructivo que generan números pseudoaleatorios.

  2. Crea o selecciona un proyecto de Google Cloud.
    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID
    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID
  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
  4. Habilita las APIs de Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, y Workflows:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crea una cuenta de servicio para que tu flujo de trabajo la use en la autenticación con otros servicios de Google Cloud y otórgale las funciones adecuadas. Además, para admitir eventos directos de Cloud Storage, otorga la función de publicador de Pub/Sub (roles/pubsub.publisher) al agente de servicio de Cloud Storage, una cuenta de servicio administrada por Google.

    Modifica tu archivo main.tf como se muestra en el siguiente ejemplo. Para obtener más información, consulta la documentación del proveedor de Google para Terraform.

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    Ten en cuenta que, en un flujo de trabajo típico de Terraform, se aplica todo el plan a la vez. Sin embargo, a los fines de este instructivo, puedes apuntar a un recurso específico. Por ejemplo:

    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. Si habilitaste el agente de servicio de Cloud Pub/Sub el 8 de abril de 2021 o antes de esa fecha, para admitir las solicitudes de envío de Pub/Sub autenticadas, otorga la función Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) a la cuenta de servicio administrada por Google. De lo contrario, este rol se otorga de forma predeterminada:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  7. Reemplaza PROJECT_NUMBER por el número de proyecto de Google Cloud. Para encontrar el número del proyecto, ve a la página de bienvenida de la consola de Google Cloud o ejecuta el siguiente comando:

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

Crea un trabajo de Cloud Run

En este instructivo, se usa un trabajo de muestra de Cloud Run de GitHub. El trabajo lee los datos de un archivo de entrada en Cloud Storage y realiza un procesamiento arbitrario para cada línea del archivo.

  1. Clona el repositorio de la app de muestra en tu máquina local para obtener el código de muestra:

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

    De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.

  2. Dirígete al directorio que contiene el código de muestra:

    cd jobs-demos/parallel-processing
    
  3. Crea un bucket de Cloud Storage para almacenar un archivo de entrada en el que se pueda escribir y activar un evento:

    Console

    1. En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.

      Ir a Buckets

    2. Haz clic en Agregar Crear.
    3. En la página Crear un bucket, ingresa un nombre para tu bucket:
      input-PROJECT_ID
      Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.
    4. Mantén los otros valores predeterminados.
    5. Haz clic en Crear.

    gcloud

    Ejecuta el comando gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    Si la solicitud se realiza correctamente, el comando mostrará el siguiente mensaje:

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

    Terraform

    Para crear un bucket de Cloud Storage, usa el recurso google_storage_bucket y modifica tu archivo main.tf como se muestra en el siguiente ejemplo.

    Para aprender a aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

    Ten en cuenta que, en un flujo de trabajo típico de Terraform, puedes aplicar todo el plan a la vez. Sin embargo, a los fines de este instructivo, puedes orientarte a un recurso específico. Por ejemplo:

    terraform apply -target="random_id.bucket_name_suffix"
    y
    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. Crea un repositorio estándar de Artifact Registry en el que puedas almacenar la imagen de contenedor:

    Console

    1. En la consola de Google Cloud, ve a la página Repositorios de Artifact Registry:

      Ir a Repositorios

    2. Haz clic en Crear repositorio.

    3. Ingresa un nombre para el repositorio, por ejemplo, my-repo. Para la ubicación de cada repositorio en un proyecto, los nombres de los repositorios deben ser únicos.

    4. Conserva el formato predeterminado que debe ser Docker.

    5. Mantén el modo predeterminado, que debería ser Estándar.

    6. En la región, selecciona us-central1 (Iowa).

    7. Conserva todos los demás valores predeterminados.

    8. Haz clic en Crear.

    gcloud

    Ejecuta el siguiente comando:

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

    Reemplaza REPOSITORY por un nombre único para el repositorio, por ejemplo, my-repo. Para cada ubicación de repositorio de un proyecto, sus nombres deben ser únicos.

    Terraform

    Para crear un repositorio de Artifact Registry, usa el recurso google_artifact_registry_repository y modifica tu archivo main.tf como se muestra en el siguiente ejemplo.

    Ten en cuenta que, en un flujo de trabajo típico de Terraform, se aplica todo el plan a la vez. Sin embargo, a los fines de este instructivo, puedes apuntar a un recurso específico. Por ejemplo:

    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. Compila la imagen de contenedor con un paquete de compilación predeterminado de Google Cloud:

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

    Reemplaza REPOSITORY por el nombre de tu repositorio de Artifact Registry.

    Es posible que la compilación tarde algunos minutos en completarse.

  6. Crea un trabajo de Cloud Run que implemente la imagen de contenedor:

    Console

    1. En la consola de Google Cloud, ve a la página Cloud Run:

      Ir a Cloud Run

    2. Haz clic en Crear trabajo para mostrar el formulario Crear trabajo.

      1. En el formulario, selecciona us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest como la URL de la imagen de contenedor de Artifact Registry.
      2. Opcional: Para el nombre del trabajo, ingresa parallel-job.
      3. Opcional: Para la región, selecciona us-central1 (Iowa).
      4. Para la cantidad de tareas que deseas ejecutar en el trabajo, ingresa 10. Para que el trabajo tenga éxito, todas las tareas deben completarse correctamente. De forma predeterminada, las tareas se ejecutan en paralelo.
    3. Expande la sección Contenedores, variables y secretos, conexiones, seguridad y conserva todos los valores predeterminados, excepto la siguiente configuración:

      1. Haz clic en la pestaña General.

        1. En el comando del contenedor, ingresa python.
        2. Para el argumento del contenedor, ingresa process.py.
      2. Haz clic en la pestaña Variables y Secrets.

        1. Haz clic en Agregar variable y, luego, ingresa INPUT_BUCKET para el nombre y input-PROJECT_ID para el valor.
        2. Haz clic en Agregar variable y, luego, ingresa INPUT_FILE para el nombre y input_file.txt para el valor.
    4. Para crear el trabajo, haz clic en Crear.

    gcloud

    1. Ejecuta el siguiente comando:

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

      Para obtener una lista completa de las opciones disponibles cuando creas un trabajo, consulta la documentación de la línea de comandos gcloud run jobs create.

    2. Una vez que se haya creado el trabajo, deberías ver un mensaje que indica que se realizó de forma correcta.

    Terraform

    Para crear un trabajo de Cloud Run, usa el recurso google_cloud_run_v2_job y modifica tu archivo main.tf como se muestra en el siguiente ejemplo.

    Ten en cuenta que, en un flujo de trabajo típico de Terraform, se aplica todo el plan a la vez. Sin embargo, a los fines de este instructivo, puedes apuntar a un recurso específico. Por ejemplo:

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

Implementa un flujo de trabajo que ejecute el trabajo de Cloud Run

Define e implementa un flujo de trabajo que ejecute el trabajo de Cloud Run que acabas de crear. Una definición de flujo de trabajo se compone de una serie de pasos que se describen mediante la sintaxis de Workflows.

Console

  1. En la consola de Google Cloud, ve a la página Flujos de trabajo:

    Ir a Workflows

  2. Haz clic en Crear.

  3. Ingresa un nombre para el flujo de trabajo nuevo, como cloud-run-job-workflow.

  4. En la región, selecciona us-central1 (Iowa).

  5. En el campo Cuenta de servicio, selecciona la cuenta de servicio que creaste antes.

    La cuenta de servicio sirve como la identidad del flujo de trabajo. Ya deberías haber otorgado la función de administrador de Cloud Run a la cuenta de servicio para que el flujo de trabajo pueda ejecutar el trabajo de Cloud Run.

  6. Haz clic en Siguiente.

  7. En el editor de flujo de trabajo, ingresa la siguiente definición para tu flujo de trabajo:

    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. Haz clic en Implementar.

gcloud

  1. Crea un archivo de código fuente para tu flujo de trabajo:

    touch cloud-run-job-workflow.yaml
    
  2. Copia la siguiente definición de flujo de trabajo en tu archivo de código fuente:

    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. Para implementar el flujo de trabajo, ingresa el siguiente comando:

    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
    

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio que creaste antes.
    • PROJECT_ID por el ID del proyecto de Google Cloud

    La cuenta de servicio sirve como la identidad del flujo de trabajo. Ya deberías haber otorgado la función roles/run.admin a la cuenta de servicio para que el flujo de trabajo pueda ejecutar el trabajo de Cloud Run.

Terraform

Para crear un flujo de trabajo, usa el recurso google_workflows_workflow y modifica tu archivo main.tf como se muestra en el siguiente ejemplo.

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Ten en cuenta que, en un flujo de trabajo típico de Terraform, se aplica todo el plan de una sola vez. Sin embargo, a los fines de este instructivo, puedes apuntar a un recurso específico. Por ejemplo:

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
}

El flujo de trabajo hace lo siguiente:

  1. Paso init: acepta un evento de Cloud Storage como argumento y, luego, establece las variables necesarias.

  2. Paso check_input_file: Comprueba si el bucket de Cloud Storage especificado en el evento es el bucket que usa el trabajo de Cloud Run.

    • Si es así, el flujo de trabajo continúa con el paso run_job.
    • Si no es así, el flujo de trabajo finaliza y se detiene cualquier procesamiento posterior.
  3. Paso de run_job: Usa el método googleapis.run.v1.namespaces.jobs.run del conector de la API de Cloud Run Admin para ejecutar el trabajo. Los nombres de los archivos de datos y del bucket de Cloud Storage se pasan como variables de anulación del flujo de trabajo al trabajo.

  4. Paso finish: Muestra información sobre la ejecución del trabajo como resultado del flujo de trabajo.

Crea un activador de Eventarc para el flujo de trabajo

Para ejecutar automáticamente el flujo de trabajo y, a su vez, el trabajo de Cloud Run cada vez que se actualice el archivo de datos de entrada, crea un activador de Eventarc que responda a los eventos de Cloud Storage en el bucket que contiene el archivo de datos de entrada.

Console

  1. En la consola de Google Cloud, ve a la página Flujos de trabajo:

    Ir a Workflows

  2. Haz clic en el nombre de tu flujo de trabajo, como cloud-run-job-workflow.

  3. En la página Detalles del flujo de trabajo, haz clic en Editar.

  4. En la página Editar flujo de trabajo, en la sección Activadores, haz clic en Agregar activador nuevo > Eventarc.

    Se abrirá el panel Evento de Eventarc.

  5. En el campo Nombre del activador, ingresa un nombre para el activador, como cloud-run-job-workflow-trigger.

  6. En la lista Proveedor del evento, selecciona Cloud Storage.

  7. En la lista Evento, selecciona google.cloud.storage.object.v1.finalized.

  8. En el campo Bucket, selecciona el bucket que contiene el archivo de datos de entrada. El nombre del bucket tiene el formato input-PROJECT_ID.

  9. En el campo Cuenta de servicio, selecciona la cuenta de servicio que creaste antes.

    La cuenta de servicio funciona como la identidad del activador. Ya deberías haber otorgado los siguientes roles a la cuenta de servicio:

    • Receptor de eventos de Eventarc: Para recibir eventos
    • Invocador de flujos de trabajo: Se usa para ejecutar flujos de trabajo.
  10. Haz clic en Guardar activador.

    El activador de Eventarc ahora aparece en la sección Activadores de la página Editar flujo de trabajo.

  11. Haz clic en Siguiente.

  12. Haga clic en Implementar.

gcloud

Para crear un activador de Eventarc, ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • PROJECT_IDEl ID de tu proyecto de Google Cloud.
  • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio que creaste antes.

La cuenta de servicio funciona como la identidad del activador. Ya deberías haber otorgado los siguientes roles a la cuenta de servicio:

  • roles/eventarc.eventReceiver: Para recibir eventos
  • roles/workflows.invoker: Para ejecutar flujos de trabajo

Terraform

Para crear un activador, usa el recurso google_eventarc_trigger y modifica tu archivo main.tf como se muestra en el siguiente ejemplo.

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Ten en cuenta que, en un flujo de trabajo típico de Terraform, se aplica todo el plan de una sola vez. Sin embargo, a los fines de este instructivo, puedes apuntar a un recurso específico. Por ejemplo:

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

}

Cada vez que se sube o reemplaza un archivo en el bucket de Cloud Storage que contiene el archivo de datos de entrada, el flujo de trabajo se ejecuta con el evento de Cloud Storage correspondiente como argumento.

Activa el flujo de trabajo

Actualiza el archivo de datos de entrada en Cloud Storage para probar el sistema de extremo a extremo.

  1. Genera datos nuevos para el archivo de entrada y súbelo a Cloud Storage en la ubicación que espera el trabajo de Cloud Run:

    base64 /dev/urandom | head -c 100000 >input_file.txt
    gsutil cp input_file.txt gs://BUCKET_NAME/input_file.txt
    

    Reemplaza BUCKET_NAME por el nombre de tu depósito de Cloud Storage.

    Si creaste un bucket de Cloud Storage con Terraform, puedes recuperar el nombre del bucket mediante la ejecución del siguiente comando:

    gcloud storage buckets list gs://input*
    

    El trabajo de Cloud Run puede tardar unos minutos en ejecutarse.

  2. Para confirmar que el trabajo de Cloud Run se ejecutó como se esperaba, visualiza las ejecuciones del trabajo:

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

    Deberías ver una ejecución correcta del trabajo en el resultado que indica que se completaron las tareas 10/10.

Obtén más información sobre la activación de un flujo de trabajo con eventos o mensajes de Pub/Sub.

Limpia

Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y deseas conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Elimina recursos de instructivos

Borra los recursos que creaste en este instructivo:

  1. Borrar el activador de Eventarc:

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
    
  2. Borra el flujo de trabajo:

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
    
  3. Borra el trabajo de Cloud Run:

    gcloud run jobs delete parallel-job
    
  4. Borra el bucket de Cloud Storage creado para los datos de entrada:

    gcloud storage rm --recursive gs://input-PROJECT_ID/
    
  5. Borra el repositorio de Artifact Registry:

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

¿Qué sigue?