Executar um job do Cloud Run usando o Workflows


Workflows permitem executar jobs do Cloud Run como parte de um fluxo de trabalho para realizar processamentos de dados mais complexos ou orquestrar um sistema de jobs atuais.

Este tutorial demonstra como usar Workflows para executar um job do Cloud Run que processa dados transmitidos como variáveis de ambiente para o job em resposta a um evento do Cloud Storage.

Você também pode armazenar os dados do evento em um bucket do Cloud Storage, o que permite criptografar os dados usando chaves de criptografia gerenciadas pelo cliente. Para mais informações, consulte Executar um job do Cloud Run que processa dados de eventos salvos no Cloud Storage.

Objetivos

Neste tutorial, você aprenderá a:

  1. Crie um job do Cloud Run que processe arquivos de dados em um bucket do Cloud Storage.
  2. Implante um fluxo de trabalho que faça o seguinte:
    1. Aceita um evento do Cloud Storage como argumento.
    2. Verifica se o bucket do Cloud Storage especificado no evento é o mesmo usado pelo job do Cloud Run.
    3. Se sim, use o conector da API Cloud Run Admin para executar o job do Cloud Run.
  3. Crie um gatilho do Eventarc que execute o fluxo de trabalho em resposta a eventos que afetam o bucket do Cloud Storage.
  4. Ative o fluxo de trabalho atualizando um arquivo de dados de entrada no bucket do Cloud Storage.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito do Google Cloud.

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. Antes de criar um gatilho para eventos diretos do Cloud Storage, conceda o papel de editor do Pub/Sub (roles/pubsub.publisher) ao agente de serviço do Cloud Storage:
    1. No console do Google Cloud, acesse a página IAM.

      Acessar IAM

    2. Marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google.
    3. Na coluna Principal, encontre o agente de serviço do Cloud Storage com o formulário service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com e clique em Editar principal na linha correspondente.
    4. Clique em Adicionar função ou Adicionar outra função.
    5. Na lista Selecionar um papel, filtre por Editor do Pub/Sub e selecione o papel.
    6. Clique em Salvar.
  11. Se você ativou o agente de serviço do Cloud Pub/Sub até 8 de abril de 2021, para oferecer suporte a solicitações push autenticadas do Pub/Sub, conceda o papel de Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) ao agente de serviço. Caso contrário, esse papel é concedido por padrão:
    1. No console do Google Cloud, acesse a página IAM.

      Acessar IAM

    2. Marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google.
    3. Na coluna Nome, encontre a conta de serviço do Cloud Pub/Sub e clique em Editar principal na linha correspondente.
    4. Clique em Adicionar função ou Adicionar outra função.
    5. Na lista Selecionar um papel, filtre por Criador de token de conta de serviço e selecione o papel.
    6. Clique em Salvar.
  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. O Cloud Shell oferece suporte aos comandos /dev/urandom neste tutorial que geram números pseudoaleatórios.

gcloud

  1. Para usar um terminal on-line com a CLI gcloud já configurada, ative o Cloud Shell:

    Na parte de baixo desta página, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. A inicialização da sessão pode levar alguns segundos.

    O Cloud Shell oferece suporte aos comandos /dev/urandom neste tutorial que geram números pseudoaleatórios.

  2. Criar ou selecionar um projeto do Google Cloud.
    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID
    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID
  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
  4. Ative as APIs Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows :
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crie uma conta de serviço para que seu fluxo de trabalho use para autenticação com outros serviços do Google Cloud e conceda as funções adequadas.
    1. Crie a conta de serviço:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Substitua SERVICE_ACCOUNT_NAME por um nome para a conta de serviço.

    2. Conceda papéis à conta de serviço gerenciado pelo usuário que você criou na etapa anterior. Execute o comando a seguir uma vez para cada um dos seguintes papéis do IAM ou use a flag --role várias vezes em um único comando:
      • roles/eventarc.eventReceiver: para receber eventos
      • roles/logging.logWriter: para gravar registros
      • roles/run.admin: para executar o job do Cloud Run
      • roles/workflows.invoker: para invocar fluxos de trabalho
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE

      Substitua:

      • PROJECT_ID: o ID do projeto em que você criou a conta de serviço
      • ROLE: o papel a ser concedido à conta de serviço gerenciada pelo usuário
  6. Antes de criar um gatilho para eventos diretos do Cloud Storage, conceda o papel de publisher do Pub/Sub (roles/pubsub.publisher) ao agente de serviço do Cloud Storage:

    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. Se você ativou o agente de serviço do Cloud Pub/Sub até 8 de abril de 2021, para oferecer compatibilidade com solicitações push autenticadas do Pub/Sub, conceda o papel de Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) ao agente de serviço. Caso contrário, esse papel é concedido por padrão:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  8. Substitua PROJECT_NUMBER pelo número do projeto do Google Cloud. Encontre o número do projeto na página Boas-vindas do console do Google Cloud ou executando o seguinte comando:

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

