Skip to main content

Naming and Tagging Baseline

Names and tags answer two different questions. A name answers what is this resource? A tag answers what do we currently know about it? Getting the split right early is cheap; fixing it later means renaming or re-tagging thousands of resources by hand.

Purpose

This page defines a naming and tagging baseline that supports operations, cost management, governance, automation, and security reporting. Naming identifies resources; tags provide metadata. A maintainable platform needs both.

Design Reasoning

The rule that resolves almost every naming question: resource names hold stable information; tags hold metadata that changes over time.

Do not put changing data — owner, cost center, business unit, maintenance window — into resource names. Those values change, and a name cannot. Store them as tags instead. Names should be predictable, short enough for Azure’s per-resource limits, and useful in logs, alerts, and scripts.

A good name is a query key

You will read resource names in alert payloads, activity logs, and cost exports far more often than in the portal. Optimize names for being parsed by a human under pressure and by a script, not for looking tidy in a list.

Architecture Decision Record

DecisionChoiceRationale
Naming patterntype-workload-env-region-instance where supportedReadable, automation-friendly, and aligned with Cloud Adoption Framework naming components and abbreviations.
Metadata strategyRequired tags, enforced and inheritedTags carry the data that changes; enforcing them at creation avoids expensive backfills.

Tradeoff: A fixed naming pattern is occasionally a tight fit for resources with short length limits (storage accounts, Key Vault). Accept a documented abbreviation for those cases rather than abandoning the pattern.

Naming patterns

ObjectFormat
Resource grouprg-<workload>-<env>-<region>-<nnn>
Virtual networkvnet-<scope>-<env>-<region>-<nnn>
Subnetsnet-<purpose>-<env>-<nnn>
Route tablert-<scope>-<env>-<nnn>
Network security groupnsg-<scope>-<env>-<nnn>
Key Vaultkv-<scope>-<env>-<nnn>
Log Analytics workspacelog-<scope>-<env>-<region>-<nnn>
Private endpointpep-<target>-<env>-<nnn>

Required tags

TagPurpose
environmentproduction, non-production, sandbox, or shared
ownertechnical or platform owner
costCentercost allocation
workloadworkload or platform capability name
dataClassificationpublic, internal, confidential, restricted
criticalitylow, medium, high, mission-critical
maintenanceWindowexpected maintenance window

Not every Azure resource type supports tags, and tags are not inherited by default. Plan for both: use Azure Policy with Modify and tag-inheritance policies so resources inherit tags from their resource group or subscription, and use Append/Deny where a tag must be present.

Example Implementation

A resource group created with the full required-tag set in Bicep:

param location string = 'switzerlandnorth'
param tags object = {
environment: 'prod'
owner: 'platform-team'
costCenter: 'IT-100'
workload: 'platform-management'
dataClassification: 'internal'
criticality: 'high'
maintenanceWindow: 'sun-0200-0400'
}
resource rg 'Microsoft.Resources/resourceGroups@2025-04-01' = {
name: 'rg-platform-mgmt-prod-sec-001'
location: location
tags: tags
}

Validation Steps

Terminal window
# Find resources by tag — missing or wrong tags surface immediately
az resource list --tag environment=prod --output table
# Review predefined tag names and values in the subscription
az tag list --output table
# Summarize policy compliance, including tag policies (policyinsights extension)
az policy state summarize --subscription <subscription-id>

Common Mistakes

  • Overly long or manually invented names that drift per project.
  • Putting owner or cost center into the resource name instead of into tags.
  • A different tag schema per team, which makes cost and ownership reporting impossible.
  • Assuming every resource supports tags, or that tags inherit automatically — they do not.
  • Enforcing tags without defining allowed values, which produces consistent keys with meaningless values.

References