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.
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
- 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 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.
- 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.
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.
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
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 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:
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.
Verifique se as variáveis de ambiente foram definidas consultando a seção CONFIGURAÇÃO do job no console:
(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.
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.
Há 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
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 revisar o job do programador criado:
Analise as opções disponíveis no menu Ações.
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.
- No Cloud Scheduler, selecionando "Force a job run" (Forçar a execução de um job) no menu Ações.
- Em Job do Cloud Run, clique no botão "EXECUTAR". .
- 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.
Filtrar registros para "exclusão" 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:
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:
- Como acionar fluxos de trabalho do Cloud com o Eventarc
- Como acionar o processamento de eventos no Cloud Storage
- Como se conectar ao CloudSQL particular pelo Cloud Run
- Como se conectar a bancos de dados totalmente gerenciados pelo Cloud Run
- Aplicativo seguro 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 no Autopilot do GKE
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.