Como acionar jobs do Cloud Run com o Cloud Scheduler

1. Visão geral

Neste laboratório, você vai criar um job do Cloud Run e configurar um job do Cloud Scheduler. Você vai implantar o serviço de menu do Cymbal Eats usando o script de configuração. Você vai criar um job do Cloud Run que faz chamadas de API para o serviço de menu do Cymbal Eats. Você vai executar o job usando a CLI do Google Cloud e configurar uma programação para ele. Você vai verificar a execução analisando os registros e fazendo chamadas de API para o serviço de menu para confirmar se os itens do menu foram excluídos.

O que são jobs do Cloud Run?

O job do Cloud Run executa um contêiner que não atende a solicitações da Web, mas executa tarefas operacionais ou processamento de dados. O contêiner vai executar a tarefa e sair quando terminar.

Job de serviço de limpeza

O job de serviço de limpeza vai recuperar e excluir os itens de menu no status "Falha". Quando novos itens de menu são criados, as imagens são analisadas usando a API Vision para detectar se é um item de comida ou não. Para imagens que não passarem nessa validação, o status dos itens de menu será atualizado para "Falha" e, em seguida, excluído pelo job de limpeza.

d74200f0bd14d350.png

O que você vai aprender

Você vai aprender a:

  • Criar jobs do Cloud Run
  • Executar jobs do Cloud Run
  • Criar jobs do Cloud Scheduler
  • Verificar a execução de jobs

Pré-requisitos

  • Para fazer este laboratório, é preciso saber usar o console do Cloud e ambientes shell.
  • Ter experiência anterior com o Cloud Run e o Cloud Scheduler é útil, mas não obrigatório.

2. Configuração e requisitos

Configuração do projeto do Cloud

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google É possível atualizar o local a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Configuração do ambiente

Ative o Cloud Shell clicando no ícone à direita da barra de pesquisa.

eb0157a992f16fa3.png

No Cloud Shell, execute o seguinte comando para clonar o código do aplicativo deste repositório e acesse o diretório que contém o serviço de menu:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

Implante o serviço de menu usando o script de configuração no Cloud Run. O serviço de menu é um microsserviço baseado em Java criado com a estrutura Quarkus usando o banco de dados do Cloud SQL Postgres como back-end. O serviço de menu é a dependência do ambiente de execução do job do Cloud Run que você vai criar nas próximas etapas.

./setup.sh

A implantação vai levar cerca de 10 minutos para criar todos os componentes necessários.

Continue com as próximas etapas após executar o comando acima.

3. Conhecer o código de job do Cloud Run

Abra uma nova guia no Cloud Shell clicando no ícone de adição.

45f480cd1b9a995.png

Acesse o diretório que contém o serviço de limpeza e analise os arquivos que compõem o job:

cd ~/cymbal-eats/cleanup-service

O cleanup-service neste diretório contém um Dockerfile que define a imagem do contêiner para o job do serviço de limpeza com as dependências necessárias(httpie, jq).

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

O script de limpeza real, listado abaixo, contém comandos para receber uma lista de itens de menu com status de falha e excluí-los fazendo chamadas de API para o serviço de menu.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

Observe o seguinte sobre o script:

  • As variáveis de ambiente FAILED_ITEM_AGE e MENU_SERVICE_URL serão definidas durante a implantação e transmitidas pelo job do Cloud Run.
  • FAILED_ITEM_AGE: número de minutos antes que o item com falha seja excluído.
  • MENU_SERVICE_URL: URL do serviço do cardápio do Cymbal Eats.

4. Criar job do Cloud Run

Em seguida, você vai criar uma imagem de contêiner e publicá-la no Artifact Registry.

Essa imagem de contêiner será usada para criar um job do Cloud Run.

Ative as APIs de serviço:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

Defina as variáveis de ambiente:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

Crie um novo repositório do Artifact Registry para armazenar imagens do Docker para a tarefa de limpeza:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Crie a imagem do contêiner usando o Cloud Build e envie-a para o Artifact Registry com um comando:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

Exemplo de saída:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

Depois de concluir a publicação, acesse o Artifact Registry e revise a imagem publicada:

fb95ae38baa7c543.png

Volte para a segunda guia do Cloud Shell. Execute o comando a seguir para descrever o serviço de menu e salvar o URL na variável de ambiente. Essa variável de ambiente será usada para configurar o job do Cloud Run.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

