Utilizando o Google Cloud Functions e Cloud Build para automatizar qualquer tarefa em servidores no Google Compute Engine (GCP)

Gustavo Tedesco
Único
Published in
5 min readApr 25, 2022

Neste artigo você irá acompanhar como foi obter a automação de tarefas cotidianas, por exemplo reiniciar uma aplicação em casos de falha nas instâncias do Google Compute Engine (GCP). Utilizaremos as seguintes ferramentas: Google Cloud Functions e Cloud Build. Iremos ver também os serviços de Pub/Sub, Cloud Scheduler e Cloud Monitoring para alcançar a automação.

O primeiro passo para realizar automações é entender o contexto que estamos, pois dependendo desse contexto podem ser utilizadas diferentes abordagens.

Cenário

Em nosso contexto, continha o seguinte cenário: uma aplicação de TensorFlow legada escrita em linguagem Python utilizando o framework Flask. Ela se encontra em conteiner Docker hospedada em máquinas virtuais no GCP com sistema operacional Linux e Docker instalado nelas.

Temos um problema recorrente nesta aplicação, onde com o passar do tempo sobe a memória e precisa ser reiniciada, do contrário irá travar o servidor, ocasionando indisponibilidade do sistema. Por ser um sistema legado o time tomou a decisão de contornar o problema com esta automação que iremos ver neste artigo.

Para prevenção ou recuperação da aplicação legada, o time executa as seguintes etapas manuais:

  1. Entra no servidor de balanceamento de carga e remove o tráfego de requisições para as instâncias com problema.
  2. Entra nas instâncias e reinicia elas no Docker.
  3. Realiza uma requisição local para o aquecimento (warmup) da aplicação.
  4. Retorna as instâncias no balanceador de carga para voltarem a receber requisições.

Este processo era repetido em duas regiões com 9 máquinas cada, totalizando 18 máquinas com o processo manual descrito.

Após a compreensão do nosso cenário, realizamos escolhas de algumas ferramentas do Google Cloud e desenhamos como será o fluxo de trabalho para automação dessas tarefas manuais.

Google Pub/Sub

Google Pub/Sub é um serviço de mensagens assíncronas que separa serviços que produzem eventos de serviços que processam eventos. Iremos utilizar o Pub/Sub como um meio comunicação entre nosso agendador de tarefas no Cloud Scheduler e monitoramento no Cloud Monitoring para acionamento da nossa função no Cloud Functions.

Vamos criar nossa fila com o nome monitoring-app.

Google Cloud Scheduler

Foi utilizada uma estratégia de criar um agendador de tarefas no Cloud Scheduler para enviar o gatilho ao Pub/Sub e reiniciar os serviços em um dia da semana no período noturno preventivamente para evitar de ocasionar algum incidente.

Após executar na data e horário estipulado o Cloud Scheduler enviará uma mensagem para o tópico Pub/Sub que irá acionar a função no Cloud Function, que irá iniciar o Cloud Build e o mesmo irá realizar as etapas manuais descritas acima neste artigo via ssh.

Google Cloud Monitoring

Mesmo após criarmos o agendador de tarefas no Cloud Scheduler para prevenção de subir a memória com o passar do tempo, a aplicação pode subir repentinamente a memória.

Por isso utilizaremos também o Google Cloud Monitoring, uma ferramenta incrível que oferece visibilidade detalhada dos seus serviços e recursos executados no GCP.

Vamos ativar o canal de notificações no Cloud Monitoring para Pub/Sub (Notification channels).

Agora vamos criar o alerta de memória para enviar as notificações ao Pub/Sub.

Após a memória ultrapassar 80% de uso, alertará os canais de notificação por meio da política de alertas, enviará uma mensagem para o tópico Pub/Sub que irá acionar a função no Cloud Function que irá iniciar o Cloud Build e o mesmo irá realizar as etapas manuais descritas acima neste artigo via ssh.

Google Cloud Functions

O Cloud Functions é um serviço de computação sem servidor orientado a eventos para funções simples de finalidade única anexadas a eventos. No Cloud Functions, basta subir o código que pode ser escrito em várias linguagens como JavaScript, Python ou Go e o GCP implantará automaticamente a capacidade de computação apropriada para executar esse código. Esses servidores são dimensionados automaticamente e implantados com alta disponibilidade em um design tolerante a falhas.

Primeiramente iremos criar um script bash em nosso servidor de balanceamento de carga denominado script-lb.sh.

Agora vamos criar uma função no Cloud Function, onde utilizaremos a linguagem Go.

Selecione para ela ser acionada pelo tópico que criamos do Pub/Sub e adicione uma conta de serviço para esta Cloud Function. Coloque ReceiveMessage no nome da função para executar e clique em criar.

Para esta conta de serviço, devemos conceder as seguintes permissões:

  • Cloud Build Editor roles/cloudbuild.builds.editor
  • Cloud Functions Admin roles/cloudfunctions.admin
  • Compute Instance Admin (v1) roles/compute.instanceAdmin.v1
  • IAP-secured Tunnel User roles/iap.tunnelResourceAcessor
  • IAP-secured Web App User roles/iap.httpsResourceAcessor
  • Service Account User roles/iam.serviceAccountUser

A nossa função no Cloud Function chama a API Cloud Build para fazer qualquer tarefa que quisermos na VM, como aqui, estaremos realizando comandos via ssh nas instâncias do GCP.

Para realizar o ssh do Cloud Build para uma máquina virtual no GCP, a conta de serviço do Cloud Build <account>@cloudbuild.gserviceaccount.comprecisa das seguintes permissões.

  • Cloud Build Service Account roles/cloudbuild.builds.builder
  • Cloud Functions Admin roles/cloudfunctions.admin
  • Compute Instance Admin (v1) roles/compute.instanceAdmin.v1
  • IAP-secured Tunnel User roles/iap.tunnelResourceAcessor
  • IAP-secured Web App User roles/iap.httpsResourceAcessor
  • Service Account User roles/iam.serviceAccountUser

Conclusão

Agora seu serviço é removido do balanceador de carga e reiniciado sem nenhuma intervenção humana evitando falhas, conforme você pode verificar nos logs do Cloud Build.

Com a combinação dessas ferramentas, você pode obter uma automação de alto nível e incrível que reduz drasticamente seu trabalho manual de rotina.

--

--