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 cardápios da 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 Cymbal Eats Menu. Você vai executar o job usando a CLI do Google Cloud e configurar uma programação para ele. Para verificar a execução, analise os registros e faça chamadas de API ao serviço de menu para confirmar se os itens foram excluídos.

O que são jobs do Cloud Run?

O job do Cloud Run executa um contêiner que não exibe 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 recupera os itens de menu no status "Falha" e os exclui. Quando novos itens do cardápio são criados, as imagens são analisadas usando a API Vision para detectar se é um alimento 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 trabalho 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 dos 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 Google 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 Você pode atualizar 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. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, pode gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de 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 não gerar faturamento 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 acessar 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

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

./setup.sh

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

Continue com as próximas etapas depois de executar o comando acima.

3. Analisar o código do job do Cloud Run

Clique no ícone de adição para abrir uma nova guia no Cloud Shell.

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 nesse diretório contém um Dockerfile que define a imagem do contêiner para o job de 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 em status de falha e excluí-los fazendo chamadas de API para o serviço 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 Cymbal Eats Menu.

4. Criar job do Cloud Run

Agora 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 Docker para o job 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

Após a conclusão da 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 os itens de menu com falha com mais de um 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 explore as guias disponíveis: HISTÓRICO, REGISTROS, CONFIGURAÇÃO e YAML.

b12c8e312de3b66.png

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

724c2919d05349c8.png

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

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 executando 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 REGISTROS para revisar a saída do job. Nos registros, vão aparecer a idade do item com falha e o URL do serviço de menu.

518cb00036a2561f.png

5. Configurar uma programação para um 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 programador de limpeza.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

O job do Cloud Scheduler 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, configure uma programação para executar o job de serviço de limpeza.

vários tipos de destino compatíveis com o Cloud Scheduler.

  • HTTP
  • Pub/Sub
  • HTTP do App Engine

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

Para fins de demonstração, você vai programar a execução a cada cinco 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

Revise 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 revisar o job do programador criado:

3bc9120df7fc6ed.png

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

7945908025dd2f2b.png

6. Testar job do Cloud Run

Usando os endpoints do serviço de menu, analise os itens de menu atuais e o status deles:

curl ${MENU_SERVICE_URL}/menu | jq

Saída:

Você verá três itens de menu no status Ready.

Altere o status do item 1 do menu 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 de menu seja excluído, ele precisa ter um minuto, conforme definido pelo parâmetro FAILED_ITEM_AGE.

Aguarde a próxima execução programada ou force 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, selecionando "Force a job run" (Forçar a execução de um job) no menu Ações.

6c8cbeae6165ba4a.png

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

229c22288882b5c3.png

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

Acesse a seção "JOBS" do Cloud Run, abra a guia REGISTROS e verifique se o item de menu foi excluído.

50829ae27b135b2d.png

Filtrar registros para "exclusão" 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:

Dois itens de menu vão aparecer com o 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.