Executar um job do Cloud Run usando o Workflows


Com o Workflows, é 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 de eventos 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 for o caso, 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. Atualize um arquivo de dados de entrada no bucket do Cloud Storage para acionar o fluxo de trabalho.

Custos

Neste documento, você vai 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 de 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. Verify 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. Verify 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 publisher do Pub/Sub (roles/pubsub.publisher) ao agente de serviço do Cloud Storage:
    1. No console 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 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 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 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. 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 é compatível com os comandos /dev/urandom deste tutorial que geram números pseudorrandômicos.

    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 é compatível com os comandos /dev/urandom deste tutorial que geram números pseudorrandômicos.

    2. Crie ou selecione um Google Cloud projeto.
      • Crie um Google Cloud projeto:

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

        gcloud config set project PROJECT_ID
    3. Verifique se o faturamento foi ativado para o projeto 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 na autenticação com outros Google Cloud serviços 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 criada na etapa anterior. Execute o comando a seguir uma vez para cada um dos 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 seu projeto 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 é compatível com os comandos /dev/urandom deste tutorial que geram números pseudorrandômicos.

    2. Crie ou selecione um Google Cloud projeto.
      • Crie um Google Cloud projeto:

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

        gcloud config set project PROJECT_ID
    3. Verifique se o faturamento foi ativado para o projeto 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 na autenticação com outros Google Cloud serviços e conceda as funções adequadas. Além disso, para oferecer suporte a eventos diretos do Cloud Storage, conceda o papel de Publisher 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 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 seu projeto 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

Este tutorial usa um exemplo de job 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 do arquivo.

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

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

    Outra opção é fazer o download da amostra como um arquivo ZIP e extraí-la.

  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 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 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 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="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 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. Em 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 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 Google Cloud padrão:

    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 conclusão do build pode levar alguns minutos.

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

    Console

    1. No console 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: 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 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. 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 padrão latest.

      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.

      Quando o job for criado, você vai receber uma mensagem indicando que a operação foi concluída.

    Terraform

    Para criar um job do Cloud Run, use o recurso google_cloud_run_v2_job e modifique seu 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 executa 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 do Workflows.

Console

  1. No console 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. Em 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:

    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 o 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 antes
    • PROJECT_ID: o ID do seu projetoGoogle Cloud

    A conta de serviço serve como a identidade do fluxo de trabalho. Você já precisa 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 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_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"

  deletion_protection = false # set to "true" in production

  # 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 mesmo usado pelo job do Cloud Run.

    • Se a resposta for "sim", o fluxo de trabalho vai para a etapa run_job.
    • Se a resposta for não, o fluxo de trabalho será 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 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 gatilho do Eventarc que responda a eventos do Cloud Storage no bucket que contém o arquivo de dados de entrada.

Console

  1. No console 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 Gatilhos, clique em Adicionar novo gatilho > Eventarc.

    O painel Gatilho do Eventarc é aberto.

  5. No campo Nome do gatilho, insira um nome para o gatilho, 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 gatilho. Você já precisa ter concedido os seguintes papéis à conta de serviço:

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

    O gatilho 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

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 projeto 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á precisa 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 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_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 correspondente do Cloud Storage 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*

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

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

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

    Você vai 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. 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