DEV Community

Cover image for Iniciando com Atlantis
Bruno Padilha
Bruno Padilha

Posted on • Edited on

Iniciando com Atlantis

Oi! Esse dev.to não será mais atualizado, agora eu tenho um Substack com temas do tipo. Me segue por lá! => https://blog.padz.dev


Esse é o primeiro post de uma série sobre o Atlantis, onde o intuito é dar um mega salto no fluxo de trabalho de quem já utiliza Terraform no dia dia. Se você já:

  • Utiliza Terraform para criar infraestrutura
  • Ainda usa o Terraform local
  • E sente falta de um ambiente mais colaborativo para desenvolver sua infraestrutura.

Essa série é para você!

Vamos passar por alguns pontos básicos de como a ferramenta funciona e até explorar alguns modos de deployment. Tudo isso com um repo no Github para te ajudar com configuração e exemplos.

Caso você não tenha experiência prévia com Terraform, super recomendo o conteúdo do Igor Souza no Youtube. :)


O que é o Atlantis

O Atlantis é uma aplicação que automatiza através de Pull Requests a forma como rodamos o Terraform.

Gosto muito da definição do Matheus Fidelis, que o Atlantis permite fazer GitOps para Terraform.

Ele funciona ouvindo Webhooks de plataformas de Git como: Github, Gitlab ou do Bitbucket e retorna o output dos comandos terraform plan e terraform apply através de comentários. Ou seja, todo fluxo de trabalho que antes era feito via CLI, terminal, pipeline do Jenkins, agora é feito nos comentários de uma Pull Request.


Exemplo de fluxo no trabalho. 🙂

De uma forma mais simples, o Atlantis atua como uma "ponte" entre o Terraform e a plataforma de Git tornando os plans e applies muito mais colaborativos. Mas por quê? Oras, infraestrutura como código é uma abordagem de automação de infraestrutura baseada em princípios de desenvolvimento de software, com reviews, testes, CI/CD e etc...


Antes de iniciar

Como mencionei acima, o Atlantis é uma espécie de wrapper do Terraform, por isso, a partir do momento que o Atlantis é adotado, é ele quem define qual versão do Terraform está rodando e é ele quem conhece as secrets e keys dos provedores de cloud, serviços e etc...

Por isso, a primeira dica é ficar de olho nas releases do projeto para saber se a última versão do Terraform já é suportada pelo Atlantis. E não necessariamente utilizar a última versão do Atlantis requer que você atualize seus projetos, por exemplo, é possível utilizar a última versão do Atlantis e para cada repo/projeto utilizar uma versão diferente do Terraform. Veremos sobre isso mais pra frente.

Um pouco de mundo real...

Para os projetos do time de e-commerce da Leroy Merlin, nós rodamos o Atlantis como container no Kubernetes, utilizamos Terraform Cloud como backend e uma abordagem com monorepo e multirepo. Alguns projetos como IAM, configuração do Vault e coisas relacionadas a sec, ficam fora do monorepo por uma questão de segurança.

Nos outros repositórios todo o time de engenharia possui acesso e cada módulo e projeto, possui documentação para auxiliar a criar novos recursos.

Dependendo do repositório e do projeto é necessário que haja no mínimo "x" aprovações para rodar um atlantis apply, em outros é necessário aprovação de CODEOWNERS. O ponto é que não importa sua estrutura atual ou o que você está planejando, o Atlantis vai suportar.

De uma forma gráfica, o Atlantis funciona assim no nosso time:


Fluxo do Atlantis no time de e-commerce da Leroy Merlin.


Indo mais a fundo

Nessa série de posts, utilizarei Github, Kubernetes e AWS. E durante ela, você irá encontrar nesse repo mais informações e formas de deploy.

Requerimentos

Git

O Atlantis suporta as principais plataformas de Git como:

  • Github
  • Gitlab
  • Bitbucket
  • Azure DevOps

Backend

O Atlantis suporta todos os tipos de backend, menos o local, já que o Atlantis não tem um banco de dados e não commita o state no git (o que é um mega anti-pattern).

Estrutura de diretório e repositórios

