
Rodar ambientes de não produção na nuvem é ótimo: eles ficam à mão a qualquer hora, exatamente quando você precisa. Mas essa praticidade às vezes tem um preço. Em geral, instâncias de não produção são usadas durante o dia e, na correria, é fácil esquecer de desligá-las à noite ou nos finais de semana. Cada instância custa só alguns centavos por hora, mas, somando o mês inteiro, a conta chega rapidinho na casa dos milhares de dólares.
Como Premier Partner e MSP Partner do Google, nós da DoiT International trabalhamos com centenas de startups e grandes empresas que rodam seus workloads na Google Cloud Platform de modo geral, e no Google Compute Engine em particular. Nossa missão é reduzir o gasto mensal com nuvem dos nossos clientes, projetando sistemas mais inteligentes e econômicos.
É com essa mentalidade que, hoje, estamos liberando o Zorya como código aberto. Na mitologia eslava, as Zoryas são duas deusas guardiãs. As Zoryas representam a estrela da manhã e a estrela da noite — quem leu ou assistiu American Gods, do Neil Gaiman, provavelmente vai se lembrar dessas irmãs.
Mas, afinal, o que é o Zorya? É um pequeno software que você pode rodar na sua própria conta da Google Cloud Platform e que permite configurar um agendamento para as suas instâncias do Google Compute Engine, criando políticas que valem para todos os projetos da sua organização.
A gente queria muito que o Zorya fosse fácil de instalar e manter, então definimos os seguintes objetivos de design:
- Rodar o Zorya de forma serverless, reduzindo o esforço de gerenciamento
- Permitir configurar vários agendamentos e políticas
- Suportar vários projetos a partir de uma única instância do Zorya
- Manter o custo operacional baixo
Decidimos construir o Zorya rodando no Google App Engine, Standard Environment. Só essa escolha já garantiu dois dos requisitos:
- Operação serverless via App Engine, ou seja, sem precisar gerenciar servidores e com alta disponibilidade e escalabilidade já incluídas.
- Custo operacional baixo — graças ao modelo de preços do Google App Engine e ao fato de que o Zorya "acorda" só uma vez por hora; no resto do tempo, ele não consome recursos, o que mantém a conta enxuta.
O backend do Zorya é escrito em Python, com frontend em React. Optamos pelo Google Cloud Datastore como banco de dados para guardar as configurações.
Backend
O backend oferece uma API RESTful simples para consultar e definir schedules e policies.
A entidade Schedule é composta por um nome, um fuso horário e uma matriz 7x24 que representa cada hora de cada dia da semana. O valor 0 indica que a instância deve estar parada, e o valor 1 indica que ela deve estar online.
A entidade Policy é composta por um nome, uma lista de projetos, o nome de um schedule associado e uma lista de labels do Google Compute Engine, ou seja, pares de nomes e valores.
{ "name": "My policy", "tags": [\ {\ "dev": "sleeper",\ "staging": "resting"\ }\ ], "projetcs": [\ "project-x",\ "y-project"\ ], "schedulename": "my schedule name"}A API é bem simples e tem só oito endpoints:
- add_policy
- list_schedules
- del_schedule
- get_schedule
- add_policy
- list_policies
- get_policy
- del_policy
A documentação da API e um código de exemplo para consumi-la em algumas linguagens estão disponíveis aqui.
Por meio do scheduler nativo do Google App Engine, uma tarefa verifica as policies para checar se é preciso alterar o estado das instâncias.
Se for necessário alterar o estado, o Zorya percorre os projetos relevantes e muda o estado das instâncias que têm os pares de label solicitados.
https://gist.github.com/avivl/ee9e7c11c254e25b890d48c1a873fdc1
Autenticação
Para que o Zorya possa gerenciar instâncias em seu nome em qualquer projeto da sua organização, é preciso criar uma nova entrada no IAM da Organização e atribuir à conta de serviço do Zorya o papel de "Compute Admin".
Primeiro, acesse https://console.cloud.google.com, selecione "IAM & Admin" no menu e, por fim, escolha o nome da sua organização (e não de um projeto específico) no menu suspenso no topo da página:

O nome da conta de serviço para a qual você precisa atribuir as permissões é: [email protected]. Basta substituir project-id pelo ID real do projeto em que você implantou o Zorya.
Frontend
Como a gente espera que a maioria das pessoas use a API do Zorya, montamos uma interface bem enxuta para criar schedules e policies. O frontend é baseado em ReactJS e está publicado no módulo padrão da aplicação App Engine.
Para fazer login no app, usamos o Cloud Identity-Aware Proxy. O Cloud IAP verifica a identidade do usuário e decide se ele tem permissão para acessar a aplicação. Configurar é tão simples quanto entrar no console do GCP, habilitar o IAP na sua aplicação App Engine e adicionar os usuários ou grupos que devem ter acesso ao Zorya.
Para começar a usar a interface, basta abrir o navegador em project-id.appspot.com e trocar project-id pelo ID do seu próprio projeto na Google Cloud Platform.
Pela interface, é fácil criar um novo agendamento. Veja este exemplo: de segunda a sexta, das 8h às 19h, no fuso US/Eastern. Nesse período, suas instâncias ficam ligadas; fora dele, o Zorya desliga as instâncias e religa no dia seguinte.
Editor de Schedules do Zorya
Depois de configurar o agendamento, você precisa definir uma policy para aplicá-lo a um conjunto de instâncias. Digamos que você queira aplicar o agendamento a todas as instâncias do projeto doit-playground com as labels env:dev, role:frontend e app:reoptimize. Assim, só serão afetadas as instâncias que tiverem os três pares de label.
Configurando uma Policy do Zorya
Redução de custos
Usamos o DoiT Cloud Intelligence™ para acompanhar nossos custos na Google Cloud Platform. O DoiT Cloud Intelligence consegue detalhar custos por label dentro de uma Organização do GCP e entrega uma visualização bem clara.
Começamos a usar o Zorya internamente em dezembro de 2017, quando nossos custos com Google Compute Engine giravam em torno de US$ 780/dia, em média. Com o Zorya rodando nos ambientes de desenvolvimento e testes, esses custos caíram para uma média de US$ 320/dia — uma redução de quase 60%.
Dashboard do DoiT Cloud Intelligence
Para encerrar
Se você também quiser usar o Zorya para enxugar sua fatura mensal na Google Cloud Platform, dá uma star pra gente lá no GitHub! ;-) E pode mandar pull request à vontade — toda contribuição para evoluir o Zorya é muito bem-vinda!
Quer mais conteúdo? Dá uma olhada no nosso blog ou siga o Aviv no Twitter.