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

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 .

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

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

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.

@yamadapc