Executar um job do Cloud Run usando o Workflows


Workflows ele, é possível 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.

Neste tutorial, mostramos como usar o 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.

Também é possível 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 processe dados de eventos salvos no Cloud Storage.

Objetivos

Neste tutorial, você aprenderá a:

  1. Criar 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. Nesse caso, use o conector da API Cloud Run Admin para executar o job do Cloud Run.
  3. Criar um gatilho do Eventarc que execute o fluxo de trabalho em resposta a eventos que afetam o bucket do Cloud Storage.
  4. Acionar 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. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  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 e Workflows.

    Ative as APIs

  5. Crie uma conta de serviço:

    1. No Console do Google Cloud, acesse a página Criar conta de serviço.

      Acesse "Criar conta de serviço"
    2. Selecione o projeto.
    3. No campo Nome da conta de serviço, insira um nome. O Console do Google Cloud preenche o campo ID da conta de serviço com base nesse nome.

      No campo Descrição da conta de serviço, insira uma descrição. Por exemplo, Service account for quickstart.

    4. Clique em Criar e continuar.
    5. Conceda os papéis a seguir à conta de serviço: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker

      Para conceder um papel, encontre a lista Selecionar um papel e escolha uma opção.

      Para conceder outros papéis, clique em Adicionar outro papel e adicione cada papel adicional.

    6. Clique em Continuar.
    7. Clique em Concluído para terminar a criação da conta de serviço.

  6. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  7. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  8. Ative as APIs Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc e Workflows.

    Ative as APIs

  9. Crie uma conta de serviço:

    1. No Console do Google Cloud, acesse a página Criar conta de serviço.

      Acesse "Criar conta de serviço"
    2. Selecione o projeto.
    3. No campo Nome da conta de serviço, insira um nome. O Console do Google Cloud preenche o campo ID da conta de serviço com base nesse nome.

      No campo Descrição da conta de serviço, insira uma descrição. Por exemplo, Service account for quickstart.

    4. Clique em Criar e continuar.
    5. Conceda os papéis a seguir à conta de serviço: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker

      Para conceder um papel, encontre a lista Selecionar um papel e escolha uma opção.

      Para conceder outros papéis, clique em Adicionar outro papel e adicione cada papel adicional.

    6. Clique em Continuar.
    7. Clique em Concluído para terminar a criação da conta de serviço.

  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, uma conta serviço gerenciado pelo Google:
    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 formato service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com e clique em Editar principal na linha correspondente.
    4. Clique em Adicionar papel ou Adicionar outro papel.
    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 dar suporte a solicitações de push autenticadas do Pub/Sub, conceda o papel Criador de token de conta de serviço (roles/iam.serviceAccountTokenCreator) à conta de serviço gerenciado pelo Google. Caso contrário, esse papel será 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 papel ou Adicionar outro papel.
    5. Na lista Selecionar papel, filtre por Criador de token de conta de serviço e selecione o papel.
    6. Clique em Salvar.
  12. No Console do Google Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte inferior do Console do Google Cloud, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.

  13. Neste tutorial, o Cloud Shell é compatível com os comandos /dev/urandom 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 inferior da 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.

    Neste tutorial, o Cloud Shell é compatível com os comandos /dev/urandom 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 e 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 seu fluxo de trabalho usar para autenticação com outros serviços do Google Cloud e conceda os papéis apropriados.
    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 sinalização --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 Editor do Pub/Sub (roles/pubsub.publisher) ao agente de serviço do Cloud Storage, um conta de serviço gerenciada:

    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. 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 Criador de token da conta de serviço. (roles/iam.serviceAccountTokenCreator) à conta de serviço gerenciada pelo Google. 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 inferior da 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.

    Neste tutorial, o Cloud Shell é compatível com os comandos /dev/urandom 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 e 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 seu fluxo de trabalho usar para autenticação com outros serviços do Google Cloud e conceda os papéis apropriados. Além disso, para dar suporte a eventos diretos do Cloud Storage, conceda o papel Editor do Pub/Sub (roles/pubsub.publisher) ao agente de serviço do Cloud Storage, uma conta serviço gerenciado pelo Google.

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

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

    Em um fluxo de trabalho comum do Terraform, você aplica o plano inteiro de uma só vez. No entanto, para os fins deste tutorial, é possível 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 suporte a solicitações push autenticadas do Pub/Sub, conceda o papel Criador de token da conta de serviço. (roles/iam.serviceAccountTokenCreator) à conta de serviço gerenciada pelo Google. 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 executa um processamento arbitrário para cada linha no arquivo.

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

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

    Se preferir, faça o download da amostra como um arquivo ZIP e extraia-o.

  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 Criar.
    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 comum do Terraform, você aplica o plano inteiro de uma só vez. No entanto, para os fins deste tutorial, é possível 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. Digite 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 deveria ser Docker.

    5. Mantenha o modo padrão, que precisa ser Standard.

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

    7. Mantenha todos os outros padrões.

    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 comum do Terraform, você aplica o plano inteiro de uma só vez. No entanto, para os fins deste tutorial, é possível 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 criaçã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 exibir 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: no nome do job, insira parallel-job.
      3. Opcional: como região, selecione us-central1 (Iowa).
      4. Para o número de tarefas que você quer executar no job, insira 10. Todas as tarefas precisam ser bem-sucedidas para que o job seja bem-sucedido. Por padrão, as tarefas são executadas em paralelo.
    3. Expanda a seção Contêiner, variáveis e secrets, conexões, segurança e mantenha todos os padrões, 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. Execute o 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 ver uma lista completa das opções disponíveis ao criar um job, consulte a documentação da linha de comando gcloud run jobs create.

    2. Depois que o job for criado, você verá uma mensagem indicando que o processo foi concluído.

    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 comum do Terraform, você aplica o plano inteiro de uma só vez. No entanto, para os fins deste tutorial, é possível 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 de 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. Para a região, selecione us-central1 (Iowa).

  5. No campo Conta de serviço, selecione a conta de serviço criada anteriormente.

    A conta de serviço serve como a identidade do fluxo de trabalho. É necessário já 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. Selecione 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 seu 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 projeto do Google Cloud.

    A conta de serviço serve como a identidade do fluxo de trabalho. É necessário já 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 abaixo.

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