Qualquer seja a estrutura utilizada, o Atlantis vai rodar sem problemas. É possível utilizar:

  • Monorepo com vários projetos
  • Único repo com um único projeto
  • Monorepo com vários projetos e + módulos
  • Multirepo (basta ter um webhook para cada um deles)

É possível também utilizar Workspaces.

Arquitetura

O Atlantis é uma aplicação desenvolvida em Go. Com um binário por volta de 40MB e com uma imagem docker por volta de 250MB é super simples de subi-lo no Kubernetes, ECS / Fargate ou instalá-lo em uma instância.

A comunicação entre o Atlantis e o plataforma de Git é intrínseca. Por exemplo, o Atlantis precisa receber os Webhooks e fazer chamadas para as APIs da plataforma de Git utilizada. Em caso de serviços externos, o Atlantis precisa responder por uma URL válida, já em casos de serviços internos como Github Enterprise, Gitlab Enterprise e Bitbucket Server, isso já não é necessário.

Importante
O Atlantis não possui um banco de dados, todos os arquivos de plan, binários dos providers e etc são salvos em disco.

Configuração

Existem alguns métodos de configurar o Atlantis:

  • Utilizando flags no comando atlantis server, onde também é possível utilizar arquivo de configuração e ENV VARs. Por exemplo: ```sh

Flags

atlantis server --gh-token="token/123456/ABCDE"

ENV VAR

ATLANTIS_GH_TOKEN='token/123456/ABCDE' atlantis server


* Arquivo de configuração para cada repo. Onde o arquivo de configuração `repos.yml` fica junto do server.
* Arquivo de configuração em cada repositório. Onde cada repo possui o seu `atlantis.yml`.

### Utilização

Como deu pra notar, a principal diferença é que a partir de agora, o comando para rodar o Terraform mudou. O comando a ser chamado agora é o `atlantis`. Existem três principais subcomandos:

* `atlantis plan` que roda o `terraform plan` na branch de uma determinada Pull Request. É possível configurar para rodar de forma automática a cada novo commit, evitando intervenções manuais.
* `atlantis apply` que roda o `terraform apply` no plan executado anteriormente. 
* `atlantis help` que mostra a ajuda do Atlantis.

E claro, existem algumas flags em comum no `plan` e no `apply`, que no caso são as:

* `-w` que roda o plan ou apply contra um determinado workspace.
* `-d` que roda o plan ou apply de um projeto dentro de um diretório. Ele é importante quando a uma criação, alteração ou deleção de vários recursos em vários projetos em um único Pull Request. Se não especificado, roda em todos diretórios novos.

```sh


# Roda um plan para no diretório app1
atlantis plan -d app1

# Roda um plan no diretório aws/iam
atlantis plan -d aws/iam


Enter fullscreen mode Exit fullscreen mode
  • E existe o -p que roda plan e apply para um projeto.

É possível também utilizar flags do Terraform, como -target, -var e -var-file.

Gerência do state

Assim como o Terraform, o Atlantis trabalha com state locking. Esse processo ocorre toda vez que um atlantis plan é executado e o state só será liberado quando a Pull Request for mergeada, fechada ou o plan é deletado de forma manual.

Vale a pena reforçar que esse state locking é do Atlantis e não do Terraform, onde o state do Atlantis é feito para prevenir várias Pull Requests trabalhando no mesmo projeto e o state do Terraform é feito para prevenir mudanças durante um terraform apply. Mais infos aqui.


Concluindo

Nessa primeira parte, abordamos o básico do Atlantis, como ele funciona, qual problema ele resolve e os motivos de utilizá-lo.

Nos próximos posts iremos nos aprofundar nos passos de instalação, configuração e como trabalhar de uma forma inteligente com Terraform.

Até mais!

Top comments (3)

Collapse
 
igordcsouzaaa profile image
Igor Souza • Edited

por favor...

Collapse
 
henrik_oliveira profile image
Henrique Oliveira

Opa, acompanhando padim

Collapse
 
rafaotetra profile image
Rafael Silva

Excepcional! Vou aguardar ansiosamente pelo próximo artigo.