Usando Terraform Locals para Padronização e Governança no Microsoft Azure
Olá pessoal! Blz?
Terraform é algo que você só aprende com o uso e no dia a dia, podemos até saber a teoria com o uso/estudo sempre vamos melhorando algo, eu ainda tenho muito que aprender mas gostaria de compartilhar como isso tem me ajudado e como estou fazendo para que além de ajudar algumas pessoas outras tragam formas de como eu posso melhorar e com essa troca de conhecimentos todos nós crescermos.
Ao trabalhar com Terraform para provisionar recursos em Microsoft Azure, é comum lidar com configurações repetitivas, nomes padronizados, tags, convenções de ambientes e valores derivados de múltiplas variáveis. É nesse cenário que os blocos Locals se tornam essenciais para manter o código limpo, legível, reutilizável e fácil de manter.
Este artigo explora o conceito de locals, boas práticas, exemplos reais e use cases aplicados ao Azure.
O que são Locals no Terraform?
Locals são valores nomeados definidos no Terraform que permitem armazenar expressões calculadas, strings compostas, mapas, listas ou qualquer valor reutilizável dentro de um módulo.
Eles funcionam como constantes internas, reduzindo duplicação e melhorando a clareza do código. Podemos usar para centralizar em um único local os seguintes itens:
- Abstração de regras corporativas
- Normalização de inputs inconsistentes
- Padronização de naming convention
- Centralização de decisões condicionais
- Redução de complexidade em módulos reutilizáveis
Exemplo básico
1
2
3
4
locals {
environment = "dev"
location = "eastus"
}
Uso:
1
2
3
4
5
Copy code
resource "azurerm_resource_group" "rg" {
name = "rg-${local.environment}"
location = local.location
}
No exemplo acima estamos utilizando o valor definido dentro do locals do valor environment, note que quando voce referencia o valor a palavra local fica no singular enquando na definição o bloco inicia-se no plural locals{}
Exemplo um pouco mais avançado
1
2
3
4
5
6
7
8
9
10
11
12
locals {
# Contexto geral
environment = lower(var.environment)
location = lower(var.location)
# Identidade da aplicação
application = "portal"
domain = "finance"
# Prefixo padrão corporativo
resource_prefix = "${local.domain}-${local.application}-${local.environment}"
}
No exemplo acima estamos para formar um valor que podemos usar depois nos nomes dos recursos e com isso manter em um único ponto a definição e padronização de nomenclatura.
Quando usar Locals (e quando não usar)
✅ Use locals quando:
Um valor é derivado de variáveis
Um valor é usado várias vezes
Você precisa padronizar nomes
Deseja centralizar regras de negócio
Trabalha com tags, nomes e convenções
❌ Evite usar locals quando:
O valor deve ser configurável externamente → use variable
O valor precisa ser exportado → use output
O valor é usado apenas uma vez
Estrutura recomendada para Locals
Boas práticas indicam separar os locals em um arquivo dedicado, eu prefiro dessa forma pois você não precisa ficar a procura de onde declarou o locals dentro de um arquivo terraform, tendo isso separado fica muito mais fácil quando outra pessoa da equipe precisa mentar e/ou realizar updates:
1
2
3
4
5
📦
┣ 📜main.tf
┣ 📜locals.tf
┣ 📜output.tf
┗ 📜variables.tf
Como eu tenho usado o Locals em meus projetos
Basicamente tenho usado o Terraform Locals para me ajudar na definição de nomenclatura de recursos, centralizar as TAGs e para um ambiente onde podemos ter diferentes SKUs para cada ambiente nos ajuda também nessa definição. Abaixo vou demonstrar de forma básica alguns usos que tenho feito:
1. Padrão Corporativo de Tags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
locals {
governance_tags = {
Environment = local.environment
Application = local.application
Domain = local.domain
ManagedBy = "Terraform"
CostCenter = var.cost_center
Owner = var.owner
DataClass = var.data_classification
}
effective_tags = merge(
local.governance_tags,
var.extra_tags
)
}
No recurso que precisamos definir as TAGs colocamos apenas a linha
tags = local.effective_tags.
2. Naming Convention Corporativo (Azure)
O Azure impõe restrições específicas de naming (tamanho, caracteres, unicidade global). Usar locals para encapsular isso é obrigatório em escala.
1
2
3
4
5
6
7
8
9
10
locals {
sanitized_prefix = replace(local.resource_prefix, "-", "")
names = {
resource_group = "rg-${local.resource_prefix}"
storage = "sa${local.sanitized_prefix}"
key_vault = "kv-${local.resource_prefix}"
log_analytics = "log-${local.resource_prefix}"
}
}
Por exemplo ao criar uma Azure Storage Account colocamos apenas a linha
name = local.names.storage.
3. Definições baseadas em ambiente
Em Landing Zones baseadas no CAF, decisões variam conforme o ambiente. No exemplo abaixo para ambientes de produção temos um padrão e para ambientes não produção outros padrões:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
locals {
backup = {
prod = {
backup_enabled = true
log_retention = 90
sku = "Premium"
}
nonprod = {
backup_enabled = false
log_retention = 30
sku = "Standard"
}
}
backup_profile = local.environment == "prod" ? local.backup.prod : local.backup.nonprod
}
Para usar os valores podemos definir da seguinte forma onde for necessário:
1
2
backup_enabled = local.caf_profile.backup_enabled
sku_name = local.caf_profile.sku
Concluindo!
À medida que ambientes Azure crescem em complexidade, a infraestrutura como código deixa de ser apenas um mecanismo de provisionamento e passa a representar uma camada estratégica de governança e padronização. Nesse contexto, o Locals assumem um papel fundamental ao permitir que regras corporativas, convenções de nomenclatura, políticas de tagging e decisões condicionais sejam centralizadas e declaradas de forma clara e reutilizável.
Mais do que simplificar o código, locals viabilizam consistência em escala, reduzem erros operacionais e facilitam a adoção de modelos como Azure Landing Zones e Cloud Adoption Framework. Utilizá-los de forma consciente é um dos principais diferenciais entre implementações Terraform pontuais e plataformas maduras, preparadas para crescer de forma segura, governada e sustentável.
Bom pessoal, eu tenho usado isso em alguns ambientes e acredito que possa ser bem útil a vocês!
Artigos relacionados
Compartilhe o artigo com seus amigos clicando nos icones abaixo!!!
