Desafios Avançados em Terraform: Teste seus Conhecimentos
Casos práticos, padrões de design e exercícios que empurram limites da Infraestrutura como Código com foco em qualidade, repetibilidade e governança.
>= 1.5
Estado Centralizado
1) Arquitetura modular avançada e backends consistentes
Casos práticos de organização de código com módulos bem definidos e backends robustos que garantem estado centralizado, isolamento entre ambientes e governança de mudanças.
- Design de módulos por domínio com interfaces públicas claras.
- Backends compartilhados (S3 + DynamoDB) para estados entre equipes.
- Versionamento de módulos e controle de compatibilidade entre versões.
// Backend e providers (exemplo com AWS)
terraform {
required_version = ">= 1.5"
backend "s3" {
bucket = "tf-state-prod"
key = "infrastructure/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "tf-state-lock"
encrypt = true
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
// Exemplo de uso de módulo público/privado
module "network" {
source = "./modules/network"
env = "prod"
vpc_id = data.aws_vpc.main.id
}
2) Gerenciamento de estados, ambientes e isolação
Estruture ambientes com isolamento de estado e uso consciente de workspaces para evitar colisões e drift entre ambientes.
- Separação por backend por ambiente ou pelo uso de workspaces, conforme necessidade.
- Locais e variáveis dependentes do workspace atual para seleção de recursos.
- Definir regiões e provedores por ambiente para reduzir blast radius.
// Exemplo simples com terraform.workspace e map de regiões
locals {
current_env = terraform.workspace
}
provider "aws" {
region = lookup(var.regions, local.current_env, "us-east-1")
}
variable "regions" {
type = map(string)
default = {
dev = "us-west-2"
staging = "us-east-1"
prod = "us-east-2"
}
}
3) Padrões de design e casos de uso avançados
Aplique padrões com loops, blocos dinâmicos e lifecycle para alcançar implantação idempotente e previsível.
- Uso de for_each para criar recursos repetidos com mapeamento de ambientes.
- Dynamic blocks para configurações condicionais (por exemplo, regras de segurança).
- Lifecycle com create_before_destroy para evitar downtime em atualizações.
// Exemplo avançado: instâncias com for_each e dynamic blocks
variable "app_instances" {
type = map(object({
subnet_id = string
instance_type = string
}))
default = {
dev = { subnet_id = "subnet-aaaa", instance_type = "t3.micro" }
prod = { subnet_id = "subnet-bbbb", instance_type = "t3.medium" }
}
}
resource "aws_instance" "app" {
for_each = var.app_instances
ami = data.aws_ami.latest.id
instance_type = each.value.instance_type
subnet_id = each.value.subnet_id
lifecycle {
create_before_destroy = true
}
tags = {
Environment = each.key
}
}
data "aws_ami" "latest" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["amzn2-ami-hvm-2.0.*-ebs.standard.x86_64-ebs"]
}
}
4) Validação, testes e governança de código
Práticas para manter código robusto, legível e previsível, com foco em validação estática, consistência de formatação e preservação de comportamento entre regravações de estado.
- Validação estática com terraform fmt e terraform validate.
- Bloqueio de provedores para reprodutibilidade (terraform providers lock).
- Geração de planos para revisão antes de aplicar mudanças reais.
// Procedimento recomendado (comandos)
# Formatar código
terraform fmt
# Validar sintaxe e referências
terraform validate
# Gerar plano de execução (salvar para revisão)
terraform plan -out=tfplan
# Mostrar plano de forma legível
terraform show -no-color tfplan
Observação: mantenha políticas de governança claras para mudanças de estado, com revisão de mudanças via pull requests e aprovação de arquitetos antes de aplicar alterações críticas.
Vamos além: explore mais conteúdos para aprofundar seu domínio em Terraform e Infraestrutura como Código.
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!