Terraform

  1. Para usar um terminal on-line com a CLI gcloud já configurada, ative o Cloud Shell:

    Na parte de baixo desta página, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. A inicialização da sessão pode levar alguns segundos.

    O Cloud Shell oferece suporte aos comandos /dev/urandom neste tutorial que geram números pseudoaleatórios.

  2. Criar ou selecionar um projeto do Google Cloud.
    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID
    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID
  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
  4. Ative as APIs Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows :
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crie uma conta de serviço para que seu fluxo de trabalho use para autenticação com outros serviços do Google Cloud e conceda as funções adequadas. Além disso, para oferecer suporte a eventos diretos do Cloud Storage, conceda o papel de Editor do Pub/Sub (roles/pubsub.publisher) ao agente de serviço do Cloud Storage.

    Modifique o arquivo main.tf, conforme mostrado no exemplo a seguir. Para mais informações, consulte a documentação do provedor do Google para o Terraform.

    Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

    Em um fluxo de trabalho típico do Terraform, você aplica todo o plano de uma só vez. No entanto, para os fins deste tutorial, você pode segmentar um recurso específico. Exemplo:

    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. Se você ativou o agente de serviço do Cloud Pub/Sub até 8 de abril de 2021, para oferecer compatibilidade com solicitações push autenticadas do Pub/Sub, conceda o papel de Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) ao agente de serviço. Caso contrário, esse papel é concedido por padrão:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  7. Substitua PROJECT_NUMBER pelo número do projeto do Google Cloud. Encontre o número do projeto na página Boas-vindas do console do Google Cloud ou executando o seguinte comando:

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

Criar um job do Cloud Run

Neste tutorial, usamos um job de exemplo do Cloud Run do GitHub. O job lê dados de um arquivo de entrada no Cloud Storage e realiza algum processamento arbitrário para cada linha no arquivo.

  1. Clone o repositório do app de exemplo na máquina local para conferir o código de amostra:

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

    Outra opção é fazer o download do exemplo como um arquivo ZIP e extraí-lo.

  2. Acesse o diretório que contém o exemplo de código:

    cd jobs-demos/parallel-processing
  3. Crie um bucket do Cloud Storage para armazenar um arquivo de entrada que possa ser gravado e acionar um evento:

    Console

    1. No Console do Google Cloud, acesse a página Buckets do Cloud Storage.

      Acessar buckets

    2. Clique em add Create.
    3. Na página Criar um bucket, insira um nome para o bucket:
      input-PROJECT_ID
      Substitua PROJECT_ID pelo ID do seu projeto do Google Cloud.
    4. Mantenha os outros padrões.
    5. Clique em Criar.

    gcloud

    Execute o comando gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    Se a solicitação for bem-sucedida, o comando retornará a seguinte mensagem:

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

    Terraform

    Para criar um bucket do Cloud Storage, use o recurso google_storage_bucket e modifique o arquivo main.tf, conforme mostrado no exemplo a seguir.

    Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

    Em um fluxo de trabalho típico do Terraform, você aplica o plano inteiro de uma vez. No entanto, para os fins deste tutorial, você pode segmentar um recurso específico. Exemplo:

    terraform apply -target="random_id.bucket_name_suffix"
    e
    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. Crie um repositório padrão do Artifact Registry para armazenar a imagem do contêiner:

    Console

    1. No console do Google Cloud, acesse a página Repositórios do Artifact Registry:

      Acessar repositórios

    2. Clique em Criar repositório.

    3. Insira um nome para o repositório, por exemplo, my-repo. Para cada local de repositório em um projeto, os nomes dos repositórios precisam ser exclusivos.

    4. Mantenha o formato padrão, que deve ser Docker.

    5. Mantenha o modo padrão, que deve ser Padrão.

    6. Na região, selecione us-central1 (Iowa).

    7. Mantenha todas as outras configurações padrão.

    8. Clique em Criar.

    gcloud

    Execute o comando:

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

    Substitua REPOSITORY por um nome exclusivo para o repositório, por exemplo, my-repo. Para cada local de repositório em um projeto, os nomes dos repositórios precisam ser exclusivos.

    Terraform

    Para criar um repositório do Artifact Registry, use o recurso google_artifact_registry_repository e modifique o arquivo main.tf, conforme mostrado no exemplo a seguir.

    Em um fluxo de trabalho típico do Terraform, você aplica todo o plano de uma só vez. No entanto, para os fins deste tutorial, você pode segmentar um recurso específico. Exemplo:

    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. Crie a imagem do contêiner usando um buildpack padrão do Google Cloud:

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

    Substitua REPOSITORY pelo nome do repositório do Artifact Registry.

    A compilação pode levar alguns minutos.

  6. Crie um job do Cloud Run que implante a imagem do contêiner:

    Console

    1. No console do Google Cloud, acesse a página do Cloud Run:

      Acesse o Cloud Run

    2. Clique em Criar job para mostrar o formulário Criar job.

      1. No formulário, selecione us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest como o URL da imagem do contêiner do Artifact Registry.
      2. Opcional: para o nome do job, insira parallel-job.
      3. Opcional: para a região, selecione us-central1 (Iowa).
      4. Para o número de tarefas que você quer executar no job, digite 10. Todas as tarefas precisam ser bem-sucedidas para que o job seja concluído. Por padrão, as tarefas são executadas em paralelo.
    3. Expanda a seção Contêiner, variáveis e secrets, conexões e segurança e mantenha todas as configurações padrão, exceto as seguintes configurações:

      1. Clique na guia Geral.

        1. Para o comando do contêiner, insira python.
        2. Para o argumento do contêiner, insira process.py.
      2. Clique na guia Variáveis e secrets.

        1. Clique em Adicionar variável e insira INPUT_BUCKET para o nome e input-PROJECT_ID para o valor.
        2. Clique em Adicionar variável e insira INPUT_FILE para o nome e input_file.txt para o valor.
    4. Para criar o job, clique em Criar.

    gcloud

    1. Defina a região padrão do Cloud Run:

      gcloud config set run/region us-central1
    2. Crie o job do Cloud Run:

      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

      Se você não especificar uma tag de imagem, o Artifact Registry procurará a imagem com a tag latest padrão.

      Para conferir uma lista completa das opções disponíveis ao criar um job, consulte a documentação da linha de comando gcloud run jobs create.

      Depois que o job for criado, você vai receber uma mensagem indicando sucesso.

    Terraform

    Para criar um job do Cloud Run, use o recurso google_cloud_run_v2_job e modifique o arquivo main.tf, conforme mostrado no exemplo a seguir.

    Em um fluxo de trabalho típico do Terraform, você aplica todo o plano de uma só vez. No entanto, para os fins deste tutorial, você pode segmentar um recurso específico. Exemplo:

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

