Automatizando infraestrutura com Terraform

Ana Catharina Mesquita
Vindi
Published in
7 min readFeb 5, 2021

Acredito que exista um ciclo natural em criar uma solução, primeiro descobrir o problema, entende-lo, gerar uma solução, criar um processo (sistema) e entregar para o cliente a solução de fato.

Quando se trata de uma solução que envolve um sistema web, é natural que se fale em desenvolvimento ágil, client-server, arquitetura limpa, reutilização de código e tudo mais. Contudo, a maioria das soluções que precisam ser disponibilizadas via internet, que clientes de qualquer lugar do mundo, ou não, acessem e consigam solucionar o seu problema.

O foco desse artigo vai ser mostrar como podemos entregar nossa solução web utilizando ferramentas interessantes para gerar a infraestrutura para o projeto.

Instalações e configurações iniciais

Atualmente, exitem duas ferramentas que facilitam e automatizam o processo de criação e atualização de uma infraestrutura na nuvem (remota), elas são: Amazon AWS e o Terraform.

Amazon AWS

Segundo o próprio site, a Amazon Web Services (AWS) é a plataforma de nuvem mais adotada e mais abrangente do mundo, oferecendo mais de 175 serviços completos de datacenters em todo o mundo. Milhões de clientes, incluindo as startups de crescimento mais rápido, grandes empresas e os maiores órgãos governamentais, estão usando a AWS para reduzirem seus custos, ficarem mais ágeis e inovarem mais rapidamente.

Ou seja, é uma plataforma completa para auxiliar além das nossas entregas de soluções.

Terraform

Já o Terraform é um projeto, de código aberto, que auxilia via programação a gerar, manter e organizar uma infraestrutura simples a complexa. A principal ideia é além de manter a infraestrutura versionada, é trazer segurança e controle sobre todos os serviços que podemos utilizar em um provedor.

Mas o que une a AWS com o Terraform?

Com o Terraform podemos programar a infraestrutura completa para vários provedores, incluindo a AWS. Ou seja, utilizando o Terraform podemos configurar os diversos serviços oferecidos pela a AWS e assim não precisar manipular e configurar manualmente cada um deles, otimizando o trabalho de quem gerencia uma infraestrutura.

Entendendo o que é o Terraform, AWS e como eles se relacionam, iremos criar uma solução de ponta a ponta, exemplificando desde o problema até a aplicação no ponto de utilização.

Do problema a solução

O problema que iremos resolver é um portfólio para um desenvolvedor full-stack. Esse desenvolvedor precisa mostrar além dos projetos que ele já realizou, demonstrar quais as tecnologias que ele domina e quais são as suas redes sociais.

Uma das soluções que podemos oferecer a esse desenvolvedor é um site estático que irá conter todas as informações que ele precisa demonstrar e ficará disponível para acesso dos interessados em saber mais sobre ele.

Fonte: o autor

Iniciando pela infra

Com a figura acima entendemos que iremos precisar de um serviço da AWS que é o bucker S3, que nada mais é do que uma pasta capaz de servir um site estático. Com isso, iremos agora configurar toda a infraestrutura para esse projeto, que será, inicialmente, criar um bucket para adicionar os arquivos do projeto.

Instalando o Terraform

Seguindo a instalação sugerida pela documentação, iremos baixar o pacote para a plataforma que utilizaremos, aqui irei seguir com o Linux, mas as instruções para as outras plataformas não diferem tanto.

Após baixar, iremos descompactar o aquivo terraform_0.14.5_linux_amd64.zip e moveremos para a pasta /usr/local/bin/terraform

cd /home/$USER/Downloads/terraform_0.14.5_linux_amd64/sudo mv terraform /usr/local/bin/terraform

Para validar que o comando terraform está funcionando bem, execute:

terraform --version
> Terraform v0.14.5

Criando estrutura padrão de pastas

Com o Terraform instalado na sua máquina, iremos iniciar a estrutura de pastas para seguirmos no nosso projeto.

mkdir -p portfolio/terraformcd portfolio/terraform

A pasta portfolio será a raiz para criarmos todos os documentos e projetos necessários para a solução.

Já a pasta terraform, irá conter todos os arquivos necessários para criação da nossa infraestrutura.

Configurando um usuário na AWS

Para que possamos criar nossa infraestrutura, iremos precisar de uma conta na AWS configurada. Não irei explicar como se cria essa conta aqui, mas vou indicar esse link para auxiliar caso não tenha uma conta.

Importante: durante a criação será preciso adicionar um cartão de crédito internacional válido, contudo a conta gratuita irá nos atender tranquilamente.

Esse outro link é mostrado como se cria um usuário administrador e ao criar teremos duas informações importantes access_key e secret_access_key que são as credenciais que serão utilizadas para acessar e criar a infra pelo Terraform.

