Realizando deploys automatizados de instâncias EC2 com Load Balancer na AWS com Terraform

Share:



Hoje vamos abordar o quickstart de uma ferramenta muito bacana que eu estou estudando. O Terraform. Essa ferramenta foi criada e mantida pela Hashicorp e serve para realizar provisionamento de vários componentes de infraestrutura através de código, com base no conceito de IaC (Infraestructure as a Code) com foco em Cloud Providers como AWS, Azure, Google Cloud e etc.  Ele pode ser utilizado junto a outros gerenciadores de configuracão como Ansible, Chef e Puppet, e também pode substituir o uso dos mesmos em vários casos. Vou manter uma série de postagens sobre o mesmo junto a um repositório de exemplos no Github que eu estou usando de Sandbox para meus estudos.

Link do Repositório

Neste exemplo vamos fazer o deploy de duas instâncias EC2 rodando um webserver simples abaixo de um ELB (Elastic Load Balancer) que irá distribuir a carga dos requests HTTP entre elas, além de fazer o register delas automaticamente e implementar rotinas de health checks básicas para monitorar a saúde das mesmas. Vamos lá.

Instalação do Terraform

 O Terraform é um CLI que tem distribuição pra praticamente todas as plataformas. Em alguns casos você vai encontrar o mesmo no gerenciador de pacotes da sua distribuição, mas para fins generalistas vamos fazer a instalação diretamente da source da Hashicorp.

Docs do Terraform


Linux


$ wget https://releases.hashicorp.com/terraform/0.10.8/terraform_0.10.8_linux_amd64.zip
$ unzip terraform_0.10.8_linux_amd64.zip
$ chmod +x terraform
$ sudo mv terraform /usr/bin

Mais opções de instação

Setup das Credenciais da AWS

Será necessário que você gere uma Access Key e uma Secret Key de acesso no console do IAM no painel da AWS  para esse exemplo.

Configuração das Credenciais via AWS CLI 


$ aws configure




Configuração das credenciais via variáveis de ambiente


$ export AWS_ACCESS_KEY_ID="anaccesskey"
$ export AWS_SECRET_ACCESS_KEY="asecretkey"

variables.tf

Nosso arquivo é bem simples. Vamos criar somente 4 variáveis, a region onde iremos fizar a região default onde será realizado o deploy da nossa infraestrutura, a key_path onde teremos que alterar para apontar o caminho da sua chave pública. Será necessário especificar o caminho da home do seu usuário apontando para o arquivo id_rsa.pub, o ami onde iremos especificar o id da nossa AMI, neste exemplo estarei utilizando a versão mais recente da Amazon Linux e por fim o instance_type onde iremos utilizar o tamanho t2.micro.


main.tf

Esse arquivo é o arquivo mais importante. Nele vamos definir nossos resources, ou seja, nossos security groups, as duas EC2 de exemplo e nosso load balance referenciando as duas. Todas as variáveis que utilizamos no arquivo variables.tf vão ser referenciadas aqui.

Vamos começar declarando nosso cloud provider como AWS. Quando começarmos a configurar o ambiente, o Terraform irá procurar por essa configuração para fazer o bootstrap do nosso Deploy. Em seguida vamos criar as regras do nosso Security Group. Onde vamos liberar tráfego livre para a porta 80 da nossa aplicação.

Vamos criar dois objetos do tipo aws_instance chamados webserver001webserver002. Neles vamos referenciar a maioria das nossas variáveis criadas anteriormente, como o tipo da instância, o id da AMI, nossa Key Pair, Security Groups e etc.

Em seguida vamos configurar nosso Elastic Load Balancer. A configuração é bem simples. Iremos liberar a porta 80 como listener e referenciar as instâncias que estamos criando.



user-data

Vamos criar um diretório e dois arquivos .sh dentro. Esses scripts vão dar lugar ao user-data da instância, ou seja, são os scripts que serão executados no boot da máquina para realizar as configurações iniciais. Eles vão ser responsáveis por instalar o Apache (httpd) e iniciar o serviço dos mesmos. Em seguida vamos inserir uma imagem diferente em cada instância para diferenciarmos visualmente as instâncias durante o o teste. Bem simples.


$ mkdir user-data
$ touch user-data/{webserver001.sh,webserver002.sh}


webserver001.sh



webserver002.sh




Rodando o Deploy

Para realizar o deploy da nossa infra, vamos rodar o comando apply do Terraform. Esse comando irá ler todos os nosso resources que criamos nos arquivos e criar os mesmos na AWS via API. Mas antes precisamos executar o comando init para que o Terraform identifique o nosso cloud provider e faça o download de todos os assets necessários para o deploy do projeto.


$ terraform init
$ terraform apply


Agora no painel da AWS, vamos no console do EC2. Vamos aguardar que as duas instâncias fiquem com o state no modo running e passem em todos os Status Checks.


Agora na opção Load Balancers. Nele vamos para a aba Instances. Vamos verificar se todas as duas instâncias estão com o Status InService. Isso significa que as duas instâncias passaram em nossos health checks, ou seja, nosso serviço do Apache subiu conforme o previsto.


 Agora vamos copiar o DNS do nosso Load Balancer e acessar o mesmo várias vezes no nosso Browser.



Destruindo nossa Infra (God Mode) 

Para remover toda a infra que criamos é BEM simples e BEM divertido. As vezes quando estou estressado eu subo alguns templates do Terraform só pra destruir. Sério, queria que todas as pessoas do mundo sentissem isso.


$ terraform destroy




Veja os exemplos completos no Github 

Espero ter ajudado! :)

Um comentário: