Ramos da InformáticaDevOps e DevSecOpsTerraform: Melhores Práticas para Infraestrutura como Código

Terraform: Melhores Práticas para Infraestrutura como Código

-

Evite desastres na nuvem! Aprenda as melhores práticas de Terraform, incluindo modularização, gerenciamento seguro de State e versionamento de infraestrutura como código (IaC).

Existem muitas ferramentas dentro do universo do Infrastructure as Code (IaC), mas uma das preferidas é a Terraform.

Este artigo tem o objetivo de apresentar o que é o Terraform e as melhores práticas de uso da ferramenta.

Muitas dessas boas práticas são oficiais, oferecidas pela própria Hashicorp, fabricante do produto. Entretanto, outras são práticas que reconhecemos como boas ao longo baseadas em anos de utilização desta ferramenta. Vamos lá:

Dica de Leitura: Se você está explorando o universo do Terraform e Infrastructure as Code, é natural que também esteja interessado em outras ferramentas e tecnologias que otimizam a gestão de infraestrutura e aplicações. Uma delas é o Kubernetes, que oferece uma forma poderosa de orquestrar contêineres. Para entender melhor como o Kubernetes funciona e como ele pode ser útil em seu ambiente, leia nosso artigo Kubernetes explicado – com diagramas que fazem sentido, que traz uma visão clara e didática sobre essa tecnologia.

Afinal, o que é Terraform?

A ascensão das clouds públicas – como AWS, Azure e GCP – trouxe uma nova tendência muito citada quando o assunto é DevOps, que é a Infrastructure as Code (IaC).

Ferramentas como SaltStack, CloudFormation, Chef, Puppet, Vagrant, CFEngie e outras surgiram quase que simultaneamente. Mas nos dias de hoje, uma das ferramentas que a comunidade mais tem usado é o Terraform.

Como descrito em seu próprio site (em tradução livre), o Terraform é uma ferramenta para construção, manutenção e versionamento de infraestrutura de forma segura e eficiente. O Terraform pode gerenciar tanto provedores públicos quanto privados.

Boas práticas para trabalhar com o Terraform

Uma ferramenta tão relevante como o Terraform possui diversos usos e boas práticas. A seguir, vamos listar algumas delas.

1) Rode o comando terraform com ’var-file’

Com o var-file, você consegue gerenciar ambientes de forma mais fácil e evita uma longa lista de pares chave-valor para as variáveis ( -var chave=valor), transformando o comando em algo quase ilegível. Por exemplo:

$ cat config/dev.tfvars
name = "dev-stack"
s3_terraform_bucket = "dev-stack-terraform"
tag_team_name = "hello-world"
$ terraform plan -var-file=config/dev.tfvars

2) Sempre use backends para gerenciar os tfstates

Todas as vezes que recursos são criados via ‘terraform apply’, o arquivo tfstate é criado ou modificado. Se recursos são modificados ou novo recursos são adicionados, o tfstate é atualizado.

Em um time, vários membros podem modificar o código terraform. Logo, para manter o mesmo tfstate, deve-se usar um backend. Recomendamos mantê-lo em um S3 bucket.

3) Ative o controle de versão nos buckets dos tfstates

Sempre ative o versionamento do bucket S3 de backend. Dessa forma, você conseguirá acompanhar com mais precisão o que foi alterado (e quando) na infraestrutura. 

4) Nunca commit em seu repositório o tfstate

O tfstate armazena informações de mapeamento entre os recursos que você criou e sua real infraestrutura. Comitar estes arquivos gera vários riscos, tais como, por exemplo:

– Você pode estar expondo configurações de aplicação, passwords, string de conexões com bancos etc.

– Você pode estar executando um tfstate obsoleto ou antigo que ficou commitado.

5) Execute o Terraform em builds automatizados

Rodar código em uma ferramenta de build automatizado tem várias vantagens, que incluem ter um processo repetível e histórico de mudanças.

O conceito de build é bem útil quando aplicado ao Terraform, garantindo mais visibilidade sobre o que e quando foi alterado na infraestrutura (para auditoria ou mesmo, debug)

6) Não altere o tfstate manualmente (sempre use o CLI)

Quando quiser mover ou remover algum estado, não fique tentado a se aventurar pelo ftstate. É perfeitamente possível fazer a alteração manual, mas o tfstate pode se tornar um arquivo muito complexo e caótico.

A melhor forma é utilizar o CLI do Terraform, que lhe provê comandos como ‘terraform state rm’ e ‘terraform state mv’.

7) Ative o DEBUG quando precisar de troubleshooting

Às vezes, as mensagens de erro do Terraform podem ser bem incompreensíveis. Por isso, para facilitar o troubleshooting, ative o DEBUG do log do Terraform. 

Basta alterar o valor da variável de ambiente TF_LOG. Por exemplo: TF_LOG=DEBUG && terraform plan

8) Use o ‘terraform import’ para importar recursos

Recursos que já foram codificados não têm a necessidade de serem refeitos. Evite retrabalho.

9) Evite configurações ‘hard coded’ sempre que possível

Dentre as razões, podemos listar as várias formas de quebra de segurança e também dificuldade de editar essas configurações.

Algumas informações, como account id, account alias e region podem ser obtidas via data sources. Por exemplo:

data "aws_caller_identity" "current" {}
data "aws_iam_account_alias" "current" {}
data "aws_region" "current" {}

locals {
   account_id = data.aws_caller_identity.current.account_id
   account_alias = data.aws_iam_account_alias.current.account_alias
   region = data.aws_region.current.name
}

10) Use o ‘terraform fmt’

Sempre rode ‘terraform fmt’ para manter seus arquivos de configuração formatados. Você pode inclusive colocar a execução do ‘terraform fmt’ na sua esteira de CI/CD, sempre que for fazer o merge para o master. Por exemplo:

terraform validate
terraform fmt -check=true -write=false -diff=true

11) Use módulos compartilhados

Não há necessidade de ficar reescrevendo código. Por isso, utilizar módulos no terraform irá lhe poupar algumas boas horas de programação.

Para mais detalhes de como usar os módulos compartilhados, seguem alguns links de referência:

12) Atualize sempre a versão do Terraform

A Hashicorp nem sempre segue de perto as regras de versionamento semântico. Sem contar que novas funcionalidades liberadas pelos cloud provider podem não funcionar em versões antigas do Terraform, mesmo atualizando os plugins.

13) Rode o Terraform a partir de um container

Existem containers oficiais de Terraform que você pode usar. Com isso, você controla de forma mais fácil e transparente qual versão do Terraform está usando. 

Para esteira CI/CD, é extremamente recomendado usar essas imagens. Exemplo de utilização:

$ TERRAFORM_IMAGE=hashicorp/terraform:0.12.3
$ TERRAFORM_CMD=`docker run -ti --rm -w /app -v ${HOME}/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/app -w /app $TERRAFORM_IMAGE`
$ `TERRAFORM_CMD` init
$ `TERRAFORM_CMD` plan

14) Use a variável ‘self’

A variável ‘self’, como na maioria das linguagens de programação, se refere ao próprio objeto. E, no caso do Terraform, se refere ao resource.

Logo, sempre que precisar de alguma informação do próprio objeto que se esteja manipulando, use a sintaxe self.<ATTRIBUTE>

Vale observar que a sintaxe self.<ATTRIBUTE> só é permitida dentro de provisioners. Por exemplo:

resource "aws_ecr_repository" "jenkins" {
   name = var.image_name
   provisioner "local-exec" {
     command = "./deploy-image.sh ${self.repository_url}"
  }
}

15) Use plugins pré-instalados

Há uma forma de usar plugins pré-instalados no Terraform em vez de baixá-los a cada ‘terraform init’. 

Você pode usar estes plugins colocando-os no mesmo diretório do binário do Terraform ou passando a flag -plugin-dir.  Entenda melhor neste link de referência

16) Use o locking of state file

O Terraform oferece uma forma de realizar uma prevenção de execuções paralelas em cima de um mesmo tfstate. Este locking ajuda a garantir que apenas um membro do time esteja alterando configurações da infraestrutura em um mesmo momento.

Esse locking ajuda a prever conflitos, perda de dados e evita que o tfstate fique corrompido.

O DynamoDB pode ser usado como o mecanismo de locking. A tabela precisa ter uma chave chamada LockID. Por exemplo:


resource “aws_dynamodb_table” “terraform_state_lock” {
    name = “terraform-lock”
    read_capacity = 5
    write_capacity = 5
    hash_key = “LockID”
    attribute {
        name = “LockID”
        type = “S”
    }
}

terraform {
    backend “s3” {
        bucket = “terraformbackend”
        key = “terraform”
        region = “us-east-2”
        dynamodb_table = “terraform-lock”
    }
}

17) Não coloque credenciais hard-coded

Colocar as credenciais no código é uma enorme quebra de segurança, principalmente se forem suas credenciais pessoais (e não de serviço). Para evitar isso, temos 2 soluções rápidas:

Environment variables:

$ export AWS_ACCESS_KEY_ID=”accesskey”
$ export AWS_SECRET_ACCESS_KEY=”secretkey”
$ export AWS_DEFAULT_REGION=”us-west-2"
$ terraform plan

Shared credentials file:

provider “aws” {
    region = “sa-east-1”
    shared_credentials_file = “/Users/tf_user/.aws/creds”
    profile = “myprofile”
}

18) Gere o README para cada módulo com inputs e outputs

Um módulo bem documentado tem muito mais chances de ser utilizado. E você nem ao menos precisa gerar a documentação manualmente. 

