Jogando Super Mário na AWS | Terraform + Docker

Anderson Lima
Sep 9, 2019 · 7 min read

Este será um guia prático de como prover uma instância na AWS juntamente com um contêiner Docker rodando Super Mário. Caso deseje reproduzir este ambiente você vai precisar apenas de uma conta na AWS e você ainda pode utilizar o nível gratuito para isso.

Para começar vamos fazer precisar de dois recursos, o próprio Terraform e o AWS CLI.

Instalação Terraform:
https://learn.hashicorp.com/terraform/getting-started/install.html

Instalação AWS CLI
MacOS - https://docs.aws.amazon.com/pt_br/cli/latest/userguide/install-macos.html
Linux - https://docs.aws.amazon.com/pt_br/cli/latest/userguide/install-linux.html
Windows - https://docs.aws.amazon.com/pt_br/cli/latest/userguide/install-windows.html

Configurações AWS

Vamos criar um usuário e usar suas credenciais de segurança para criar um profile no AWS CLI

Ao final da criação do usuário salve o ID da Chave de acesso e também a Chave de acesso Secreta. Você também pode fazer o download do CSV com estas informações.

Criando Profile na AWS CLI

Para configurar as credenciais de segurança do usuário que acabamos de criar basta rodar o seguinte comando no seu terminal e inserir as informações respectivas.

aws configure --profile super_mario

Com os comandos abaixo você pode verificar o profile que você acabou de criar. O caminho do arquivo credentials pode variar de acordo com seu sistema operacional.

cat ~/.aws/credentials

Iniciando com Terraform

Em um diretório de sua escolha, crie dois novos diretórios, resources e scripts.

Os primeiros arquivos que vamos criar serão dentro do diretório resources. São eles, main.tf e variables.tf.

No arquivo main.tf vamos colocar algumas informações principais

Provider: O nosso provedor de cloud que no exemplo é a AWS
Profile: O profile que criamos anteriormente no AWS CLI com as credenciais de segurança do nosso usuário.
Region: Aqui informando a região que será usada na AWS.

Perceba que o valor do parâmetro region foi colocado o valor de uma variável e é aqui que começamos a usar as variáveis do Terraform.

No arquivo de variables.tf comece inserindo os seguintes parâmetros.

Variable: Nome da variável.
Description: não preciso comentar…
Default: É o valor padrão para aquela variável (variáveis podem ter mais de um valor mas não abordaremos aqui)

Vamos inserir as outras variáveis que usaremos futuramente, segue no arquivo com todas as variáveis que usaremos.

Não se preocupe em copiar este código, no final do artigo vou disponibilizar tudo em um repositório GitHub.

Criando VPC

No diretório de resources vamos criar o arquivos vpc.tf com o seguinte conteúdo.

Resource: Aqui existem dois valores, o tipo do recurso da AWS e o nome dele respectivamente (Este é o padrão de definição de todos os recursos da AWS no Terraform).
Cidr_block: Variável com a faixa de IP interno dos recursos na nossa VPC.
Tags: Apenas criamos uma tag “Name” com o nome da nossa VPC.

Subnet

Ainda no diretório resources crie o arquivo subnet.tf.

Neste momento eu acredito que vocês já estão familiarizados com a definição de recurso que é a mesma sempre (resources “tipo do recurso” “nome do recurso”) e aqui na Subnet e nos outros recursos não será diferente.

A diferença aqui é apenas na definição na variável vpc_id que referencia um recurso existente e não uma variável criada no arquivo com essa finalidade. Nesta variável apenas definimos o ID da VPC que criamos anteriormente.

Security Group

No security group iremos criar as regras de entrada “Ingress” e saída “Egress” que serão utilizadas na nossa VPC.

Acredito que apenas o protocolo de saída e o cidr_bloks que necessitam de explicação neste recurso.

O valor do protocolo de saída está como “-1” pois significa que poderemos utilizar todos os protocolos a partir da nossa VPC diferente do protocolo de ingress que é apenas TCP.

O cidr_bloks está com o valor “0.0.0.0/0” pois indica que a fonte de comunicação pode ser qualquer faixa de IP.

Internet Gateway

Neste recurso apenas criamos o Internet Gateway para acessar a internet a partir da nossa instância.
Bastas criar o arquivo internet_gatway.tf na pasta de resources.

Route Table

Acabamos de criar o nosso Internet Gateway mas ele ainda não está associado a nossa subnet. Para fazer esta associação nos vamos precisar do Route Table criando o arquivo de nome route_table.tf no diretório resources.

Primeiramente criaremos o recurso de route_tables e associaremos ao nosso internet_gateway.

Agora associamos o Route Table a nossa Subnet

Segue o arquivo completo:

Finalmente criando a nossa Instância

O primeiro recurso que criaremos aqui é um data source para filtrar a AMI do ubuntu.

Agora vamos criar a nossa instância referenciando alguns recursos já criados como variáveis.

Neste recurso tem duas coisas diferentes que precisamos explicar aqui.

O primeiro é Key Name que pode ser usado para acessar a nossa instância via SSH. Este recurso precisa ser criado no console da AWS utilizando o mesmo nome que colocamos no nosso arquivo de variáveis super_mario_key.

Apenas pela organização salve esta chave no diretório de resources.

O último e mais importante recurso que iremos definir é o User Data. Este recurso é responsável por executar alguns comandos em nossa instância no momento em que ela é iniciada.

No nosso caso iremos referenciar um arquivo de script que irá instalar o Docker e executar um contêiner onde irá rodar nosso game.

Segue o Script que iremos usar:

Créditos ao autor da imagem: https://github.com/PengBAI/mariohtml5

Abaixo a estrutura de todos os arquivos que criamos

Criando nossos recursos na AWS com Terraform

Agora que já criamos todos os recursos necessário iremos rodar o seguinte comando para iniciar a construção dos recursos terraform

Dentro do diretório de resources, rode:

terraform init

A saída do comando deve ser algo parecido com…

Utilizamos o comando abaixo para validar nossos recursos declarados e visualizar todos que devem ser criados ou removidos.

terraform plan

A saída deste comando é bem extensa mas basicamente ele informa o caractere “+” para os recursos que devem ser criados e no final do arquivo ele mostra a quantidade de recursos que declaramos.

Agora vamos realmente criar nossa infra com o seguinte comando.

terraform apply

Este comando deve lhe pedir uma confirmação antes de realmente executar:

Após a confirmação a saída deve ser mais ou menos assim:

Agora você pode verificar no console da AWS que nossa instância já foi criada.

Você pode pegar o DNS ou o IP dessa instância e jogar a partir do seu navegador.

Após algumas horas de jogo você pode destruir toda aquela essa infra estrutura com apenas um comando.

terraform destroy

Este comando também requer confirmação.

Agora você pode criar e destruir essa infraestrutura de maneira mais fácil e sem perder tempo.

O Terraform salva o status da sua infra estrutura em alguns arquivos então é bom tomar cuidado com estes arquivos para que não seja necessário nenhuma ação manual no console da AWS.

Perceba que foram criados os arquivos:

terraform.tfstate
terraform.tfstate.backup

Os arquivos criados neste artigo estão todos comitados no seguinte repositório: https://github.com/Anderon-lima/Terraform-Docker-Super_mario

Anderson Lima

Written by

DevOps | Iac | Container | Orchestration

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade