Naming Patterns
Per-resource naming rules for AppOnboard-generated Azure resources. Apply in Step 7 (Generate naming).
Reference: Azure naming conventions — link, don't duplicate. Check docs for updates.
Default Pattern
{abbreviation}-{resourcePrefix}Where resourcePrefix = \{project\}-\{env\}-\{suffix\} (generated once in prepare Step 7, stored in prepare-plan.json.naming.resourcePrefix).
\{project\}— app name fromcontext.json.app.name(lowercase, alphanumeric + hyphens)\{env\}—dev/staging/prod(from intent or defaultdev)\{suffix\}— first 4 chars of session UUID (e.g.,a1d5). Generated once, stored innaming.suffix\{abbreviation\}— short service prefix from the table below (e.g.,app,kv,rg)
Examples with resourcePrefix = myapp-dev-a1d5:
- Resource Group:
rg-myapp-dev-a1d5 - App Service:
app-myapp-dev-a1d5 - Key Vault:
kv-myapp-dev-a1d5 - Storage:
stmyappdeva1d5(alphanumeric only)
⛔ No redundancy. The resource name is
\{abbr\}-\{resourcePrefix\}— NOT\{project\}-\{abbr\}-\{project\}-\{env\}-\{suffix\}. The project name appears ONCE in the prefix.⛔ Scaffold reads naming from the plan — does NOT generate or modify resource names.
Override via context.json.overrides[] with key: "naming.pattern".
Per-Resource Rules
| Resource | Abbreviation | Max Length | Allowed Chars | Globally Unique? | Example |
|---|---|---|---|---|---|
| Resource Group | rg | 90 | Alphanumeric, hyphens, underscores, periods, parens | No (but include suffix to avoid cross-session collisions) | rg-myapp-dev-a1d5 |
| App Service | app | 60 | Alphanumeric, hyphens | Yes | app-myapp-dev-a1d5 |
| Container App | ca | 32 | Lowercase alphanumeric, hyphens | No (within env) | ca-myapp-dev-a1d5 |
| Container Registry | cr | 50 | Alphanumeric only | Yes | crmyappdeva1d5 |
| Azure SQL Server | sql | 63 | Lowercase alphanumeric, hyphens | Yes | sql-myapp-dev-a1d5 |
| Cosmos DB | cosmos | 44 | Lowercase alphanumeric, hyphens | Yes | cosmos-myapp-dev-a1d5 |
| Storage Account | st | 24 | Lowercase alphanumeric only | Yes | stmyappdeva1d5 |
| Key Vault | kv | 24 | Alphanumeric, hyphens | Yes | kv-myapp-dev-a1d5 |
| Log Analytics | log | 63 | Alphanumeric, hyphens | No (within RG) | log-myapp-dev-a1d5 |
| App Insights | appi | 260 | Most chars | No (within RG) | appi-myapp-dev-a1d5 |
| Service Bus | sb | 50 | Alphanumeric, hyphens | Yes | sb-myapp-dev-a1d5 |
| Functions | func | 60 | Alphanumeric, hyphens | Yes | func-myapp-dev-a1d5 |
| Static Web Apps | swa | 40 | Alphanumeric, hyphens | No (suffix still required — Rule 1) | swa-myapp-dev-a1d5 |
| Redis Cache | redis | 63 | Alphanumeric, hyphens | Yes | redis-myapp-dev-a1d5 |
CAF deviation: Azure Cloud Adoption Framework uses
sbnsfor Service Bus namespace. AppOnboard usessbfor brevity — either is acceptable.
Rules
- ALL resources get the
\{suffix\}— including resource groups. This prevents cross-session naming collisions when the same app is deployed multiple times. The suffix is a 4-char random string generated once per session. - Container Registry + Storage Account: strip hyphens (alphanumeric only). ⛔ Mechanical transform — do NOT re-derive char-by-char:
('cr' + resourcePrefix).replace(/-/g,'').toLowerCase(), truncate to ≤50 (ACR) / ≤24 (Storage). Worked example:resourcePrefix = bezkoder-dev-18a3→cr+bezkoderdev18a3→crbezkoderdev18a3. Copy the pattern; do not spell out the concatenation. - Validate length after substitution — Key Vault (24 chars) is the tightest constraint. Budget for
\{project\}:24 - len(abbreviation) - len(env) - len(suffix) - 3 - 2(separators + healing reserve). Forkv+dev: 10 chars max. The 2-char reserve ensures room for a healing suffix (e.g.,edd6→edd602) on region fallback. Truncation when over budget:- Truncate at the nearest hyphen boundary within budget (e.g.,
broken-web-appat 10 →broken-web) - If no hyphen within budget: hard truncate, no trailing hyphen
- Verify truncated name doesn't collide with reserved words (Rule 4)
- Recompute ALL resource names with the truncated project — do NOT mix long and short names
- Truncate at the nearest hyphen boundary within budget (e.g.,
- Never use reserved words as resource names (
admin,login,root,test) - Populate
naming.resources[]inprepare-plan.jsonwith concrete names after validation