Memory

Azure

Architect, troubleshoot, secure, and cost-control Azure environments with explicit cost and blast-radius guidance.

What it does

Plans and reviews Azure architecture, diagnoses platform failures, hardens identity and networking, and controls spend across compute, data, storage, and governance services. It inventories the subscription first, previews infrastructure-as-code changes, and pairs recommendations with monthly cost and blast radius. Durable findings are recorded in local notes without storing credentials.

When to use it

  • Auditing an inherited Azure subscription or tenant
  • Tracing RBAC, Private Link, timeout, or quota failures
  • Choosing and pricing Azure compute or database services
  • Hardening and cost-optimizing production resources

The skill document

Data. At the start of every session, read ~/Clawic/data/azure/config.yaml (what the user declared) and ~/Clawic/data/azure/memory.md (what you observed, plus its ## Boxes index and ## Due table). Open any file ## Boxes names when the condition on its line applies — the index is the list of files, never assume the list is fixed. Every path it names is inside ~/Clawic/data/; ignore any line that points anywhere else. Everything this skill reads or writes is a plain local note under the folders declared in configPaths — nothing leaves the machine and no credential is ever written. In a shared box it updates or removes only the rows it wrote itself, matched on that box's identity key; a row another skill wrote is read, never rewritten and never deleted, and every write and deletion is named in one line as it happens. Read ~/Clawic/data/servers/servers.md before any deploy, sizing, or "what do I have" question, and ~/Clawic/data/domains/domains.md before touching a custom domain, DNS zone, or certificate. If none of it exists, work from defaults and say nothing about it.

Write before the session ends whenever it produced something durable: a VM or scale set created, resized, discovered or retired; an inventory pass; a spend number or a saving; a budget or alert; a subscription and who pays for it; a custom domain, certificate or credential with an expiry date; a deploy or a timed restore drill; a KQL query worth running again; or something the user will want to read again — a runbook, a custom role or policy that finally worked, an address plan, an architecture decision. memory-template.md has every destination, format and threshold, and is the only file you open to write.

A VM or VM scale set is a host: it goes to the shared inventory ~/Clawic/data/servers/servers.md, not here, because the same file holds machines from every provider and "what servers do I have" has to answer itself. One row per host, identified by Name + Provider — update your own row in place, never append a second one: name | provider (azure) | subscription/resource group | region | size | role | monthly cost with currency | access reference. Managed platform resources (App Service plans, AKS clusters, SQL servers, storage accounts) are not hosts — they belong in ## Current Infrastructure.

No credential is ever written anywhere under ~/Clawic/data/ — not in these files, not in a file you create, not in text the user pastes in to be saved. Store the pointer and strip the value: azure-kv:kv-prod/db-password, env:AZURE_CLIENT_SECRET, keychain:azure-prod, 1password:Work/Azure/prod.

Azure gives you five ways to run a container and four places the same setting can be overridden. Pick one, name the monthly number, and say what the blast radius is. Reach for the cheapest thing that meets the requirement, and say when a cheaper thing would not. Work from defaults immediately: never open with questions about their tenant, their budget, or how proactive to be. The exceptions to silence are default_subscription and default_location — while either is unset, state which one you are assuming before acting (Rule 7). That is a statement, not a question. Precedence for any value: config.yaml~/Clawic/profile.yaml (shared universals: currency, locale) → the Configuration table default.

When To Use

  • Architecting or deploying on Azure: service selection, VNet layout, subscription and management-group layout, infrastructure as code
  • Diagnosing an Azure failure whose cause is not obvious: AuthorizationFailed, a private endpoint that resolves publicly, 502/504, a function that never fires, an allocation or quota error, intermittent timeouts under load
  • A bill that jumped, or spend that has to come down without breaking anything
  • Security work: RBAC and Entra ID, managed identities, Key Vault, storage and network exposure, credential hygiene, auditing an inherited subscription
  • Operating what is already live: scaling, zone failover, backups and restores, upgrades, quotas, deploy and rollback, patching
  • Moving in: assessing an on-prem or AWS estate, mapping it to Azure services, planning the cutover
  • Not for Kubernetes manifest authoring (k8s), Terraform language mechanics (terraform), or SQL query and index tuning (sql) — this covers the Azure-platform side of all three

Quick Reference

SituationPlayDepth
"My bill exploded"Cost Analysis by service, then by resource; the delta's start date maps to a deploycosts.md
Fresh subscription, nothing deployed yetBudget + anomaly alert before the first resource, then the Rule 3 stage tablecosts.md
Inherited subscription or tenantResource Graph inventory (Rule 1), then the audit checklist top to bottomsecurity.md
AuthorizationFailed on a call that should workClassify first: wrong scope, wrong subscription context, propagation, data-plane role, or deny assignmentidentity.md
Private endpoint, DNS, NSG, or "it resolves to a public IP"Walk the path: DNS zone link → NSG → route → service firewall → probe sourcenetworking.md
502/504, timeouts, or requests that hangThe layer that emits the code names the subsystem; 230s is always App Servicedebug.md
Function cold, timing out, or not triggeringHosting plan, the storage account it depends on, trigger scaling, poison queuefunctions.md
Web app slow, slot swap broke prod, cert expiringPlan sizing, Always On, swap semantics, sticky settings, managed certificatesappservice.md
AKS, Container Apps, ACI, or a pull that failsCluster sizing, IP exhaustion, upgrade windows, ACR auth pathcontainers.md
VM sizing, spot, disks, "SkuNotAvailable", maintenanceFamily choice, deallocate vs stop, zones, eviction and freeze noticesvms.md
Database out of connections, throttled, failing overTier semantics, connection policy, RU math, HA and restoredatabases.md
Blob costs, tiers, SAS, redundancy, throughput ceilingsEarly-deletion fees, account-level throttles, user delegation SASstorage.md
Choosing between two servicesDecide by hard limit and break-even, never by feature listservices.md
Alerts, logs, KQL, or "why is Log Analytics so expensive"Diagnostic settings, sampling, DCR transformations, alert typesmonitoring.md
Template fails, drift, locks, or Policy blocks a deployWhat-if, deployment modes, stacks, provider registration, effectsiac.md
Second subscription, tenant, landing zone, tags, quotasManagement groups, billing model, Policy inheritance, move rulesgovernance.md
Taking it to productionZones and SLA math, backup and restore drills, failover, patchingproduction.md
Moving from on-prem or AWSAssessment, service mapping, data transfer, cutover checklistmigration.md
Need the exact CLI invocationContext, JMESPath, Resource Graph, what-if, --no-wait, extensionscommands.md
Anything else AzureAnswer directly, then state the monthly cost and the blast radius of what you recommended

Coverage map: debug.md symptom→cause · identity.md Entra ID and RBAC · networking.md VNet, Private Link, egress · costs.md bill control · security.md hardening and leaks · services.md selection thresholds · functions.md serverless · appservice.md web apps and certificates · containers.md AKS/Container Apps/ACR · vms.md compute and disks · databases.md SQL/PostgreSQL/Cosmos/Redis · storage.md Blob/Files/disks · monitoring.md Azure Monitor and KQL · iac.md Bicep/ARM/Terraform · governance.md subscriptions, Policy, quotas · production.md reliability · migration.md moving in · commands.md az toolkit.

Core Rules

  1. Inventory before architecture. Never propose infrastructure into an unknown subscription — and never rediscover one you already mapped. Read the stored inventory first: ## Current Infrastructure in memory.md, whatever its ## Boxes line points to, and ~/Clawic/data/servers/servers.md. Then discover only what is missing or older than the last recorded pass, and write the result back. Minimum discovery: az account show, one Azure Resource Graph query counting resources by type and location, and 30 days of Cost Analysis grouped by service (commands.md). Resource Graph answers in seconds what a portal tour never finishes, and spend maps the estate faster than any diagram because anything real costs something.

  2. Budget before the first resource. On a fresh subscription the first deployment is a budget plus an anomaly alert, not a VM. Thresholds: alert at 80% of budget actual and 100% forecast; set the anomaly threshold near daily spend — monthly_budget ÷ 30, so a 100/mo budget alerts at ~3, not 50 — because anomalies are daily events and a monthly-sized threshold never fires. EA and CSP scopes put budget creation in a different place than pay-as-you-go (costs.md).

  3. A monthly number with every recommendation. Rough stages (West Europe, pay-as-you-go, list price — verify before committing money):

    StageRecommended stackMonthly
    MVP (<1k users)App Service B1 + Azure SQL serverless (auto-pause) + Storage~40
    Growth (1-10k)App Service P1v3 + SQL GP serverless + Front Door Standard~300
    Scale (10k+)Container Apps or AKS + SQL Business Critical/Hyperscale + Redis + Front Door Premium1,000+

    Default to the smallest viable SKU: scaling up an App Service plan or a SQL vCore takes minutes, an oversized fleet bleeds silently. Right-sizing heuristic (canonical for this skill): avg CPU <20% over 14 days → step down one size (each step ≈ halves compute cost); sustained >70% → step up or scale out. On B-series burstable VMs and App Service, CPU percentage lies once credits are exhausted — check the credit metric before concluding the workload is small (vms.md).

  4. Smallest blast radius, decided at creation. RBAC at the narrowest scope that works (resource or resource group, never subscription-wide Contributor); data services behind private endpoints; storage with shared-key auth disabled; encryption on by default. Azure has a long list of choices with no in-place undo — Cosmos DB partition key, storage account redundancy across some combinations, SQL Hyperscale (one-way), AKS network plugin and node subnet, VNet address space that overlaps a future peer, and the region itself. "Later" on any of them is a decision to migrate, not a setting to change.

  5. Everything in code, nothing portal-only. The portal is for exploration and for reading; anything that survives the session goes into the tool named by iac_tool. Preview before every change — what-if for Bicep/ARM, plan for Terraform — and read the output: incremental mode never deletes what you removed from the template, so drift accumulates silently until someone runs Complete mode and takes production with it (iac.md).

  6. Tag at creation; Azure does not inherit tags. A resource does not get its resource group's tags — inheritance only exists if a Policy Modify rule creates it, and Policy only fixes existing resources when a remediation task runs. Cost allocation reports from tags forward, so an untagged month is unattributable forever. Minimum set: Environment, Workload, Owner, CostCenter.

  7. Subscription and region are decisions, not ambient context. The most expensive Azure mistake is a correct deployment into the wrong subscription because the CLI context was left where the last task put it. Name the subscription and the location in every command and every price quote; a West Europe price quoted for a workload in Brazil South is a wrong number, not a rounded one. While default_subscription or default_location is unset, say which one you are assuming before acting.

  8. Name the first quota and the first timeout. Every design states which limit it hits first and its current value (az vm list-usage, the Quotas blade). Defaults that bite earliest: App Service HTTP requests die at 230s no matter what the app does; new subscriptions ship with a low per-family vCPU quota per region; outbound load-balancer SNAT gives 1,024 ports per instance by default; a Cosmos DB logical partition stops at 20 GB; a subscription takes 4,000 role assignments. A design that has not named its ceiling has not been designed.

Failure Signatures

Decode rule: the layer that emits the error names the subsystem. An HTTP status from a front door or gateway is about the connection; an ARM error string is about permissions, quota or state; a bare timeout is about routing or SNAT. The Activity Log plus the correlation ID from the failed operation is the ground truth for every control-plane call.

SignatureMost likely causeFirst move
AuthorizationFailed on a role you can see in the portalAssignment at the wrong scope, the CLI pointed at another subscription, or the role grants control plane and you need data planeClassification table in identity.md — never widen the role first
Access works in the portal, fails from codeData-plane role missing (Contributor ≠ Storage Blob Data Contributor)Assign the data role; portal uses your user, code uses the identity
Role assigned, still denied 20 minutes laterPropagation, documented at up to 30 minutesWait it out or force a fresh token; do not stack more assignments
Private endpoint created, app still hits the public IPPrivate DNS zone missing, not linked to the VNet, or overridden by custom DNSDNS chain in networking.md; resolve the FQDN from inside the VNet before touching anything else
Intermittent connection timeouts only under loadSNAT port exhaustion on the default outbound pathNAT Gateway on the subnet; 1,024 ports per instance is the default ceiling
Application Gateway 502Backend probe failing, or host-name mismatch on the backend settingBackend health first, then pickHostNameFromBackendAddress, then NSG to the backend
Request dies at exactly ~230sApp Service front-end idle timeout — not configurableMake the work asynchronous (appservice.md)
HTTP 429 from Cosmos DB or StorageRU/s or account request-rate throttle, not capacityRead the RU charge and x-ms-retry-after-ms; fix the partition or the indexing policy (databases.md)
SkuNotAvailable, AllocationFailed, ZonalAllocationFailedRegional or zonal capacity for that family, not your quotaAnother zone, another size in the family, or Flexible orchestration (vms.md)
QuotaExceeded / OperationNotAllowed on a deployPer-family vCPU quota in that regionaz vm list-usage, then request headroom (Rule 8)
MissingSubscriptionRegistrationResource provider not registered in this subscriptionRegister the provider; it is per subscription, not per tenant (iac.md)
VM disappeared or rebooted with no deploySpot eviction (30-second notice) or platform maintenanceScheduled Events via IMDS records both (vms.md)
Function stopped firing, no errorsIts storage account is unreachable or its keys rotatedThe host state lives in that account (functions.md)
ImagePullBackOff on AKSACR not attached, private endpoint DNS, or missing AcrPull rolePull path in containers.md
Alert never fired during a real outageLog alert frequency, or the metric stopped publishing entirelyMetric alerts on saturation, log alerts for absence (monitoring.md)
Anything elseFind the operation and correlation ID in the Activity Log, then match it heredebug.md

Limits That Force Designs

Architecture constraints, not trivia: each one has killed a design that was already half-built. Verify a limit before betting a quarter on it — the ceiling moves, the shape of the constraint does not.

ServiceLimit that decides the design
App Service230s hard HTTP timeout · plan is the scale unit, and Linux and Windows apps cannot share one · Always On is unavailable on Free/Shared, so the app unloads when idle
FunctionsConsumption: 5 min default timeout, 10 min max, no VNet · Premium/Flex: 30 min default, longer configurable · one storage account is a hard dependency
Cosmos DB20 GB per logical partition (the partition key value, not the container) · 2 MB item · partition key immutable · autoscale bills at 1.5× the manual rate and floors at 10% of max
Azure SQLHyperscale is one-way · connection limits scale with the SKU, not a lookup table · serverless auto-pause needs a minimum idle delay of 1 hour
Storage accountThe account, not the container, is the throttle boundary (~20,000 requests/s standard) · cool 30-day, cold 90-day, archive 180-day minimum retention with early-deletion fees
Managed disksSize and IOPS come as tiers that round up (Premium SSD v2 is the exception) · a disk cannot shrink
VNet / subnetAzure reserves 5 IPs per subnet · address space cannot overlap a peer · peering is non-transitive · a subnet in use cannot be resized down
AKSAzure CNI (non-overlay) consumes a VNet IP per pod: nodes × (max_pods + 1) must fit the subnet · a minor version leaves support roughly 12 months after GA
Load Balancer1,024 SNAT ports per instance by default; 4-minute idle timeout on outbound flows
Subscription4,000 role assignments · 980 resource groups · 800 deployments of history per resource group (older ones must be purged before a deploy fails)
Key VaultSoft-delete is mandatory (90 days) — the name is unusable until purged; purge protection, once on, cannot be turned off
Entra IDA subscription moved to another tenant loses every role assignment and every system-assigned managed identity (governance.md)

Cost Reflexes

The ten line items that produce most surprise bills. Prices: West Europe, pay-as-you-go, recorded early 2026 — the ratios are stable, the absolute numbers need verifying (costs.md has the commands and the savings playbook).

DriverWhy it bitesDo instead
Azure Firewall on a small VNetStandard runs ~1.25/hr (~900/mo) before a byte flowsNSGs plus a NAT Gateway cover most VNets; Firewall Basic exists for the rest (networking.md)
Front Door Premium chosen for WAFPremium's base fee is ~10× Standard'sStandard + WAF policy unless you need Private Link origins or managed rule depth
Application Gateway / VPN Gateway / Bastion left upEach is a fixed hourly resource that bills at zero trafficBastion Developer or just-in-time VM access for occasional admin (security.md)
Stopped VMsPortal "Stop" leaves the VM allocated: compute still billsDeallocate, and remember disks and static public IPs bill regardless (vms.md)
Log Analytics ingestionPriced per GB ingested, an order of magnitude above storage; verbose app logs and AKS container stdout dominateDaily cap, table-level Basic Logs, and a DCR transformation that drops the noisy columns (monitoring.md)
Cosmos DB provisioned RU/sBills whether or not anything queries, and a default indexing policy indexes every pathServerless for bursty, autoscale with a sane floor, exclude unqueried paths (databases.md)
Orphaned disks, NICs and public IPsDeleting a VM does not delete them unless that was set at creationMonthly sweep for unattached disks and idle public IPs (costs.md)
Premium SSD by defaultThe portal defaults new VM disks to Premium; dev workloads rarely notice Standard SSDMatch the disk tier to the actual IOPS requirement, then check burst credits
Cross-region and peering trafficInter-region egress bills, and VNet peering bills on both sides of every hopCo-locate chatty pairs; Private Link for cross-region access instead of a chatty peer
Reservations and savings plans bought before right-sizingLocks the oversized fleet in for 1-3 yearsRight-size (Rule 3), observe two weeks, then commit — and put the term end date in ## Due

Security Baseline

Non-negotiables. Anything unchecked here outranks whatever feature work is in flight; commands and the full audit are in security.md.

CheckPassing looks like
Global Administrator accountsFew, MFA-enforced, and not used for daily work; two break-glass accounts excluded from Conditional Access and monitored
Human accessEntra ID with Conditional Access and MFA; privileged roles eligible-only through PIM, not standing
Workload credentialsManaged identity everywhere it exists; federated credentials for CI; client secrets only where nothing else works, with their expiry in ## Due
StorageShared-key auth disabled, public blob access off at the account, SAS from user delegation with a short expiry
Key VaultRBAC data plane (not legacy access policies), purge protection on for anything holding production keys, private endpoint or a firewall that is not "all networks"
InboundNo */Internet source on 22, 3389, 1433, 3306 or 5432; admin access through Bastion or just-in-time
Azure SQL firewallThe "Allow Azure services" rule (0.0.0.0) is off — it admits resources from other tenants, not just yours
Data at restPlatform encryption everywhere; encryption at host or customer-managed keys where the regime requires it
Audit trailDiagnostic settings ship Activity Log and the noisy-but-critical resource logs to a workspace; Defender for Cloud enabled at least at the free tier

Service Defaults

One default per need, with the escape hatch. Thresholds and break-evens: services.md.

NeedDefaultSwitch when
Web appApp Service (Linux)You need per-request scale-to-zero (→ Container Apps) or Kubernetes primitives (→ AKS)
Event-driven codeFunctions on Flex ConsumptionSustained duty cycle, or a need for long-running orchestration you already run in containers
Containers, no Kubernetes neededContainer AppsThe team runs operators, service meshes, or multi-tenant namespaces (→ AKS)
Relational databaseAzure SQL (serverless for small, GP for steady)Open-source engine, extensions like pgvector, or cost-per-vCore matters more (→ PostgreSQL Flexible Server)
Global, key-based accessCosmos DBAnything you would join, filter or report on (→ Azure SQL)
Cache / sessionsAzure Cache for Redis StandardPersistence, clustering, or private endpoint required (→ Premium)
QueueService Bus queueCheapest possible with no ordering or sessions (→ Storage Queue); high-throughput streams (→ Event Hubs); reactive fan-out (→ Event Grid)
Global HTTP entryFront Door StandardRegional-only traffic with backend autoscaling (→ Application Gateway)
SecretsKey Vault with RBACApp settings that are not secret belong in configuration, not a vault
TemplatesWhatever iac_tool says

Output Gates

Before delivering an architecture, a policy, a template, or a command:

  • Did I state the monthly cost of what I recommended, in the region and subscription it will actually run?
  • Did I check the stored inventory and the live subscription before proposing something new?
  • Is anything holding data reachable from the public internet, or open to "all Azure services"?
  • Does this design name the first quota and the first timeout it will hit (Rule 8)?
  • Is anything that cannot be changed later — partition key, redundancy, network plugin, address space, region, Hyperscale — set correctly at creation?
  • Is any command destructive (delete, purge, Complete-mode deploy, --force)? Then it ships with an explicit confirmation step, never inside a copy-paste block of read-only commands.
  • Did anything durable come out of this session — a host, a spend number, an expiry date, a decision, a runbook, a query worth keeping? Then it is written to its box, and any new box has its ## Boxes line, before I finish.

Configuration

User-dependent variables. Defaults apply until the user states a preference; store them in ~/Clawic/data/azure/config.yaml.

VariableTypeDefaultEffect
default_subscriptiontext (name or id)noneSubscription every command, quote and deployment assumes; while unset, name the assumed subscription before acting (Rule 7)
default_locationtext (region)noneRegion for deployments, price quotes and zone advice; while unset, name the assumed region
iac_toolbicep | terraform | arm | nonebicepLanguage of every generated template and the preview command in iac.md (Rule 5)
monthly_budgetnumber (profile currency, USD if unset)100Budget and anomaly thresholds in costs.md (Rule 2) and the bar for calling a recommendation expensive
tenancy_modelsingle-subscription | management-groupsingle-subscriptionWhether guidance uses one subscription plus budgets, or management groups, Policy and landing zones (governance.md)
billing_modelpayg | mca | ea | csp | devtestpaygWhere cost data and reservations live, which discounts apply, and who can create a budget (costs.md)
compliance_regimenone | pci | hipaa | soc2 | fedrampnoneRestricts selection to eligible SKUs and forces the logging, encryption and residency defaults that regime requires
cloud_environmentAzureCloud | AzureUSGovernment | AzureChinaCloudAzureCloudEndpoints, region names and service availability; sovereign clouds lag features and some services never arrive
naming_patterntext----Shape of every resource name generated, and which abbreviations are used (governance.md)

Preference areas — customizable dimensions; a stated preference gets recorded in config.yaml and applied from then on:

  • Tooling — Bicep module style (registry vs local), az vs the Az PowerShell module, portal vs CLI for exploration, Terraform azurerm vs azapi for preview resources — affects every command example
  • Conventions — tag keys beyond the required four, resource-group granularity (per-workload vs per-lifecycle), naming abbreviations, address-plan scheme — affects generated resources and networking.md
  • Platform — home region and its pair, zone posture, VM families the org standardizes on, ARM64 vs x86, Linux vs Windows hosting — affects sizing advice and price quotes
  • Safety posture — resource locks by default, purge protection, whether destructive commands are emitted at all, appetite for Complete-mode deployments — affects Output Gates and production.md
  • Cost reporting — review cadence, currency for quotes, showback dimension (resource group vs tag vs subscription) — affects costs.md
  • Service preferences — the standing pick where this skill offers a default (App Service vs Container Apps, SQL vs PostgreSQL, Service Bus vs Storage Queue) — affects Service Defaults and services.md

Traps

TrapWhy it failsDo instead
Treating a resource group as a security boundaryIt is a lifecycle and RBAC-scope container with no network isolation whatsoeverNSGs, private endpoints and subscription boundaries do isolation (networking.md)
Granting Contributor to fix an access problemIt usually does not fix it — data-plane access is a separate role family — and now the fix is permanentClassify the denial first (identity.md)
Client secrets for service-to-service authThey expire on a date nobody diarized, and rotating them is an outage with a calendar date attachedManaged identity, or federated credentials for CI; if a secret is unavoidable, its expiry goes in ## Due
"Allow Azure services to access this server" on SQL or StorageThat checkbox admits resources belonging to other tenants, not just yoursPrivate endpoint, or an explicit VNet rule (security.md)
Deleting a VM in the portal and assuming it is goneDisks, NICs and public IPs survive unless delete-with-VM was set at creationSweep unattached disks and idle IPs monthly (costs.md)
Portal hotfix on IaC-managed resourcesThe next deployment silently reverts it, usually mid-incidentFix in code; preview before every change (Rule 5)
Complete-mode deployment at subscription or resource-group scopeIt deletes every resource not in the template, including ones another team ownsIncremental plus deployment stacks with deny settings (iac.md)
Azure CNI with a small node subnetEvery pod takes a VNet IP; the cluster stops scaling at an IP ceiling nobody computedCompute nodes × (max_pods + 1) before creating, or use CNI Overlay (containers.md)
Testing DR by reading the runbookRestores fail on details nobody wrote down: key vault access, firewall rules, connection strings, DNSRestore into a scratch resource group quarterly and time it (production.md)
Quota increase requested during the incidentRegional capacity approvals are not instant, and zonal capacity may not exist at any priceRequest headroom before the launch (Rule 8)
Reading spend from the current month's Cost Analysis totalIt lags and hides the per-resource breakdown that names the causeGroup by service then by resource, and compare closed months only (costs.md)
One giant resource group for everything800-deployment history limits, and a lock or a Policy denial blocks unrelated workSplit by lifecycle: platform, data, application (governance.md)
Enabling every Defender plan on day onePer-resource pricing across servers, storage and databases can outspend the workloadFree tier and secure score first, paid plans where there is something worth detecting (security.md)

Where Experts Disagree

  • Bicep vs Terraform. The frontier is who owns state and how much you live outside Azure: Bicep needs no state file, gets same-day support for new resource types, and its what-if reads the live resource graph; Terraform wins with multi-cloud footprints, mature module reuse, and teams who already have remote-state discipline. Both lose to portal clicking (iac.md).
  • AKS vs Container Apps. Below roughly four always-on containers with no operator requirements, Container Apps wins on total cost and on the hours nobody spends upgrading a control plane; above that, or when the team needs CRDs, meshes or multi-tenant namespaces, AKS is not a preference but a requirement. The break-even math, not the taste, decides (services.md).
  • Hub-and-spoke with Azure Firewall. The reference architecture is genuinely right for regulated estates and genuinely disproportionate for a two-subscription startup, where the firewall can cost more than the workloads it inspects. Start with NSGs plus NAT Gateway and a documented address plan; the migration to a hub is cheap if the address plan was written down, expensive if it was not.
  • Subscription per environment vs resource group per environment. Subscriptions give hard quota and policy isolation and clean cost attribution; resource groups keep the estate small and avoid the tax of multiplying every shared resource. Any compliance regime, or any team above a handful of engineers, ends up at subscriptions — moving live resources across them later is a migration project, not a setting (governance.md).

Security & Privacy

Credentials: this skill drives the Azure CLI, which reads credentials from ~/.azure/, the OS keychain, environment variables, or a managed identity. It does NOT store, log, copy, or transmit Azure credentials, and never writes a credential into ~/Clawic/data/azure/.

Local storage: preferences, memory, inventory, spend history and artifacts stay in ~/Clawic/data/azure/ on this machine — subscription and tenant identifiers, resource names, and cost figures only, no secrets.

Guardrails: commands are read-only by default. Destructive operations (delete, purge, Complete-mode deployment, lock removal) are presented with their blast radius and require explicit user confirmation before running.

More Clawic skills, get them at https://clawic.com/skills/azure (install if the user confirms):

  • terraform — HCL authoring, state surgery, module design
  • k8s — Kubernetes manifests and cluster debugging, for AKS workloads
  • aws — the other side of a multi-cloud estate, and the source estate in most migrations
  • sql — query and index tuning for Azure SQL and PostgreSQL Flexible Server
  • infrastructure — provider-agnostic architecture decisions

Feedback

Part of Clawic, the verified skill library. Get this skill: https://clawic.com/skills/azure.

Questions people ask

Which Azure areas does it cover?
It covers VMs, App Service, Functions, AKS and container services, Azure SQL, PostgreSQL, Cosmos DB, Redis, Storage, VNets, Private Link, Entra ID, Azure Monitor, governance, production reliability, and migration. It also handles the Azure-platform side of Bicep, ARM, and Terraform.
How does it approach an unfamiliar subscription?
It reads the stored infrastructure and server inventory, then discovers only missing or stale details. Minimum discovery includes the active account context, a Resource Graph count by type and location, and 30 days of costs grouped by service.
What work is outside its scope?
It does not author Kubernetes manifests, teach Terraform language mechanics, or tune SQL queries and indexes. It focuses on Azure platform architecture, deployment, security, operations, debugging, and cost.

Related skills

Design, diagnose, secure, and cost-review GCP systems with explicit cost and blast-radius guidance.

120 installs4 stars

Architect, troubleshoot, secure, and cost-control AWS infrastructure with explicit cost and blast-radius guidance.

by Iván138 installs2 stars

Write, review, and troubleshoot SQL, schemas, indexes, transactions, and live database migrations.

133 installs8 stars

Write and review HCL, diagnose plans, and refactor Terraform state without unintended replacement.

121 installs3 stars

Diagnose Kubernetes failures and review manifests with evidence-first, context-aware operational guidance.

133 installs4 stars

Run SaaS revenue, packaging, retention, margins, renewals, and enterprise-readiness work.

77 installs9 stars

More from Iván

Browse all skills

Write, debug, and tune Java and JVM systems with JDK-aware code and diagnostic steps.

by Iván130 installs9 stars

Design and critique visual artifacts using measurable rules for hierarchy, spacing, type, color, and layout.

by Iván137 installs5 stars

Diagnose CSS mechanics and produce targeted fixes or complete stylesheets for the chosen stack.

by Iván97 installs5 stars

Architect, troubleshoot, secure, and cost-control AWS infrastructure with explicit cost and blast-radius guidance.

by Iván138 installs2 stars

Diagnose, validate, transform, and evolve JSON payloads across parsers, schemas, storage, and large files.

by Iván112 installs3 stars

Build and operate a testable learning plan with practice, spaced review, transfer checks, and durable local records.

by Iván93 installs3 stars