Crie um job do Cloud Run para limpar itens de menu com falhas com mais de 1 minuto [definido por FAILED_ITEM_AGE].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Exemplo de saída:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

Acesse a seção JOBS do Cloud Run no console e revise o job criado.

Clique no job e confira as guias disponíveis: HISTÓRICO, LOGS, CONFIGURAÇÃO e YAML.

b12c8e312de3b66.png

Verifique se as variáveis de ambiente foram definidas analisando a seção CONFIGURAÇÃO do job no console:

724c2919d05349c8.png

(Opcional) Se você quiser mudar a idade do item com falha ou as variáveis de URL do serviço de menu, depois que o job do Cloud Run for criado, use o comando de atualização:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Para validar o job, execute o job do Cloud Run com o seguinte comando:

gcloud beta run jobs execute cleanup-service --region=$REGION

Exemplo de saída:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

Mude para a guia LOGS para analisar a saída do job. Você vai encontrar a idade do item com falha e o URL do serviço de menu nos registros.

518cb00036a2561f.png

5. Configurar uma programação para o job do Cloud Run

O Cloud Scheduler é um programador de cron jobs totalmente gerenciado e de nível empresarial. Com ele, é possível programar praticamente qualquer job, incluindo jobs em lote e de Big Data, operações de infraestrutura na nuvem e muito mais.

Uma prática recomendada de segurança ao trabalhar com um job do Cloud Scheduler é executar cada job com credenciais separadas. Nesta etapa, crie uma conta de serviço para uso pelo job do agendador de limpeza.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

O job do Cloud Scheduler vai precisar de permissões para fazer chamadas para os jobs do Cloud Run.

Conceda o papel Cloud Run Invoker à conta de serviço usada no job do Cloud Scheduler:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

Em seguida, você vai configurar uma programação para executar o job de serviço de limpeza.

O Cloud Scheduler oferece suporte a vários tipos de destino.

  • HTTP
  • Pub/Sub
  • HTTP do App Engine

Você vai criar um job do agendador usando o tipo de destino HTTP.

Para fins de demonstração, programe a execução a cada 5 minutos.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Analise o parâmetro uri usado para chamar o job do Cloud Run:

  • REGION e PROJECT_ID: região do Cloud Run e ID do projeto em que o job de serviço de limpeza está implantado
  • cleanup-service: nome do job do Cloud Run

Acesse o Cloud Scheduler no console para analisar o job do programador criado:

3bc9120df7fc6ed.png

Confira as opções disponíveis no menu "Ações".

7945908025dd2f2b.png

6. Testar o job do Cloud Run

Usando os endpoints do serviço de cardápio, revise os itens de menu e o status deles:

curl ${MENU_SERVICE_URL}/menu | jq

Saída:

Você vai encontrar três itens de menu no status Ready.

O status do item de menu 1 foi alterado para Failed:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

Aguarde um minuto. Para que o item do menu seja excluído, ele precisa ter 1 minuto de idade, conforme definido pelo parâmetro FAILED_ITEM_AGE.

Você pode aguardar a próxima execução programada ou forçar a execução do job no console.

Há várias maneiras de acionar um job, pela interface ou pela linha de comando.

Neste exemplo, execute o comando no Cloud Shell(opção 3) para acionar o job.

  1. No Cloud Scheduler, selecione "Forçar a execução de um job" no menu "Ações".

6c8cbeae6165ba4a.png

  1. Em Job do Cloud Run, clique no botão "EXECUTE".

229c22288882b5c3.png

  1. No Cloud Shell, execute o seguinte comando:
gcloud beta run jobs execute cleanup-service --region=$REGION

Navegue até a seção JOBS do Cloud Run, abra a guia LOGS e verifique se o item de menu foi excluído.

50829ae27b135b2d.png

Filtre os registros para "deletar" a palavra-chave para encontrar os registros.

d94fb9e444b1c1b8.png

Use os endpoints do serviço de menu para verificar os itens de menu atuais pelo endpoint REST.

curl ${MENU_SERVICE_URL}/menu | jq

Saída:

Você vai encontrar dois itens de menu no status Ready.

7. Parabéns!

Parabéns, você concluiu o codelab.

O que aprendemos:

  • Como criar jobs do Cloud Run
  • Como executar jobs do Cloud Run
  • Como criar jobs do Cloud Scheduler
  • Como verificar a execução de jobs

O que vem em seguida:

Conheça outros codelabs da Cymbal Eats:

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto ou mantenha o projeto e exclua cada um dos recursos.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.