# Azure Operations

> Use when running .NET services on Azure beyond AI Foundry. Passwordless SQL end to end, provision-versus-deploy staleness, the permission matrix document, CI credential preflight and soft-delete recovery, storage without keys, model deployments and capacity, and Container Apps manifest idioms and job escape hatches. The unifying rule: managed identity plus RBAC everywhere, and a key or password anywhere in the chain is a finding.

- Skill: `konradcinkusz/azure-operations` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add konradcinkusz/azure-operations`
- Raw SKILL.md: https://api.skillmd.com/api/skills/konradcinkusz/azure-operations/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: konradcinkusz (https://skillmd.com/u/konradcinkusz)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/konradcinkusz/azure-operations

---


# Azure operations: identity-first infrastructure and the pipeline that runs it

**Read [`references/AZURE-OPERATIONS.md`](references/AZURE-OPERATIONS.md) before applying any of this.**
That file is the standard; everything below it is a summary to help you decide
whether this skill applies and to check your work afterwards.

## What this standard covers

- Provision vs deploy
- Passwordless SQL end to end
- The permission matrix document
- CI hardening
- Storage without keys
- Model deployments and capacity
- Container Apps manifest idioms
- Container Apps jobs and escape hatches

## Failure modes

| Symptom | Cause |
|---|---|
| Permissions fix merged, live env still 403s | Fix shipped via deploy; role assignments only apply on provision |
| First blob/agent call fails right after provisioning | RBAC propagation lag; poll the data plane before first use |
| App deployed, DB login fails as `<identity-name>` | Contained DB user never created — the deploymentScripts half is missing |
| Two services, one DB principal | Shared managed identity; one identity per service |
| `deploymentScripts` fails inside a VNet | No delegated subnet + staging storage for script execution |
| Wrong-subscription deploy with no clear error | No credential preflight; assert `az account show` post-login |
| Re-provision after destroy fails on name collision | Soft-deleted account not detected/restored |
| Parallel model deployments conflict | One deployment operation at a time; chain `dependsOn` |
| Empty-secret deployment failure | Optional secret rendered as an empty block instead of conditionally omitted |
| BFF proxy 403s in one environment only | IP allowlist applied to a backend API; move it to the frontend |
| Job "updated" but behaves old | `job update` silently dropped the flags; delete + recreate |
| One-line agent change requires a full pipeline run | No targeted-re-run escape hatch with `azd env refresh` |

## Checklist

- [ ] All auth is managed identity + RBAC; no keys, no SQL passwords, `allowSharedKeyAccess: false`
- [ ] Entra-only SQL with a UAMI admin; contained users via deploymentScripts with retry; connection-string surgery centralized in the kernel
- [ ] One identity per service (database principals included)
- [ ] Permission matrix committed with the added-by-infra column; error-string decoder table alongside
- [ ] CI: credential preflight + post-login account assertion; soft-delete detect/restore; RBAC data-plane polling before first use
- [ ] Model deployments chained; capacity split planned; model tiers parameterized
- [ ] Manifests: env-conditional minReplicas, conditional secret blocks, fail-closed allowlists on frontends only, conditional domains/SNI
- [ ] Jobs recreated not updated; targeted re-run workflows exist; destroy typed-confirmed, per-env gated, purging
- [ ] Provision-vs-deploy distinction written into the deployment checklist ("why this step matters" column)

---

Generated from [`docs/guides/AZURE-OPERATIONS.md`](https://github.com/konradcinkusz/architecture-standards/blob/main/docs/guides/AZURE-OPERATIONS.md) by `scripts/build-marketplace.mjs`. Do not edit this file: change the source document, or its entry in `catalog/marketplace.catalog.json`, and re-run the generator.

