Fundamentação Teórica: Apply and Manage Tags on Resources
1. Intuição Inicial​
Imagine que você gerencia um datacenter fÃsico com centenas de servidores. Para saber quais servidores pertencem ao time de desenvolvimento, quais são de produção, quais são do projeto de e-commerce e quais do ERP, você coloca etiquetas fÃsicas em cada servidor. Quando chega a conta de energia, você consegue calcular quanto cada projeto consumiu porque sabe exatamente quais servidores pertencem a cada um.
No Azure, tags são exatamente essas etiquetas, mas digitais. Uma tag é um par chave:valor que você associa a qualquer recurso Azure. São metadados que você define livremente para categorizar, organizar e rastrear seus recursos de acordo com as necessidades da sua organização.
Exemplo concreto:
| Chave | Valor |
|---|---|
| Environment | Production |
| CostCenter | CC-2045 |
| Project | ecommerce-v2 |
| Owner | time-backend |
| CreatedBy | pipeline-devops |
Com essas cinco tags em cada recurso, você consegue responder perguntas como: "Quanto o projeto ecommerce-v2 gastou esse mês?" ou "Quais recursos pertencem ao time-backend?" ou "Quais recursos de produção não têm dono definido?"
2. Contexto​
Onde tags se encaixam na governança Azure​
Tags são uma peça fundamental da estratégia de governança de qualquer organização que opera no Azure em escala. Elas são o mecanismo que conecta recursos técnicos a contexto de negócio.
Por que tags existem​
O Azure não tem como saber que uma VM especÃfica pertence ao projeto X do departamento Y. Essa informação é de negócio, não técnica. Tags são o mecanismo pelo qual você injeta contexto de negócio na infraestrutura técnica.
Sem tags, a fatura do Azure mostra linhas de custo por tipo de recurso e subscription, sem nenhuma correlação com projetos, times ou centros de custo. Com tags, você obtém visibilidade granular de gastos alinhada ao seu modelo organizacional.
3. Construção dos Conceitos​
3.1 O que é uma tag tecnicamente​
Uma tag é um par chave:valor armazenado como metadado no Azure Resource Manager (ARM) associado a um recurso. Tecnicamente:
Limites técnicos por recurso:
| Limite | Valor |
|---|---|
| Tags por recurso ou Resource Group | 50 |
| Comprimento máximo da chave | 512 caracteres |
| Comprimento máximo do valor | 256 caracteres |
| Comprimento máximo da chave (Storage Accounts) | 128 caracteres |
| Comprimento máximo do valor (Storage Accounts) | 256 caracteres |
3.2 Case sensitivity​
Tags são case-insensitive para chaves na mesma perspectiva de um único recurso, mas case-sensitive em filtros e queries. Isso significa que Environment e environment são tratados como a mesma chave no mesmo recurso, mas ao filtrar recursos pelo portal ou CLI, você precisa usar a capitalização exata que foi usada.
A prática recomendada é definir uma convenção de capitalização e segui-la rigorosamente. Os padrões mais comuns são:
- PascalCase:
CostCenter,ProjectName,Environment - lowercase:
costcenter,projectname,environment - kebab-case:
cost-center,project-name,environment
Escolha um padrão e use Azure Policy para enforçá-lo.
3.3 Quais recursos suportam tags​
A maioria dos recursos Azure suporta tags, mas não todos. Recursos que não suportam tags incluem:
- Azure AD (usuários, grupos, service principals)
- Recursos clássicos (modelo de deployment antigo)
- Alguns tipos de sub-recursos e recursos de sistema
Para verificar se um tipo de recurso suporta tags, consulte a documentação de cada resource provider ou use:
az provider show --namespace "Microsoft.Compute" \
--query "resourceTypes[?resourceType=='virtualMachines'].capabilities"
3.4 Tags não são herdadas automaticamente​
Este é o ponto mais importante e mais frequentemente mal compreendido sobre tags no Azure:
Tags em um Resource Group NÃO são propagadas automaticamente para os recursos dentro dele.
Se você taga o RG com Environment: Production, as VMs, storage accounts e outros recursos dentro do RG não recebem essa tag. Cada recurso tem seu próprio conjunto de tags independente.
Da mesma forma, tags em uma Subscription não são propagadas para os RGs ou recursos dentro dela.
VM-Web-01 e Key Vault estão sem tags apesar de estarem num RG taggeado. Para garantir que recursos herdem tags do RG, é necessário usar Azure Policy com efeito Modify (coberto na seção de integração).
4. Visão Estrutural​
Fluxo de decisão para estratégia de tagging​
Como tags se integram com outros serviços​
5. Funcionamento na Prática​
Ciclo de vida de uma tag​
Comportamentos importantes e não óbvios​
Tags em Resource Groups são independentes dos recursos dentro.
Um RG pode ter a tag Environment: Production e conter recursos sem nenhuma tag, ou com tags diferentes. O RG é um escopo de gestão, não um contêiner que propaga suas propriedades.
Tags são propriedades do recurso no ARM, não dentro do recurso. Tags não afetam o funcionamento do recurso. Uma VM com ou sem tags tem comportamento idêntico. As tags existem apenas no plano de gerenciamento (ARM), não no plano de dados.
Modificar tags de um recurso não causa downtime. Adicionar, modificar ou remover tags é uma operação no metadata do recurso. Não reinicia serviços nem afeta disponibilidade.
Tags participam do Azure Resource Graph para queries complexas. Com tags consistentes, você pode fazer queries poderosas como "todos os recursos de produção sem tag de owner, em todas as subscriptions":
Resources
| where tags['Environment'] == 'Production'
| where isnull(tags['Owner'])
| project name, type, resourceGroup, subscriptionId
Alguns serviços propagam tags para recursos filhos. Por exemplo, ao criar uma VM, o Azure pode propagar as tags da VM para os discos e NICs associados, dependendo da configuração. Mas isso é comportamento especÃfico de alguns resource providers, não uma regra geral.
6. Formas de Implementação​
Portal do Azure​
Quando usar: aplicação pontual em recursos individuais, revisão visual de tags, correção manual
Para aplicar tags em um recurso:
- Navegue até o recurso
- No menu lateral, clique em Tags
- Digite a chave e o valor nos campos fornecidos
- Clique em Apply
Para aplicar tags em múltiplos recursos via portal:
- Use o Azure Resource Manager > Tags no portal para filtrar e editar tags em escala (limitado, menos prático para muitos recursos)
Limitação: não escala, não é reproduzÃvel, erros de digitação criam inconsistências.
Azure CLI​
# Aplicar tags em um recurso (substitui tags existentes pelo conjunto especificado)
az resource tag \
--tags Environment=Production CostCenter=CC-2045 Project=ecommerce-v2 \
--resource-group "rg-producao" \
--name "vm-web-01" \
--resource-type "Microsoft.Compute/virtualMachines"
# Aplicar tags em um Resource Group
az group update \
--name "rg-producao" \
--tags Environment=Production CostCenter=CC-2045 Owner=time-backend
# IMPORTANTE: O comando acima SUBSTITUI todas as tags existentes.
# Para ADICIONAR tags sem perder as existentes, use --set:
az resource update \
--resource-group "rg-producao" \
--name "vm-web-01" \
--resource-type "Microsoft.Compute/virtualMachines" \
--set tags.NewTag=NewValue
# Remover uma tag especÃfica sem afetar as outras
az resource update \
--resource-group "rg-producao" \
--name "vm-web-01" \
--resource-type "Microsoft.Compute/virtualMachines" \
--remove tags.OldTag
# Listar recursos com uma tag especÃfica
az resource list \
--tag Environment=Production \
--output table
# Listar recursos SEM uma tag especÃfica (requer Resource Graph)
az graph query \
-q "Resources | where isnull(tags['CostCenter']) | project name, type, resourceGroup"
# Aplicar tags em todos os recursos de um RG (script bash)
for resource_id in $(az resource list --resource-group "rg-producao" --query "[].id" -o tsv); do
az resource tag \
--ids "$resource_id" \
--tags Environment=Production CostCenter=CC-2045
done
Atenção crÃtica:
az resource tageaz group update --tagssubstituem o conjunto completo de tags. Se você especificar apenas uma tag, todas as outras são removidas. Para adicionar tags mantendo as existentes, useaz resource update --set tags.ChaveNova=Valor.
Azure PowerShell​
# Aplicar tags em um Resource Group (substitui todas as tags existentes)
Set-AzResourceGroup `
-Name "rg-producao" `
-Tag @{
Environment = "Production"
CostCenter = "CC-2045"
Owner = "time-backend"
}
# Aplicar tags em um recurso especÃfico
$resource = Get-AzResource `
-ResourceGroupName "rg-producao" `
-ResourceName "vm-web-01" `
-ResourceType "Microsoft.Compute/virtualMachines"
$resource.Tags["Environment"] = "Production"
$resource.Tags["CostCenter"] = "CC-2045"
Set-AzResource -ResourceId $resource.ResourceId -Tag $resource.Tags -Force
# Adicionar tag sem perder as existentes
$resource = Get-AzResource -ResourceId "/subscriptions/<sub>/resourceGroups/rg-prod/providers/Microsoft.Compute/virtualMachines/vm-web-01"
$tags = $resource.Tags
$tags["NewTag"] = "NewValue"
Set-AzResource -ResourceId $resource.ResourceId -Tag $tags -Force
# Aplicar tags em todos os recursos de um RG preservando tags existentes
$resources = Get-AzResource -ResourceGroupName "rg-producao"
foreach ($resource in $resources) {
$existingTags = $resource.Tags ?? @{}
$existingTags["Environment"] = "Production"
$existingTags["CostCenter"] = "CC-2045"
Set-AzResource -ResourceId $resource.ResourceId -Tag $existingTags -Force
}
# Listar recursos com uma tag especÃfica
Get-AzResource -Tag @{Environment = "Production"} | Select-Object Name, ResourceType, ResourceGroupName
# Remover uma tag especÃfica de um recurso
$resource = Get-AzResource -ResourceId "<resource-id>"
$tags = $resource.Tags
$tags.Remove("OldTag")
Set-AzResource -ResourceId $resource.ResourceId -Tag $tags -Force
Bicep e ARM Templates​
Em IaC, as tags devem ser definidas como variáveis ou parâmetros reutilizáveis para garantir consistência:
// Definir tags como parâmetro reutilizável
param resourceTags object = {
Environment: 'Production'
CostCenter: 'CC-2045'
Project: 'ecommerce-v2'
Owner: 'time-backend'
CreatedBy: 'pipeline-devops'
CreatedDate: '2026-03-24'
}
// Aplicar no Resource Group
resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {
name: 'rg-producao'
location: 'brazilsouth'
tags: resourceTags
}
// Aplicar na VM
resource vm 'Microsoft.Compute/virtualMachines@2023-09-01' = {
name: 'vm-web-01'
location: resourceGroup().location
tags: union(resourceTags, {
Role: 'web-server' // tag adicional especÃfica desta VM
})
properties: {
// ... configurações da VM
}
}
A função union() no Bicep mescla dois objetos de tags, permitindo que cada recurso herde as tags comuns e adicione suas próprias.
Terraform​
# Variável de tags comuns (definida uma vez, reutilizada em todos os recursos)
locals {
common_tags = {
Environment = "Production"
CostCenter = "CC-2045"
Project = "ecommerce-v2"
Owner = "time-backend"
ManagedBy = "terraform"
}
}
# Resource Group com tags
resource "azurerm_resource_group" "prod" {
name = "rg-producao"
location = "brazilsouth"
tags = local.common_tags
}
# VM com tags comuns + tags especÃficas
resource "azurerm_linux_virtual_machine" "web" {
name = "vm-web-01"
resource_group_name = azurerm_resource_group.prod.name
location = azurerm_resource_group.prod.location
tags = merge(local.common_tags, {
Role = "web-server"
Tier = "frontend"
})
# ... resto das configurações
}
O uso de locals para tags comuns e merge() para combinar com tags especÃficas é o padrão Terraform para gestão de tags em escala.
7. Controle e Segurança​
Enforcement de tags com Azure Policy​
Tags só têm valor se forem aplicadas de forma consistente. Azure Policy é o mecanismo para garantir isso:
1. Policy para exigir tag especÃfica (Deny ou Audit):
Built-in policy: "Require a tag on resources"
- Efeito Deny: bloqueia criação de recursos sem a tag obrigatória
- Efeito Audit: registra recursos sem a tag como non-compliant, sem bloquear
2. Policy para herdar tag do Resource Group (Modify):
Built-in policy: "Inherit a tag from the resource group if missing"
Esta policy usa efeito Modify para copiar automaticamente uma tag do RG para o recurso, se a tag estiver ausente no recurso. Isso é a solução para "tags não são herdadas automaticamente".
3. Policy para valores controlados (Deny com allowedValues):
Custom policy que restringe os valores aceitos para uma tag:
{
"mode": "Indexed",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Compute/virtualMachines"
},
{
"not": {
"field": "tags['Environment']",
"in": ["Production", "Staging", "Development", "Testing"]
}
}
]
},
"then": {
"effect": "Deny"
}
}
}
Esta policy garante que a tag Environment em VMs só pode ter os valores definidos. Qualquer outro valor é bloqueado.
Quem pode modificar tags​
Tags são propriedades dos recursos no ARM. Para modificar tags de um recurso, você precisa de permissão de escrita naquele recurso. Isso significa que:
- Contributor pode adicionar, modificar e remover tags de recursos
- Reader não pode modificar tags
- Uma tag não pode ser usada como controle de acesso; ela é apenas metadado
Para restringir quem pode modificar tags especificamente, sem restringir outras operações, seria necessário uma Custom Role que permita apenas */read e */write para tags, o que é complexo e raramente necessário.
8. Tomada de Decisão​
Definição da taxonomia de tags​
| Categoria de tag | Exemplos de chaves | Finalidade |
|---|---|---|
| Financeiro | CostCenter, BudgetCode, BusinessUnit | Chargeback, alocação de custos |
| Operacional | Environment, Tier, Role, Criticality | Gestão operacional, automação |
| Proprietário | Owner, Team, Contact | Responsabilidade, onCall |
| Ciclo de vida | CreatedDate, ExpiresOn, CreatedBy | Governança, limpeza automatizada |
| Projeto | Project, Application, Version | Rastreabilidade de investimento |
| Compliance | DataClassification, Regulation | Segurança, requisitos legais |
Quando usar cada abordagem de aplicação​
| Situação | Abordagem | Motivo |
|---|---|---|
| Novo ambiente sendo provisionado | IaC (Bicep/Terraform) com tags como variável | Garantir consistência desde o inÃcio |
| Recursos existentes sem tags | Script PowerShell/CLI em massa + Policy para novos | Remediação em escala + prevenção futura |
| Tags obrigatórias em toda a organização | Azure Policy com Deny no Management Group | Enforcement centralizado, não depende de disciplina humana |
| Herdar tags do RG automaticamente | Azure Policy com Modify | Solução oficial para propagação de tags |
| Tag com valores controlados | Policy customizada com allowedValues | Evitar valores inconsistentes como "prod", "Prod", "PROD" |
| Auditoria de conformidade de tags | Azure Resource Graph + Policy Compliance | Queries escaláveis em toda a organização |
9. Boas Práticas​
Defina a taxonomia antes de começar a taguear. Decidir quais tags são obrigatórias, quais são opcionais, quais valores são aceitos e qual é a convenção de capitalização antes de começar. Mudar a taxonomia depois que milhares de recursos já estão taggeados é extremamente trabalhoso.
Comece com poucas tags obrigatórias e adicione gradualmente.
Um conjunto de 3 a 5 tags obrigatórias que toda a organização consegue preencher corretamente é muito melhor do que 20 tags das quais metade fica vazia ou incorreta. Tags recomendadas para começar: Environment, CostCenter, Owner, Project.
Use Policy com Deny para tags obrigatórias em produção. Em ambientes de produção maduros, a tag obrigatória deve ser enforçada com Deny. Em ambientes novos ou em transição, comece com Audit para entender o impacto antes de bloquear.
Use IaC como fonte de verdade para tags. Tags devem ser definidas nos templates Terraform ou Bicep, não aplicadas manualmente no portal. Quando um recurso é recriado ou redeploy, as tags são restauradas automaticamente.
Implemente herança de tags do RG via Policy. Aplique a built-in policy "Inherit a tag from the resource group if missing" para as tags mais importantes. Assim, se o RG tem a tag correta, qualquer recurso criado dentro dele recebe automaticamente.
Use tags para automação de ciclo de vida.
Tags como ExpiresOn: 2026-06-30 podem ser usadas por runbooks do Azure Automation para identificar e desligar (ou alertar sobre) recursos que passaram da data de expiração.
Nunca use tags para controle de segurança. Tags são metadados, não controles de acesso. Não implemente lógica de segurança que dependa de tags (como "recursos com tag Confidential têm acesso restrito"). Use RBAC e Azure Policy para controle de segurança.
10. Erros Comuns​
| Erro | Por que acontece | Como evitar |
|---|---|---|
| Assumir que tags do RG propagam para recursos | Comportamento esperado mas que não existe no Azure | Usar Policy com Modify para herança explÃcita |
Usar az resource tag e perder tags existentes | O comando substitui todas as tags | Usar az resource update --set tags.Chave=Valor para adicionar sem perder |
| Inconsistência de capitalização: "prod", "Prod", "PROD" | Falta de padrão definido e enforçado | Definir padrão + Policy com allowedValues |
| Tags apenas no RG, não nos recursos individuais | Crença errônea em herança automática | Aplicar tags em cada recurso, ou usar Policy de herança |
| Usar tags como único mecanismo de organização sem RGs adequados | Tags não substituem estrutura de escopos | Usar RGs para isolamento + tags para metadado |
| Não incluir tags em templates IaC | Pressa, considerada detalhe menor | Incluir variável de tags comuns em todos os templates |
| Criar tags com muitos valores possÃveis sem controle | Sem Policy de allowedValues | Definir enum de valores aceitos e enforçar via Policy |
| Tags com informações sensÃveis como senhas ou tokens | Tags são visÃveis para qualquer Reader | Nunca colocar credenciais em tags; usar Key Vault |
O erro mais comum em escala​
Em organizações com múltiplas equipes, cada time cria suas próprias tags com nomes e valores diferentes para representar o mesmo conceito. Resultado: Env, env, Environment, ENVIRONMENT, environment, Ambiente tudo coexistindo, tornando relatórios de custo por ambiente impossÃveis sem limpeza massiva.
A solução é definir um tag taxonomy document como referência oficial e enforçar via Policy antes que a proliferação comece.
11. Operação e Manutenção​
Consultar recursos por tag no dia a dia​
# Listar todos os recursos com uma tag especÃfica
az resource list --tag Environment=Production --output table
# Contar recursos por valor de tag (quantos por ambiente)
az resource list \
--query "[].tags.Environment" \
--output tsv | sort | uniq -c
# Recursos sem uma tag obrigatória (via Resource Graph)
az graph query -q "
Resources
| where isnull(tags['CostCenter']) or tags['CostCenter'] == ''
| project name, type, resourceGroup, subscriptionId
| order by type asc"
# Todos os valores únicos de uma tag (para detectar inconsistências)
az graph query -q "
Resources
| where isnotnull(tags['Environment'])
| summarize count() by tostring(tags['Environment'])
| order by count_ desc"
Relatórios de custo por tag no Cost Management​
- Portal > Cost Management + Billing > Cost analysis
- Em Group by, selecione Tag e escolha a chave desejada (ex: CostCenter)
- O relatório mostra custo agrupado por valor da tag
Atenção: recursos sem a tag aparecem em uma categoria separada (geralmente "untagged" ou com valor vazio). Isso é uma indicação visual de não-conformidade de tagging.
Exportação automática de relatórios de custo por tag​
Configure exports automáticos no Cost Management para um Storage Account, com agrupamento por tag, gerando arquivos CSV mensais que podem ser processados automaticamente para chargeback.
Monitorar conformidade de tags via Policy​
O dashboard Policy > Compliance mostra o percentual de recursos conformes para cada policy de tag. Isso permite rastrear a evolução da cobertura de tags ao longo do tempo.
Limites a monitorar​
| Limite | Valor | Impacto se atingido |
|---|---|---|
| Tags por recurso | 50 | Não é possÃvel adicionar mais tags; revisar e remover tags desnecessárias |
| Comprimento da chave | 512 caracteres | Erro ao tentar criar tag com chave muito longa |
| Comprimento do valor | 256 caracteres | Erro ao tentar criar tag com valor muito longo |
O limite de 50 tags por recurso raramente é atingido com uma taxonomia bem projetada. Se você está se aproximando desse limite, é sinal de que a taxonomia precisa ser revisada e simplificada.
12. Integração e Automação​
Automação baseada em tags com Azure Automation​
Um padrão poderoso é usar tags para controlar comportamentos automáticos de recursos:
Exemplo de runbook PowerShell que desliga VMs baseado em tag:
# Runbook: Auto-Shutdown baseado em tag
$vms = Get-AzResource `
-ResourceType "Microsoft.Compute/virtualMachines" `
-Tag @{AutoShutdown = "true"}
$currentHour = (Get-Date).ToString("HH:mm")
foreach ($vm in $vms) {
$shutdownTime = $vm.Tags["ShutdownTime"]
if ($shutdownTime -eq $currentHour) {
Write-Output "Desligando $($vm.Name)..."
Stop-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force
}
}
Integração com Azure Cost Management para chargeback​
Integração com Azure Monitor para alertas segmentados por tag​
É possÃvel criar alertas que filtram por tag para notificar apenas o time responsável por um conjunto de recursos:
# Criar action group para o time de backend
az monitor action-group create \
--name "ag-time-backend" \
--resource-group "rg-monitoramento" \
--short-name "backend" \
--email backend-team@empresa.com
# Criar alerta de CPU alta apenas para VMs com tag Owner=time-backend
az monitor metrics alert create \
--name "cpu-alta-backend-vms" \
--resource-group "rg-monitoramento" \
--scopes "/subscriptions/<sub-id>/resourceGroups/rg-prod" \
--condition "avg Percentage CPU > 90" \
--action "ag-time-backend" \
--description "CPU alta em VMs do time backend"
Limpeza automática de recursos com tag de expiração​
# Runbook: Identificar e reportar recursos expirados
$today = Get-Date
$expiredResources = Get-AzResource | Where-Object {
$_.Tags.ContainsKey("ExpiresOn") -and
[DateTime]::Parse($_.Tags["ExpiresOn"]) -lt $today
}
foreach ($resource in $expiredResources) {
Write-Output "RECURSO EXPIRADO: $($resource.Name) - Expirou em: $($resource.Tags['ExpiresOn'])"
# Opcional: Send-MailMessage ou New-AzMonitorAlertRule
# Opcional: Remove-AzResource -ResourceId $resource.ResourceId -Force
}
13. Resumo Final​
Pontos essenciais:
- Tags são pares chave:valor associados a recursos como metadado no ARM
- Não existe herança automática de tags: tags em RG não propagam para recursos dentro
- O limite é de 50 tags por recurso, com chaves de até 512 caracteres e valores de até 256
- Tags existem apenas no plano de gerenciamento (ARM) e não afetam o funcionamento dos recursos
- Para garantir herança de tags do RG, use Azure Policy com efeito Modify ("Inherit tag from resource group if missing")
Diferenças crÃticas:
az resource tagsubstitui todo o conjunto de tags;az resource update --set tags.Chave=Valoradiciona sem perder as existentes- Tags em RG vs. recursos: RG e seus recursos têm conjuntos de tags completamente independentes
- Policy Deny vs. Modify para tags: Deny bloqueia recursos sem tag; Modify adiciona a tag automaticamente. Ambos são complementares
- Audit vs. Deny para enforcement: Audit registra não-conformidade sem bloquear; Deny bloqueia na criação
O que precisa ser lembrado para o AZ-104:
- Tags não são herdadas automaticamente de escopos pai para filho
- Substituição vs. merge: atenção ao usar comandos que substituem todas as tags versus os que adicionam incrementalmente
- Azure Resource Graph é a ferramenta para queries complexas de recursos por tags em escala
- Tags aparecem no Cost Management como dimensão de agrupamento para relatórios de custo
- A built-in policy "Inherit a tag from the resource group if missing" usa efeito Modify e é a solução oficial para propagação de tags
- Tags podem ser usadas em automação (Runbooks, Logic Apps) para controlar comportamentos de recursos
- Chaves de tags são case-insensitive no mesmo recurso mas case-sensitive em filtros e queries externas