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.
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:
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 deplan
, 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
- 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)
por favor...
Opa, acompanhando padim
Excepcional! Vou aguardar ansiosamente pelo próximo artigo.