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
| Decision | Choice | Rationale |
|---|---|---|
| Naming pattern | type-workload-env-region-instance where supported | Readable, automation-friendly, and aligned with Cloud Adoption Framework naming components and abbreviations. |
| Metadata strategy | Required tags, enforced and inherited | Tags 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.
Recommended Configuration
Naming patterns
| Object | Format |
|---|---|
| Resource group | rg-<workload>-<env>-<region>-<nnn> |
| Virtual network | vnet-<scope>-<env>-<region>-<nnn> |
| Subnet | snet-<purpose>-<env>-<nnn> |
| Route table | rt-<scope>-<env>-<nnn> |
| Network security group | nsg-<scope>-<env>-<nnn> |
| Key Vault | kv-<scope>-<env>-<nnn> |
| Log Analytics workspace | log-<scope>-<env>-<region>-<nnn> |
| Private endpoint | pep-<target>-<env>-<nnn> |
Required tags
| Tag | Purpose |
|---|---|
environment | production, non-production, sandbox, or shared |
owner | technical or platform owner |
costCenter | cost allocation |
workload | workload or platform capability name |
dataClassification | public, internal, confidential, restricted |
criticality | low, medium, high, mission-critical |
maintenanceWindow | expected 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
# Find resources by tag — missing or wrong tags surface immediatelyaz resource list --tag environment=prod --output table
# Review predefined tag names and values in the subscriptionaz 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.