Uma ferramenta chamada ‘terraform-docs’ pode criar esta documentação para você. Para mais detalhes, verifique o repositório da ferramenta.

19) Conheça as built-in functions, aprenda algumas e use-as!

O Terraform provê várias built-in functions e algumas delas podem ser realmente muito úteis quando se está criando infraestruturas mais completas. 

Várias podem realmente valer a pena de serem estudadas. Algumas delas são: chomp, format, indent, join, regex, replace, split, trim, upper, concat, contain, list, map, sort, base64encode, abspath, basename, fileexits, dateformat, timestamp, base64sha256, md5, tobool, tonumber, tostring, cidrhost, cidrnetmask, cidrsubnet, dentre outras.

20) Conheças “side-tools”

O Terraform, como qualquer ferramenta, linguagem ou framework, tem várias ferramentas de terceiros que facilitam muito sua utilização. Conheça algumas e use as que preferir. Algumas delas são, por exemplo: 

21) Visite o site Terraform Best Practices

Uma boa fonte de boas práticas é o site voltado para boas práticas, Terraform Best Practices. Acessá-lo periodicamente pode ser muito útil, pois ele está sempre sendo atualizado à medida que novas versões surgem.

Conclusão

Agora que você sabe o que é Terraform e mais de 20 boas práticas sobre ele, tem tudo para mandar muito bem no seu próximo projeto!

Tem mais alguma dica de boa prática de Terraform? Então deixe sua dica nos comentários e ajude o próximo!

LEIA TAMBÉM:

 

Perguntas Frequentes (FAQ): Boas Práticas Terraform

Por que não devo versionar o arquivo ‘terraform.tfstate’ no Git?

O arquivo de estado (state) pode conter informações sensíveis (como senhas de bancos de dados em texto puro) e causará conflitos constantes se vários desenvolvedores tentarem alterá-lo ao mesmo tempo. A boa prática é usar um Remote State (em S3, Azure Blob ou GCS) com travamento (Locking).

O que são módulos e quando devo usá-los?

Módulos são recipientes para múltiplos recursos que são usados juntos. Você deve usá-los sempre que quiser evitar repetição de código (DRY – Don’t Repeat Yourself). Por exemplo, criar um módulo padrão de “Instância de Servidor” garante que todos os servidores da empresa sigam as mesmas regras de segurança e tags.

Qual a diferença entre ‘terraform plan’ e ‘terraform apply’?

O plan cria um plano de execução, mostrando exatamente o que o Terraform fará na sua nuvem sem realizar nenhuma alteração real. O apply é o comando que efetivamente executa as mudanças. Revisar o plano antes de aplicar é uma das práticas de segurança mais vitais do DevOps.

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade dedicado a linguagens de programação, banco de dados, DevOps, Internet das Coisas (IoT), tecnologias da Indústria 4.0, cibersegurança e startups. Com curadoria de conteúdos de qualidade, o projeto é mantido por Ramos de Souza Janones.

Mais recentes

Como aprender a programar, um guia definitivo

Última atualização em 23/04/2026. Guia completo sobre: Como aprender a programar. Espero que este “guia” ou “manifesto”, como prefiro chamar, seja...

Stream Deck para Desenvolvedores: o Console de Comando do Futuro

Esqueça os streamers. Descubra como o Stream Deck se tornou o hardware essencial para Engenheiros de IA e Full...

Como Usar o Skills in Chrome no Brasil: Tutorial Completo de IA

A inteligência artificial já faz parte do nosso fluxo de trabalho, mas ter que reescrever os mesmos prompts repetidamente...

Context Engineering: Como Arquitetar Dados para LLMs e RAG

Na edição desta newsletter intitulada “Engenharia de Prompt: Não é só mais uma buzzword“: https://www.linkedin.com/pulse/engenharia-de-prompt-n%C3%A3o-%C3%A9-s%C3%B3-mais-uma-buzzword-de-souza-janones-tpkxf tratei sobre o tema...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Aprender Idiomas com Google Tradutor: Na Prática

O Google está lançando um novo recurso experimental com tecnologia de IA no Google Tradutor, projetado para ajudar as...

Comunidades Internacionais de Desenvolvedores

Descubra as melhores comunidades internacionais de devs para 2026: GitHub, Stack Overflow, Discord e mais. Comparativo de salários Brasil vs. exterior e guia de carreira remota.

Mais Lidos

Gestão de Atendimento Multicanal: O Guia Definitivo para Izing

Vamos conhecer mais um projeto open source brasileiro? O...

Cython: Guia Definitivo para Código Eficiente

Quando se trata de desempenho, Python pode deixar um...

Cursos Online Gratuitos com Certificado: Melhore o Seu Repertório

A internet está cheia de cursos online e gratuitos,...

Como Gerar Certificados Digitais Locais com OpenSSL PHP

Neste artigo você verá um passo a passo sobre...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.