Utilizando o Google Cloud Functions e Cloud Build para automatizar qualquer tarefa em servidores no Google Compute Engine (GCP)
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:
- Entra no servidor de balanceamento de carga e remove o tráfego de requisições para as instâncias com problema.
- Entra nas instâncias e reinicia elas no Docker.
- Realiza uma requisição local para o aquecimento (warmup) da aplicação.
- 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.com
precisa 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.