Implantar um fluxo de trabalho que execute o job do Cloud Run

Defina e implante um fluxo de trabalho que execute o job do Cloud Run que você acabou de criar. Uma definição de fluxo de trabalho é composta por uma série de etapas descritas usando a sintaxe dos fluxos de trabalho.

Console

  1. No console do Google Cloud, acesse a página Fluxos de trabalho:

    Acessar fluxos de trabalho

  2. Clique em Criar.

  3. Insira um nome para o novo fluxo de trabalho, como cloud-run-job-workflow.

  4. Na região, selecione us-central1 (Iowa).

  5. No campo Conta de serviço, selecione a conta de serviço que você criou anteriormente.

    A conta de serviço serve como a identidade do fluxo de trabalho. Você já deve ter concedido o papel Administrador do Cloud Run à conta de serviço para que o fluxo de trabalho possa executar o job do Cloud Run.

  6. Clique em Próxima.

  7. No editor de fluxo de trabalho, insira a seguinte definição para seu fluxo de trabalho:

    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. Clique em Implantar.

gcloud

  1. Crie um arquivo de código-fonte para seu fluxo de trabalho:

    touch cloud-run-job-workflow.yaml
  2. Copie a seguinte definição de fluxo de trabalho para o arquivo de código-fonte:

    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. Implante o fluxo de trabalho digitando o seguinte 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

    Substitua:

    • SERVICE_ACCOUNT_NAME: o nome da conta de serviço que você criou anteriormente
    • PROJECT_ID: o ID do seu projeto do Google Cloud

    A conta de serviço serve como a identidade do fluxo de trabalho. Você já deve ter concedido o papel roles/run.admin à conta de serviço para que o fluxo de trabalho possa executar o job do Cloud Run.

Terraform

Para criar um fluxo de trabalho, use o recurso google_workflows_workflow e modifique o arquivo main.tf, conforme mostrado no exemplo a seguir.

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Em um fluxo de trabalho típico do Terraform, você aplica o plano inteiro de uma vez. No entanto, para os fins deste tutorial, você pode segmentar um recurso específico. Exemplo:

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
}

O fluxo de trabalho faz o seguinte:

  1. Etapa init: aceita um evento do Cloud Storage como um argumento e define as variáveis necessárias.

  2. Etapa check_input_file: verifica se o bucket do Cloud Storage especificado no evento é o bucket usado pelo job do Cloud Run.

    • Se a resposta for "sim", o fluxo de trabalho vai prosseguir para a etapa run_job.
    • Caso contrário, o fluxo de trabalho é encerrado, interrompendo qualquer processamento adicional.
  3. Etapa run_job: usa o método googleapis.run.v1.namespaces.jobs.run do conector da API Cloud Run Admin para executar o job. Os nomes do bucket do Cloud Storage e do arquivo de dados são transmitidos como variáveis de substituição do fluxo de trabalho para o job.

  4. Etapa finish: retorna informações sobre a execução do job como resultado do fluxo de trabalho.

