Usando o Hyper.sh e o AWS ECR para botar um Bot no ar por menos de $3 ao mês
--
Essa semana, queria botar um pequeno Hubot no ar para a Beijaflor Software gastando o mínimo possível mensalmente e tendo um sistema de deploys bem resolvido, sem mais trabalho. Decidi testar o novo serviço de hosting de containers Hyper.sh que se propõe a prover "Hosting de Containers Docker sem Esforço". Vou caminhar pelos passos que usei para criar esse deployment rapidamente.
1. Criando o Hubot
Para criar um bot Hubot, basta usar seu próprio scaffolder e adicionar variáveis de ambiente com as credenciais do serviço de chat da sua empresa.
$ npm install -g yo generator-hubot$ mkdir superbot && cd superbot$ yo hubot# responda umas perguntas
2. Dockerizando o Hubot
Dockerizar o Hubot é como dockerizar qualquer app Node.js normal. Começamos com uma imagem de Node.js, instalamos as dependências e adicionamos o código. Meu Dockerfile se parece com:
from mhart/alpine-node:6
maintainer Pedro Tacla Yamada <tacla.yamada@gmail.com>
add ./package.json /app/package.json
workdir /app
run npm install
add . /app
cmd npm start
Podemos rodar o container localmente para ter certeza de que tudo está ok:
$ docker build -t superbot:latest .$ docker run \
-e HUBOT_SLACK_TOKEN=”$HUBOT_SLACK_TOKEN” \
superbot:latest
3. Fazendo upload da imagem para o AWS ECR
O AWS ECR é um "Docker Registry" como um serviço, armazenando suas imagens na nuvem do AWS. Tem como vantagens sobre o serviço equivalente provido pela empresa por traz do Docker, o Docker Hub:
- Roda no AWS (baixa latência & credenciais manejadas pelo IAM se sua infra já estiver no AWS)
- Tem um modelo de preços "Pay-per-Use" ao invés de baseado no número de repositórios privados (o Docker Hub custa aproximadamente $1/mês por repositório, enquanto o AWS ECR custa aproximadamente $0.10/mês por GB mais custos de transferência).
Para usar o ECR, precisamos criar um repositório para nossas imagens e "logar" no sistema. Fazemos isso pela GUI ou usando a CLI do AWS:
$ aws ecr create-repository --repository-name superbot$ eval $(aws ecr get-login)
O segundo comando é necessário porque as credenciais do ECR são dinâmicas; essencialmente aws ecr get-login imprime um comando docker login … e nós dizemos pro shell o executar.
Com o repositório criado, podemos fazer tag da nossa imagem e a empurrar:
$ docker tag superbot:latest \
isso-foi-imprimido-quando-criamos-o-repositorio.dkr.ecr.us-east-1.amazonaws.com/superbot:latest$ docker push isso-foi-imprimido-quando-criamos-o-repositorio.dkr.ecr.us-east-1.amazonaws.com/superbot:latest
4. Botando o bot no ar usando o Hyper.sh
Primeiro instale o CLI do Hyper.sh seguindo as instruções aqui. Em seguida, precisamos "logar" de novo no AWS ECR usando o hyper. A CLI do hyper parece usar os mesmos comandos que o docker, então minha solução para isso foi:
$ eval $(aws ecr get-login | sed "s/docker/hyper")
Pegamos aquele comando que a CLI do AWS nos gera, substituímos "docker" por "hyper" usando o sed e tudo fica bem.
Agora tudo que precisamos fazer é:
$ hyper run \
-e HUBOT_SLACK_TOKEN=”$HUBOT_SLACK_TOKEN” \
--size s3 \
-d \
--name beijaflor-bot \
isso-foi-imprimido-quando-criamos-o-repositorio.dkr.ecr.us-east-1.amazonaws.com/superbot:latest
Olhamos para nossa história do shell, botamos isso numa Makefile e nosso bot está no ar usando o tipo de worker para containers "S3", precificado a:
- $2.59/mês
- $0.0036/hora
- $0.000001/segundo
- 256MB RAM, 10GB Disco e uma CPU virtual
Mais informações aqui: https://www.hyper.sh/pricing.html
Somados aos custos do ECR para nossa imagem, que por usar Alpine pesa apenas 76.2MB, temos um custo total aproximado de $2.59762/mês.
É isso aí. Achei o Hyper.sh um serviço bem implementado com um custo muito competitivo, apesar de só estar disponível em uma zona em LA. Vale a pena dar uma olhada para fazer deploys de sua infraestrutura de containers. Seria útil pensar em como usar esse modelo para construir coisas como integração contínua on-demand, como a organização aponta em sua homepage.
Obrigado e até a próxima.