Executar serviços com base numa programação

Pode usar o Cloud Scheduler para acionar de forma segura um serviço do Cloud Run de acordo com uma programação. Isto é semelhante à utilização de tarefas cron.

Seguem-se alguns exemplos de utilização:

  • Fazer cópias de segurança periodicamente
  • Executar tarefas de administração recorrentes, como:
    • Voltar a gerar um mapa do site
    • Eliminar dados, conteúdo, configuração ou revisões antigos
    • Sincronizar conteúdo entre sistemas de dados
    • Processamento de notificações por email diárias
    • Validar e criar relatórios sobre o acesso a serviços a jusante
  • Gerar documentos, como faturas

Esta página mostra como usar o Cloud Scheduler de forma segura com o Cloud Run no mesmo Google Cloud projeto.

Antes de começar

Ative a API Cloud Scheduler no projeto que está a usar.

Criar e implementar o seu serviço

Para criar e implementar:

  1. No seu serviço, implemente a tarefa que quer executar de acordo com uma programação.

  2. Tenha em atenção o tipo de pedido que o seu serviço espera receber dos pedidos de tarefas, por exemplo, GET ou POST. Quando cria a tarefa agendada que invoca o seu serviço, tem de especificar o método HTTP que corresponde a este.

  3. Quando implementar o serviço que está a usar com o Cloud Scheduler, certifique-se de que seleciona ** Exigir autenticação**. Não permitir acesso público.

O exemplo seguinte mostra como implementar um serviço do Cloud Run através do Terraform:

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

  deletion_protection = false # set to "true" in production

  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 contentor.

Criar uma conta de serviço para o Cloud Scheduler

Tem de criar uma conta de serviço para associar ao Cloud Scheduler e conceder a essa conta de serviço autorização para invocar o seu serviço do Cloud Run. Pode 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-lhe autorização para invocar o serviço do Cloud Run:

Consola

  1. Na Google Cloud consola, aceda à página Contas de serviço.

    Aceda a Contas de serviço

  2. Selecione um projeto.

  3. Introduza um nome da conta de serviço a apresentar na Google Cloud consola.

    A Google Cloud consola gera um ID da conta de serviço com base neste nome. Edite o ID, se necessário. Não pode alterar o ID posteriormente.

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

  5. Clique em Criar e continuar.

  6. Opcional: clique no campo Selecionar uma função.

  7. Selecione Cloud Run > Cloud Run Invoker.

  8. Clique em Concluído.

Linha de comandos

  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 com um nome em minúsculas exclusivo no seu Google Cloud projeto, por exemplo, my-invoker-service-account-name.
    • DISPLAYED_SERVICE_ACCOUNT_NAME com o nome que quer apresentar para esta conta de serviço, por exemplo, na consola, por exemplo, My Invoker Service Account.
  2. Para o Cloud Run, conceda à sua conta de serviço autorização para invocar o seu serviço:

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

    Substituir

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

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

    Substituir

    • RESOURCE_ID: o ID do seu Google Cloud projeto.

    • PRINCIPAL: um identificador para o principal ou o membro, que normalmente 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 associação de políticas.

Terraform

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

Para criar uma conta de serviço com o Terraform:

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

Criar uma tarefa do Cloud Scheduler

Tem de criar uma tarefa que invoque o seu serviço em horas específicas. Pode usar a consola ou a linha de comandos:

Para criar uma tarefa, pode usar a consola ou a linha de comandos gcloud. Clique no separador adequado:

Consola

  1. Aceda à página da consola do Cloud Scheduler.

    Aceda ao Cloud Scheduler

  2. Clique em Criar tarefa.

    captura de ecrã

  3. Indique um nome para a tarefa.

  4. Especifique a frequência ou o intervalo da tarefa em que a tarefa deve ser executada, através de uma string de configuração. Por exemplo, a string 0 */3 * * * executa a tarefa a cada 3 horas. A string que fornece aqui pode ser qualquer string compatível com crontab.

    Para mais informações, consulte o artigo Configurar programações de tarefas.

  5. Na lista pendente, escolha o fuso horário a usar para a frequência da tarefa.

  6. Especifique HTTP como o alvo:

    1. Especifique o URL totalmente qualificado do seu serviço, por exemplo, https://myservice-abcdef-uc.a.run.app. A tarefa envia pedidos para este URL.

    2. Especifique o método HTTP: o método tem de corresponder ao que o serviço do Cloud Run implementado anteriormente está a esperar. O valor predefinido é POST.

    3. Opcionalmente, especifique os dados a enviar para o destino. Estes dados são enviados no corpo do pedido quando o método HTTP POST ou PUT é selecionado.

    4. Clique em Mais para mostrar as definições de autorização.

    5. No menu pendente, selecione Adicionar token OIDC.

    6. No campo Conta de serviço, copie o email da conta de serviço da conta de serviço que criou anteriormente.

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

  7. Clique em Criar para criar e guardar a tarefa.

Linha de comandos

Tem de usar a autenticação OIDC para aceder a um serviço do Cloud Run autenticado a partir do Cloud Scheduler. A autenticação OIDC inclui a conta de serviço e as flags de público-alvo. Para mais informações, consulte o artigo Use a autenticação para destinos HTTP.

Para criar a tarefa 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 com o método HTTP (ou seja, GET, POST, PUT, etc.).
  • SERVICE-URL com o URL do seu serviço.
  • SERVICE-ACCOUNT-EMAIL com o email da sua conta de serviço.

Terraform

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

Para criar uma tarefa 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 seu serviço do Cloud Run é acionado através de um pedido da tarefa do Cloud Scheduler na frequência que definiu. Pode confirmar e monitorizar esta situação examinando os registos deste serviço.

O que se segue?