Criar um gatilho do Eventarc para o fluxo de trabalho

Para executar automaticamente o fluxo de trabalho e, por sua vez, o job do Cloud Run sempre que o arquivo de dados de entrada for atualizado, crie um acionador do Eventarc que responda aos eventos do Cloud Storage no bucket que contém o arquivo de dados de entrada.

Console

  1. No console do Google Cloud, acesse a página Fluxos de trabalho:

    Acessar fluxos de trabalho

  2. Clique no nome do fluxo de trabalho, como cloud-run-job-workflow.

  3. Na página Detalhes do fluxo de trabalho, clique em Editar.

  4. Na página Editar fluxo de trabalho, na seção Gatilho, clique em Adicionar novo gatilho > Eventarc.

    O painel Gatilho do Eventarc é aberto.

  5. No campo Nome do acionador, insira um nome para o acionador, como cloud-run-job-workflow-trigger.

  6. Na lista Provedor de eventos, selecione Cloud Storage.

  7. Na lista Evento, selecione google.cloud.storage.object.v1.finalized.

  8. No campo Bucket, selecione o bucket que contém o arquivo de dados de entrada. O nome do bucket tem o formato input-PROJECT_ID.

  9. No campo Conta de serviço, selecione a conta de serviço que você criou anteriormente.

    A conta de serviço serve como a identidade do acionador. Você já deve ter concedido os seguintes papéis à conta de serviço:

    • Destinatário de eventos do Eventarc: para receber eventos.
    • Chamador do Workflows: para executar fluxos de trabalho.
  10. Clique em Salvar acionador.

    O acionador do Eventarc agora aparece na seção Gatilhos da página Editar fluxo de trabalho.

  11. Clique em Próxima.

  12. Clique em Implantar.

gcloud

Para criar um gatilho do Eventarc, execute o seguinte 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

Substitua:

  • PROJECT_ID: o ID do seu projeto do Google Cloud;
  • SERVICE_ACCOUNT_NAME: o nome da conta de serviço que você criou anteriormente.

A conta de serviço serve como a identidade do acionador. Você já deve ter concedido os seguintes papéis à conta de serviço:

  • roles/eventarc.eventReceiver: para receber eventos
  • roles/workflows.invoker: para executar fluxos de trabalho

Terraform

Para criar um acionador, use o recurso google_eventarc_trigger e modifique o arquivo main.tf, conforme mostrado no exemplo a seguir.

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Em um fluxo de trabalho típico do Terraform, você aplica o plano inteiro de uma vez. No entanto, para os fins deste tutorial, você pode segmentar um recurso específico. Exemplo:

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

}

Sempre que um arquivo é enviado ou substituído no bucket do Cloud Storage que contém o arquivo de dados de entrada, o fluxo de trabalho é executado com o evento do Cloud Storage correspondente como um argumento.

Acione o fluxo de trabalho

Teste o sistema de ponta a ponta atualizando o arquivo de dados de entrada no Cloud Storage.

  1. Gere novos dados para o arquivo de entrada e faça upload deles para o Cloud Storage no local esperado pelo job do Cloud Run:

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

    Se você criou um bucket do Cloud Storage usando o Terraform, é possível recuperar o nome do bucket executando o seguinte comando:

    gcloud storage buckets list gs://input*

    A execução do job do Cloud Run pode levar alguns minutos.

  2. Confirme se o job do Cloud Run foi executado conforme o esperado, conferindo as execuções do job:

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

    Você vai encontrar uma execução de job bem-sucedida na saída, indicando que as tarefas 10/10 foram concluídas.

Saiba mais sobre como acionar um fluxo de trabalho com eventos ou mensagens do Pub/Sub.

Limpar

Se você criou um novo projeto para este tutorial, exclua o projeto. Se você usou um projeto atual e quer mantê-lo sem as alterações incluídas neste tutorial, exclua os recursos criados para o tutorial.

Exclua o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto:

  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.

Excluir recursos do tutorial

Exclua os recursos criados neste tutorial:

  1. Exclua o gatilho do Eventarc:

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
  2. Exclua o fluxo de trabalho:

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
  3. Exclua o job do Cloud Run:

    gcloud run jobs delete parallel-job
  4. Exclua o bucket do Cloud Storage criado para os dados de entrada:

    gcloud storage rm --recursive gs://input-PROJECT_ID/
  5. Exclua o repositório do Artifact Registry:

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

A seguir