Executar um job do Cloud Run usando o Workflows


O Workflows permite que você execute 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, demonstramos como usar o Workflows para executar uma Job do Cloud Run que processa dados transmitidos como ambiente variáveis para o job em resposta a um evento do Cloud Storage.

Também é possível armazenar os dados do evento em um 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. Criar um job do Cloud Run que processe arquivos de dados em um do 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 bucket 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. Acione o fluxo de trabalho atualizando um arquivo de dados de entrada no do 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, and Workflows.

    Ative as 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. 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, and Workflows.

    Ative as 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 no Cloud Storage, conceder Pub/Sub papel de Editor (roles/pubsub.publisher) do Agente de serviço do Cloud Storage:
    1. No console do Google Cloud, acesse IAM.

      Acessar IAM

    2. Marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google.
    3. Na coluna Principal, localize o Cloud Storage Agente de serviço 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 a de rede.
    6. Clique em Salvar.
  11. Se você ativou o agente de serviço do Cloud Pub/Sub na antes de 8 de abril de 2021, para aceitar push do Pub/Sub autenticado solicitações, conceda Serviço Papel Criador de token da conta (roles/iam.serviceAccountTokenCreator) ao agente de serviço. Caso contrário, o papel é concedido por padrão:
    1. No console do Google Cloud, acesse IAM.

      Acessar IAM

    2. Marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google.
    3. Na coluna Nome, encontre o 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 um papel, filtre por: Criador de token de conta de serviço e, em seguida, 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. O Cloud Shell oferece suporte aos comandos /dev/urandom em neste tutorial para gerar números pseudoaleatórios.

gcloud

  1. Para usar um terminal on-line com a CLI gcloud já configure o Cloud Shell, 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 em neste tutorial para gerar 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 Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crie uma conta de serviço para seu fluxo de trabalho usar na autenticação a outros serviços do Google Cloud e conceder a ela 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 etapa anterior. Execute o seguinte comando uma vez para cada um dos seguintes papéis do IAM ou 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 Cloud Run. vaga
      • 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 ao projeto gerenciado pelo usuário. conta de serviço
      .
  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á configure o Cloud Shell, 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 em neste tutorial para gerar 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 Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crie uma conta de serviço para seu fluxo de trabalho usar na autenticação a outros serviços do Google Cloud e conceder a ela os papéis apropriados. Além disso, para oferecer suporte a eventos diretos do Cloud Storage, conceda o papel Pub/Sub Editor (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 comum do Terraform, você aplica todo o plano uma vez. No entanto, para os fins deste tutorial, é possível direcionar 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 exemplo de job do Cloud Run no GitHub. A tarefa lê dados de um arquivo de entrada no Cloud Storage e realiza algumas o processamento arbitrário para cada linha do arquivo.

  1. Clone o repositório do app de exemplo para o seu local máquina virtual:

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

    Também é possível faça o download da amostra 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. Criar 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 adicionar Criar.
    3. Na página Criar um bucket, insira um nome para seu 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 google_storage_bucket recurso e modifique o arquivo main.tf conforme mostrado no no exemplo a seguir.

    Para aprender a 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, é possível direcionar 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 seus imagem do contêiner:

    Console

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

      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 deve ser Docker.

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

    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 devem 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 o exemplo a seguir.

    Em um fluxo de trabalho comum do Terraform, você aplica todo o plano uma vez. No entanto, para os fins deste tutorial, é possível direcionar 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 seu repositório do Artifact Registry.

    O build pode levar alguns minutos para ser concluído.

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

    Console

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

      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: como 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 ter êxito para que o job seja bem-sucedido. De 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, com exceção das configurações:

      1. Clique na guia Geral.

        1. No comando do contêiner, insira python.
        2. No 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 e input-PROJECT_ID para o .
        2. Clique em Adicionar variável e insira INPUT_FILE para o e input_file.txt como 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 um tag de imagem, Artifact Registry procura a imagem com a tag padrão latest.

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

      Depois que o job for criado, você verá uma mensagem indicando o sucesso.

    Terraform

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

    Em um fluxo de trabalho comum do Terraform, você aplica todo o plano uma vez. No entanto, para os fins deste tutorial, é possível direcionar 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

Definir e implantar um fluxo de trabalho que executa o job do Cloud Run que você acabou de criar. Uma definição de fluxo de trabalho é composta de uma série de etapas descritos usando o Sintaxe de fluxos de trabalho.

Console

  1. No console do Google Cloud, acesse 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 que criamos antes.

    A conta de serviço serve como a identidade do fluxo de trabalho. É necessário ter já atribuiu o papel Administrador do Cloud Run à conta de serviço, para se o fluxo de trabalho pode executar o job do Cloud Run.

  6. Clique em Next.

  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 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 de a 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 ter já atribuiu o papel roles/run.admin à conta de serviço, se o fluxo de trabalho pode 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 o 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 todo o plano de uma vez. No entanto, para os fins deste tutorial, é possível segmentar uma recurso. 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, em seguida, define as variáveis necessárias.

  2. check_input_file etapa: verifica se o bucket do Cloud Storage especificado no evento é o bucket 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 processamento.
  3. run_job etapa: usa o conector da API Cloud Run Admin Método googleapis.run.v1.namespaces.jobs.run para executar o job. O bucket do Cloud Storage e os nomes dos arquivos de dados são passadas 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 de o 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 Cloud Run job sempre que o arquivo de dados de entrada for atualizado, crie um Eventarc gatilho que responde a eventos do Cloud Storage no bucket que contém o arquivo de dados de entrada.

Console

  1. No console do Google Cloud, acesse 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, digite 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 os 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 criamos antes.

    A conta de serviço serve como a identidade do gatilho. É necessário ter já concedeu os seguintes papéis à conta de serviço:

    • Receptor de evento do Eventarc: recebe 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 Next.

  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 do serviço. conta criada anteriormente.

A conta de serviço serve como a identidade do gatilho. É necessário ter já concedeu os seguintes papéis à conta de serviço:

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

Terraform

Para criar um gatilho, use o Recurso google_eventarc_trigger e modifique o arquivo main.tf conforme o 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 todo o plano de uma vez. No entanto, para os fins deste tutorial, é possível segmentar uma recurso. 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 é carregado ou substituído no Cloud Storage que contém o arquivo de dados de entrada, o fluxo de trabalho será executado com o evento correspondente do Cloud Storage como argumento.

Acione o fluxo de trabalho

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

  1. Gerar novos dados para o arquivo de entrada e fazer upload no 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://input-PROJECT_ID/input_file.txt
    

    Se você criou um bucket do Cloud Storage usando o Terraform, é possível recupere 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 visualizando as execuções do job:

    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 10/10 tarefas foram concluídas.

Saiba mais sobre 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