Skip to content
← All work
Reference architecture

Azure design for migrating an on-prem patient scheduling application: subscription topology, addressing plan, named SKUs, RPO/RTO evidence, cost levers, and the Bicep pipeline that deploys it.

AzureBicepSQL Managed InstanceApp ServiceFront Door

Illustrative scenario. A representative engagement shape, not a client deployment. Design and rationale are real and reusable; the company is not. Aligned to the Microsoft Cloud Adoption Framework and Well-Architected Framework.

1. Scenario and constraints

A healthcare services company of roughly 200 staff runs a patient-facing scheduling application on-premises: IIS on Windows Server, SQL Server back end. Their datacenter lease expires and cannot be renewed.

ConstraintValueDrives
Hard deadline9 months to exit datacenterRehost over rearchitect
Data sensitivityPHI must not traverse the public internetPrivate Endpoints, Private Link origin
Availability target99.9%Zone redundancy, not multi-region active-active
RPO15 minutesAutomated log backups
RTO4 hoursWarm secondary, not active-active
ComplianceHIPAA security assessmentAudit logging, encryption, access review
Team4 engineers, no prior Azure experienceManaged PaaS over self-operated
LicensingExisting SQL Server + Windows Server with Software AssuranceAzure Hybrid Benefit

The team constraint carries as much design weight as the compliance one. A platform nobody can operate is not a working platform.

2. Subscription and environment topology

Following the CAF subscription decision guide. The subscription is the boundary for policy, quota and billing, so it is the unit of separation, not resource groups.

Management groupSubscriptionContains
Platformsub-connectivityHub VNet, Azure Firewall, Private DNS zones, VPN gateway
Platformsub-managementLog Analytics workspace, Automation, Backup vault
Workloadssub-sched-prodProduction spoke, App Service, SQL MI
Workloadssub-sched-nonprodDev and test spokes

Four subscriptions, not the full enterprise-scale hierarchy. A 4-engineer team operating a nine-subscription landing zone spends its time on the landing zone. Dev and test share one subscription and separate by resource group and spoke; they have identical policy posture, so a subscription boundary between them buys nothing.

Environments: devtestprod, identical Bicep, different parameter files. No environment is deployed by hand.

3. Naming convention

Per CAF resource naming and abbreviations.

<resource-type>-<workload>-<environment>-<region>-<instance>
ResourceName
Resource grouprg-sched-prod-eus2-001
App Service planasp-sched-prod-eus2-001
Web appapp-sched-prod-eus2-001
SQL Managed Instancesqlmi-sched-prod-eus2-001
Key Vaultkv-sched-prod-eus2-001
Virtual networkvnet-sched-prod-eus2-001
Storage accountstschedprodeus2001

Storage breaks the pattern because it is globally unique, lowercase alphanumeric only, 3–24 characters. Every convention meets a resource that will not accept it — decide the exception once and write it down, rather than letting each engineer improvise.

Naming is enforced by Azure Policy, not by review. A convention that depends on someone noticing does not survive an on-call deployment.

4. Network design

Hub and spoke. Region East US 2, paired secondary Central US for zone and region resilience.

