Básico
Fluxo de Trabalho Principal
terraform init # instalar providers e módulos terraform plan # pré-visualizar alterações terraform apply # aplicar alterações terraform destroy # destruir todos os recursos
Comandos Essenciais
terraform initInicializar diretório de trabalho, baixar providers
terraform planExibir plano de execução sem aplicar
terraform applyAplicar alterações à infraestrutura
terraform destroyDestruir todos os recursos gerenciados
terraform fmtFormatar arquivos .tf no estilo canônico
terraform validateVerificar sintaxe da configuração
terraform showExibir estado atual ou plano
terraform outputImprimir valores de saída
Providers
Configuração de Provider
terraform { required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } } } provider "aws" { region = "us-east-1" }
Notas sobre Provider
sourceEndereço do registro (hashicorp/aws, hashicorp/google)
versionRestrição de versão (~> 5.0, >= 3.0, < 4.0)
.terraform.lock.hclArquivo de lock — confirmar no controle de versão
aliasUsar múltiplas configs para o mesmo provider
Recursos
Blocos de Recurso
resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t3.micro" tags = { Name = "web-server" } }
Meta-Argumentos de Recurso
depends_onDependência explícita de outro recurso
countCriar múltiplas instâncias (count = 3)
for_eachCriar instâncias a partir de um mapa ou conjunto
providerSelecionar um alias de provider não padrão
lifecyclePersonalizar comportamento de criação/atualização/destruição
Referenciando Recursos
# tipo.nome.atributo aws_instance.web.id aws_instance.web.public_ip aws_vpc.main.cidr_block
Variáveis
Declarando Variáveis
variable "region" { type = string default = "us-east-1" } variable "instance_count" { type = number description = "Número de instâncias" }
Definindo Valores de Variável
-var 'region=us-west-2'Flag de CLI
-var-file=prod.tfvarsCarregar de um arquivo .tfvars
terraform.tfvarsCarregado automaticamente se presente
TF_VAR_regionVariável de ambiente
Prompt interativoSolicitado no plan/apply se não houver padrão
Tipos de Variável
string"us-east-1"
number42
booltrue / false
list(string)["a", "b"]
map(string){ key = "val" }
object({...})Tipo estruturado com atributos nomeados
Saídas
Definindo Saídas
output "instance_ip" { value = aws_instance.web.public_ip description = "IP público do servidor web" } output "db_password" { value = random_password.db.result sensitive = true }
Comandos de Saída
terraform outputImprimir todas as saídas
terraform output instance_ipImprimir uma saída específica
terraform output -jsonFormato JSON para scripts
sensitive = trueOcultar valor da saída de CLI
module.vpc.vpc_idAcessar saídas de módulo filho
Estado
Backend Remoto
terraform { backend "s3" { bucket = "my-tf-state" key = "prod/terraform.tfstate" region = "us-east-1" } }
Comandos de Estado
terraform state listListar todos os recursos no estado
terraform state show <end>Exibir atributos de um recurso
terraform state mv <src> <dst>Renomear / mover um recurso no estado
terraform state rm <end>Remover recurso do estado (manter infraestrutura)
terraform state pullBaixar estado remoto para stdout
terraform import <end> <id>Importar infraestrutura existente para o estado
Módulos
Usando Módulos
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" cidr = "10.0.0.0/16" }
Fontes de Módulo
"./modules/vpc"Caminho local
"terraform-aws-modules/vpc/aws"Terraform Registry
"github.com/org/repo//module"Repositório GitHub
"s3::https://bucket/module.zip"Bucket S3
Estrutura do Módulo
modules/vpc/ main.tf # recursos variables.tf # variáveis de entrada outputs.tf # valores de saída
Fontes de Dados
Lendo Recursos Existentes
data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/*"] } owners = ["099720109477"] }
Fontes de Dados Comuns
data.aws_amiBuscar uma AMI por filtros
data.aws_vpcBuscar VPC existente
data.aws_caller_identityID da conta AWS atual
data.aws_regionRegião AWS atual
data.terraform_remote_stateLer saídas de outro arquivo de estado
data.externalExecutar programa externo para obter dados
Ciclo de Vida
Regras de Ciclo de Vida
resource "aws_instance" "web" { lifecycle { create_before_destroy = true prevent_destroy = true ignore_changes = [tags] } }
Opções de Ciclo de Vida
create_before_destroyCriar substituto antes de destruir o antigo
prevent_destroyErro se terraform destroy visar este recurso
ignore_changesNão detectar drift nos atributos listados
replace_triggered_byForçar substituição quando recurso referenciado muda
preconditionValidar suposições antes de aplicar
postconditionValidar resultados após aplicar
Padrões Comuns
Loops e Condicionais
# for_each com um mapa resource "aws_iam_user" "users" { for_each = toset(["alice", "bob"]) name = each.value } # recurso condicional count = var.create_db ? 1 : 0
Funções Úteis
file("key.pub")Ler conteúdo de arquivo
join(", ", list)Juntar lista em string
lookup(map, key, default)Pesquisa em mapa com fallback
length(list)Número de elementos
toset(["a", "b"])Converter lista para conjunto (para for_each)
try(expr, fallback)Retornar fallback se expr gerar erro
templatefile(path, vars)Renderizar um arquivo de template