Como executar serviços de uma programação

Use o Cloud Scheduler para acionar um serviço do Cloud Run com segurança em uma programação. É semelhante ao uso dos cron jobs.

Os possíveis casos de uso incluem:

  • Como executar backups em tempo hábil
  • Executar tarefas de administração recorrentes, como:
    • Como gerar novamente um sitemap
    • Como excluir revisões, conteúdo, configuração ou dados antigos
    • Como sincronizar conteúdo entre sistemas de dados
    • Como processar notificações diárias por e-mail
    • Como verificar e gerar relatórios sobre o acesso a serviços de downstream
  • Como gerar documentos, como faturas

Esta página mostra como usar com segurança o Cloud Scheduler com o Cloud Run no mesmo projeto do Google Cloud.

Antes de começar

Ative a API Cloud Scheduler no projeto que você está usando.

Como criar e implantar seu serviço

Para criar e implantar:

  1. No seu serviço, implemente o job que você quer executar em uma programação.

  2. Observe de qual tipo de solicitação seu serviço espera receber as solicitações de job (por exemplo, GET ou POST). Ao criar o job programado que invoca o serviço, você precisa especificar o método HTTP que corresponde a ele.

  3. Quando você implanta o serviço que está usando com o Cloud Scheduler, lembre-se de NÃO permitir invocações não autenticadas.

O exemplo a seguir mostra como implantar um serviço do Cloud Run usando o Terraform:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

Substitua us-docker.pkg.dev/cloudrun/container/hello por uma referência à sua própria imagem de contêiner.

Como criar uma conta de serviço para o Cloud Scheduler

Você precisa criar uma conta de serviço para associar ao Cloud Scheduler e permitir que essa conta de serviço invoque seu serviço do Cloud Run. É possível usar uma conta de serviço existente para representar o Cloud Scheduler ou criar uma nova.

Para criar uma conta de serviço e conceder a ela permissão para invocar o serviço do Cloud Run:

Console

  1. No console do Google Cloud, acesse a página Contas de serviço.

    Acessar a página "Contas de serviço"

  2. Selecione um projeto.

  3. Insira um nome de conta de serviço a ser exibido no console do Google Cloud.

    O console do Google Cloud gerará um ID de conta de serviço com base nesse nome. Edite o ID se for necessário. Não será possível alterar o ID depois.

  4. Opcional: digite uma descrição da conta de serviço.

  5. Clique em Criar e continuar.

  6. Opcional: clique no campo Selecionar um papel.

  7. Selecione Cloud Run > Chamador do Cloud Run.

  8. Clique em Concluído.

Linha de comando

  1. Crie a conta de serviço:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    Substituir

    • SERVICE_ACCOUNT_NAME por um nome em letras minúsculas exclusivo no projeto do Google Cloud, por exemplo, my-invoker-service-account-name.
    • DISPLAYED_SERVICE_ACCOUNT_NAME pelo nome que você quer exibir para essa conta de serviço, por exemplo, no console, My Invoker Service Account.
  2. Para o Cloud Run, conceda à conta de serviço permissão para invocar o serviço:

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    Substitua:

    • SERVICE pelo nome do serviço que você quer que seja invocado pelo Cloud Scheduler.
    • SERVICE_ACCOUNT_NAME pelo nome da conta de serviço.
    • PROJECT_ID pelo ID de projeto do Google Cloud;
  3. Conceda à conta de serviço o acesso ao projeto a fim de que ela tenha permissão para concluir ações específicas nos recursos do projeto:

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    Substituir

    • RESOURCE_ID pelo ID do projeto no Google Cloud.

    • PRINCIPAL: um identificador do principal ou do membro, que geralmente tem o seguinte formato: PRINCIPAL_TYPE:ID. Por exemplo, user:my-user@example.com. Para ver uma lista completa dos valores que PRINCIPAL pode ter, consulte a referência de vinculação de políticas.

Terraform

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

Para criar uma conta de serviço usando o Terraform, siga estas etapas:

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

Como criar um job do Cloud Scheduler

Você precisará criar um job que invoque seu serviço em horários especificados. É possível usar o console ou a linha de comando:

Para criar um job, você pode usar o console ou a linha de comando do gcloud. Clique na guia adequada:

Console

  1. Acesse a página do Console do Cloud Scheduler.

    Acessar o Cloud Scheduler

  2. Clique em Criar job.

    captura de tela

  3. Dê um nome ao job.

  4. Especifique a frequência, ou o intervalo, de execução do job usando uma string de configuração. Por exemplo, a string 0 */3 * * * executa o job a cada 3 horas. É possível usar aqui qualquer string compatível com o formato crontab.

    Para mais informações, consulte Como configurar programações de jobs.

  5. Na lista suspensa, escolha o fuso horário da frequência do job.

  6. Especifique HTTP como destino:

    1. Especifique o URL totalmente qualificado do seu serviço, por exemplo, https://myservice-abcdef-uc.a.run.app. O job enviará solicitações para este URL.

    2. Especifique o método HTTP: o método precisa corresponder ao que o serviço do Cloud Run implantado anteriormente está esperando. O padrão é POST.

    3. Se você quiser, pode especificar também os dados que serão enviados ao destino. Esses dados são enviados no corpo da solicitação quando o método HTTP POST ou PUT for selecionado.

    4. Clique em Mais para mostrar as configurações de autenticação.

    5. No menu suspenso, selecione Adicionar token OIDC.

    6. No campo Conta de serviço copie o e-mail da conta de serviço da conta de serviço criada anteriormente.

    7. No campo Público, copie o URL completo do seu serviço.

  7. Clique em Criar para criar e salvar o job.

Linha de comando

Você precisa usar a autenticação do OIDC para acessar um serviço autenticado do Cloud Run a partir do Cloud Scheduler. A autenticação do OIDC inclui a conta de serviço e as sinalizações de público-alvo. Para mais informações, consulte Usar autenticação para destinos HTTP.

Para criar o job do Cloud Scheduler:

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

Substituir

  • HTTP-METHOD pelo método HTTP (por exemplo, GET, POST, PUT etc.).
  • SERVICE-URL pelo URL do serviço.
  • SERVICE-ACCOUNT-EMAIL pelo e-mail da sua conta de serviço.

Terraform

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

Para criar um job do Cloud Scheduler para o serviço do Cloud Run:

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

O serviço do Cloud Run será acionado por meio de uma solicitação do job pelo Cloud Scheduler na frequência definida. Confirme e monitore isso examinando os registros desse serviço.

A seguir