Four Azure subscriptions. sub-connectivity holds a hub virtual network at 10.0.0.0/22 containing Azure Firewall, Azure Bastion and a VPN or ExpressRoute gateway, plus private DNS zones. sub-sched-prod holds a spoke at 10.1.0.0/22 with a zone-redundant App Service, private endpoints, Key Vault and a Business Critical SQL Managed Instance. sub-sched-nonprod holds dev and test spokes at 10.2.0.0/22. sub-management holds a central Log Analytics workspace and a geo-redundant backup vault. Front Door Premium reaches App Service over a Private Link origin, the on-premises estate connects to the gateway, both spokes peer with the hub, and spoke egress is forced through the hub firewall by user-defined route.
Subscription and network topology. Solid lines carry traffic, dashed lines are routed by user-defined route, dotted lines are private-link, control and diagnostics paths.
ScopeRangeNotes
Hub10.0.0.0/22sub-connectivity
AzureFirewallSubnet10.0.0.0/26Name is fixed by the platform
AzureBastionSubnet10.0.0.64/26/26 minimum
GatewaySubnet10.0.0.128/27ExpressRoute/VPN during migration
snet-shared10.0.1.0/24DNS resolvers, jump hosts
Prod spoke10.1.0.0/22sub-sched-prod
snet-app-integration10.1.0.0/24Delegated to Microsoft.Web/serverFarms
snet-privatelink10.1.1.0/24Private Endpoints
snet-sqlmi10.1.2.0/26Delegated to Microsoft.Sql/managedInstances
Non-prod spoke10.2.0.0/22Same layout
Reserved10.3.0.0/2210.9.0.0/22Future workloads

Contiguous /22 per spoke, allocated from a plan rather than on demand. Overlapping ranges discovered later are the most expensive networking mistake available, because the fix is a re-address under change control.

Egress is forced through Azure Firewall by user-defined route. One inspection and logging point, which is also the artifact the assessor asks for.

5. Design decisions

The constraint that shapes most of the table below is "PHI must not traverse the public internet." Traced end to end, the public segment stops at Front Door:

A patient browser on the public internet reaches Front Door Premium over HTTPS, where TLS is terminated and the web application firewall applies. Front Door reaches App Service over a Private Link origin. Inside private address space, App Service reaches SQL Managed Instance through a private endpoint and authenticates to Key Vault with a managed identity, so no secret is stored. No component behind Front Door holds a public IP address.
Request path. The public segment ends at Front Door; nothing behind it holds a public IP address.
DecisionChoiceWhyRejected
ComputeApp Service Premium v3 P1v3, zone-redundantExisting IIS/.NET rehosts with no container work; no OS patching for a 4-person teamAKS — operational burden exceeds team capacity; VMs — patching and HA become the team's job
DatabaseSQL Managed Instance, Business CriticalNear-full T-SQL and SQL Agent compatibility, so the app moves in months not quarters; deploys inside the VNet with no public endpointAzure SQL Database — compatibility gaps cost schedule; SQL on VM — patching, backup and HA all become manual
IngressFront Door Premium + WAFManaged OWASP ruleset, TLS termination, regional failover, and Private Link origin so the app is never publicly addressableApp Gateway alone — regional only, no failover story
PaaS connectivityPrivate Endpoints + Private DNS zonesSatisfies "PHI does not traverse the public internet" literallyService Endpoints — traffic stays on the Azure backbone but the resource keeps a public address
SecretsKey Vault + managed identityNo credential exists to leak; nothing to rotateConnection strings in app settings — the most common finding in an assessment
GovernanceAzure Policy at management group, HIPAA/HITRUST initiativeDetective first, deny effects promoted once behaviour is understoodDeny-everything on day one — teams route around the platform
LoggingCentral Log Analytics in sub-management, workload identities cannot deleteEvidence survives the incident it documentsPer-subscription workspaces — no correlation, no tamper resistance

6. Resource inventory

ServiceSKU / tierPurpose
App Service planPremium v3 P1v3, 3 zonesWeb tier
SQL Managed InstanceBusiness Critical, 8 vCore, Gen5Application database
Front DoorPremiumGlobal ingress, WAF, Private Link origin
Azure FirewallStandardEgress inspection and logging
Key VaultStandard, purge protection onSecrets, certificates
Log AnalyticsPay-as-you-go → commitment tierDiagnostics, audit retention
Backup vaultGRSSQL long-term retention
BastionStandardBreak-glass administrative access

7. Identity and access

  • Microsoft Entra ID with SSO; on-prem AD synchronised during migration
  • Privileged Identity Management for all owner and contributor roles — standing access is time-bound, not permanent
  • Two break-glass accounts, excluded from Conditional Access, credentials sealed, sign-in alerted
  • Application-to-database authentication via managed identity, no SQL logins
  • Access reviews quarterly, exported as assessment evidence