Para que possamos seguir com segurança e não expormos nenhuma chave, iremos configurar o AWS CLI e configurar na nossa máquina o usuário que acabamos de criar.

pip install awscli

Ou

sudo apt-get install awscli

Testando a instalação

aws --version
> aws-cli/1.18.69 Python/3.8.5 Linux/5.8.0-41-generic botocore/1.16.19

Seguindo com a configuração do nosso usuário:

aws configure
AWS Access Key ID [****************EGC6]: ACCESS_KEY
AWS Secret Access Key [****************fBr5]: SECRET_ACCESS_KEY
Default region name [us-east-1]: us-east-1
Default output format [None]: json

Pronto, agora estamos pronto para seguir com a criação da nossa infraestrutura

Criando o bucket

A infraestrutura que iremos criar será declarar duas coisas, o provedor (aws, google-cloud,etc...) utilizaremos e um recurso (aws_s3_bucket) para ele.

Então, na pasta portfolio/terraform crie um arquivo nomeado de main.tf, é nele que iremos declarar toda nossa infra: provedor e recursos.

Entendendo o que acabamos de escrever, iniciamos declarando o provider como aws e que a região é us-east-1. Ao fazer isso, estamos sinalizando para o Terraform que iremos utilizar a AWS como provedor da nossa infraestrutura e que todos os recursos que criaremos a seguir será para a mesma.

Como mencionado, precisamos criar um recurso no Terraform para ser utilizado o serviço S3 da AWS. Essa frase é importante porque temos as duas palavras chaves para entender o segundo bloco: recurso e S3.

O segundo bloco declara que queremos um recurso do tipo aws_s3_bucket de nome web . O nome web irá servir como um identificador do recurso dentro no Terraform, caso queira referenciá-lo em outro momento.

Dentro do bloco temos quatro informações necessárias para criação do bucket, que são: bucket, acl, policy e website.

  • bucket: Contém o nome da pasta que será criada na S3
  • acl: é o nível de permissão que será dado ao bucket, que pode ser private, public-read, public-read-write, aws-exec-read, authenticated-read, e log-delivery-write.
  • policy: É a politica do bucket definida pela AWS, nela sinalizamos quais ações e recursos. Para mais informações acesse o link.
  • website: Essa é a configuração que sinaliza que o bucket criado será um servidor de página estático, declarando qual o aquivo index e o arquivo caso ocorra algum erro.

As outras opções para essa configuração podem ser encontradas nesse link1

Com a nossa main.tf configurada, seguimos para os comando para de fato criar essa infraestrutura:

/* Formata os arquivos *.tf*/
terraform fmt
/* Inicia o Terraform, baixando dependências necessárias */
terraform init
/* Cria o plano que será executado, caso tenha algum erro, aqui será detectado */
terraform plan
/* Aplica o plano criado e de fato comunicar com a aws e cria a infraestrutura */
terraform apply -auto-approve

Caso todos os comando rodem sem erro, podemos conferir na AWS se o nosso bucket foi criado como gostaríamos. Para validar, acesse a página da s3 e valide que temos 1 bucket criado com o nome que colocastes.

Criando um projeto front-end

Com nossa infraestrutura configurada, podemos focar na solução para o portfólio para o nosso desenvolvedor full-stack. Nesse momento, podemos criar um projeto utilizando qualquer framework ou até mesmo manualmente.

Para a dinâmica do artigo, irei criar um projeto simples em React para criar o portfólio. Então, rodando os comandos:

cd portfolio/yarn create react-app frontend

Alterando o arquivo App.js para:

Com isso, temos nosso site iniciado. Com essa alteração, já podemos fazer o nosso primeiro deploy.

Unindo os mundos

No package.json na parte dos scripts iremos adicionar o nosso script de deploy:

Com essa alteração podemos então, criar o build da nossa aplicação e executar o deploy:

yarn buildyarn deploy

Agora podemos acessar o bucket criado na S3, na aba Propriedades, no fim da página tem uma sessão chamada Hospedagem de site estático e lá terá o link para o seu site.

Fonte: O autor

Concluindo

Para evoluir esse estudo sobre Terraform, AWS e Infraestrutura no geral, podemos aplicar mais camadas para deixar esse projeto mais completo, como por exemplo um domínio próprio, redirecionamento de rotas, certificado SSL (HTTPS) e mais. O importante é entender a infraestrutura necessária para entregar a sua solução e buscar os meios para aplicá-la.

E assim concluímos esse artigo, que tinha o objetivo de mostrar como é construído um site estático de deixá-lo disponível para qualquer pessoa do mundo acessar.

Até a próxima!

--

--