Em um fluxo de trabalho comum do Terraform, você aplica o plano inteiro de uma vez. No entanto, para os fins deste tutorial, é possível 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 argumento e define as variáveis necessárias.

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

    • Em caso afirmativo, o fluxo de trabalho segue para a etapa run_job.
    • Em caso negativo, o fluxo de trabalho é encerrado, interrompendo qualquer outro processamento.
  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 dos arquivos de dados e do bucket do Cloud Storage 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 o fluxo de trabalho automaticamente 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 a 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 seu 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 Gatilhos, clique em Adicionar novo gatilho > Eventarc.

    O painel Gatilho do Eventarc é aberto.

  5. No campo Nome do gatilho, insira um nome, 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 criada anteriormente.

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

    • Receptor de eventos do Eventarc: para receber eventos
    • Invocador de fluxos de trabalho: para executar fluxos de trabalho
  10. Clique em Salvar acionador.

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

  11. Clique em Próxima.

  12. Clique em Implantar.

gcloud

Crie um gatilho do Eventarc executando 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 gatilho. 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 gatilho, 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 comum do Terraform, você aplica o plano inteiro de uma vez. No entanto, para os fins deste tutorial, é possível 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
    gsutil cp input_file.txt gs://BUCKET_NAME/input_file.txt
    

    Substitua BUCKET_NAME pelo nome do bucket do seu Cloud Storage.

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

    gcloud storage buckets list gs://input*
    

    O job do Cloud Run pode levar alguns minutos para ser executado.

  2. Visualize as execuções do job para confirmar se ele foi executado conforme o esperado:

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

    Você verá 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. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

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