8. Resilience: meeting the numbers

RequirementMechanismResult
RPO 15 minSQL MI automated backups — transaction log every 5–10 min~10 min
RTO 4 hr, zone lossZone-redundant App Service + Business Critical replicasAutomatic, minutes
RTO 4 hr, region lossAuto-failover group to Central US, warm App Service, Front Door origin priorityWithin 4 hr
99.9% availabilityApp Service 99.95% + SQL MI Business Critical zone-redundant 99.99%Meets target with margin

Failure modes tested, not assumed: zone loss, region failover drill, database point-in-time restore, and expiry of the Front Door certificate.

9. Cost: what dominates and what moves it

SQL Managed Instance Business Critical is the largest line item by a wide margin. Optimise it before anything else; tuning App Service while SQL runs unreserved is effort in the wrong place.

LeverMechanismNotes
Azure Hybrid BenefitApply existing SQL Server and Windows Server licences with Software AssuranceThe single largest lever in any migration from owned infrastructure, and routinely missed because the licences sit with procurement rather than engineering
Reservations / savings plan1- or 3-year commitment on steady-state computeApply after the baseline is measured, not at design time
Non-prod sizingGeneral Purpose instead of Business Critical; scheduled shutdown outside working hoursNon-prod has no availability requirement — matching it to prod is spending for nothing
Log retention tieringInteractive retention for the operational window, archive beyond itRetention obligations run years; interactive retention priced for years is a large avoidable cost
Right-sizingReview against real telemetry after the first full cyclePre-optimising a workload nobody has observed produces the wrong answer confidently

Cost is a design output, not a monthly surprise: budgets and anomaly alerts are provisioned by the same templates that create the resources.

10. Infrastructure as code

Bicep, built on Azure Verified Modules.

Why Bicep here. No state file to store, lock or corrupt — a real consideration for a team new to the platform. New Azure resource types are supported on release rather than waiting on a provider. The tradeoff is honest: Terraform is the better choice for a multi-cloud estate or an established module ecosystem, and we would recommend it in that case.

Pipeline. GitHub Actions authenticating by OpenID Connect federation — no service principal secret is stored anywhere.

pull request  →  bicep build + lint  →  what-if against target  →  plan on PR
merge to main →  deploy dev          →  smoke tests
                 deploy test         →  integration tests
                 deploy prod         →  approval gate

The what-if output is posted to the pull request, so the diff is reviewed before it is applied rather than discovered afterwards.

What this buys. Environment parity by construction — dev, test and prod differ only by parameter file, so "works in test" carries meaning. Rebuild from source is a routine operation rather than a recovery plan. And every infrastructure change arrives with an author, a reviewer and a reason attached, which is most of what an assessor wants from change management.

11. What changes if

IfThen
Team has Kubernetes experienceAKS becomes viable; better density and cost at scale, at the price of an operational burden that must be staffed
RTO tightens to 1 hourActive-active across regions; roughly doubles the platform bill
No existing licencesAzure Hybrid Benefit disappears; re-evaluate Azure SQL Database against the compatibility work
Data residency is mandatedRegion pairing becomes a constraint rather than a choice; verify the paired region satisfies it
Budget is the binding constraintGeneral Purpose SQL MI, single region, and an explicitly agreed lower RTO — written down and signed off, not discovered during an incident
Migration deadline extendsRearchitecting the data layer becomes worth evaluating; under nine months it is not

12. What we deliver

  • This topology as reviewed Bicep, parameterised to your constraints
  • A decision record for every deviation from this baseline, so the reasoning outlives the engagement
  • Runbooks for the parts that need a human: break-glass access, failover drill, policy promotion, retention review
  • A cost baseline with budgets and anomaly alerts deployed alongside the infrastructure