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.
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
- 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.
- 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.
- 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.
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.
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
eMENU_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:
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.
Verifique se as variáveis de ambiente foram definidas analisando a seção CONFIGURAÇÃO do job no console:
(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.
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
ePROJECT_ID
: região do Cloud Run e ID do projeto em que o job de serviço de limpeza está implantadocleanup-service
: nome do job do Cloud Run
Acesse o Cloud Scheduler no console para analisar o job do programador criado:
Confira as opções disponíveis no menu "Ações".
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.
- No Cloud Scheduler, selecione "Forçar a execução de um job" no menu "Ações".
- Em Job do Cloud Run, clique no botão "EXECUTE".
- 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.
Filtre os registros para "deletar" a palavra-chave para encontrar os registros.
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:
- Como acionar fluxos de trabalho do Cloud com o Eventarc
- Como acionar o processamento de eventos do Cloud Storage
- Como se conectar ao CloudSQL privado pelo Cloud Run
- Como se conectar a bancos de dados totalmente gerenciados do Cloud Run
- Proteger aplicativos sem servidor com o Identity Aware Proxy (IAP)
- Como implantar com segurança no Cloud Run
- Como proteger o tráfego de entrada do Cloud Run
- Como se conectar ao AlloyDB particular do GKE Autopilot
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.