What this is. A reference architecture and migration playbook — not a case study. It documents the target-state design, the tool selection, and the decision points for moving a regulated healthcare estate to Azure, framed as a translation from AWS because that mapping is the fastest path for an engineer who already thinks in one cloud's primitives.
The Bridge from AWS
Most of Azure has a clean AWS analogue. The value is knowing precisely where the analogy holds — and where it quietly stops.
Service mapping
| Concern | AWS | Azure |
|---|---|---|
| Server migration | MGN | Azure Migrate: Migration and modernization |
| Database migration | DMS | Azure Database Migration Service |
| Landing zone | Landing Zone Accelerator | Azure Landing Zones (CAF) |
| Account hierarchy | Organizations + OUs | Management Groups + Subscriptions |
| Compute / block storage | EC2 / EBS | Virtual Machines / Managed Disks |
| Managed SQL Server | RDS SQL Server Multi-AZ | SQL Managed Instance (zone-redundant) |
| Shared file storage | EFS / FSx | Azure Files / Azure NetApp Files |
| Object storage + tiering | S3 + lifecycle | Blob + Hot / Cool / Archive |
| Network hub | Transit Gateway | Virtual WAN or hub-spoke peering |
| Private circuit | Direct Connect | ExpressRoute |
| Network filtering | Security Groups / NACLs | NSGs / Azure Firewall |
| Secrets & keys | Secrets Manager / KMS | Key Vault (both roles) |
| Policy enforcement | Config + SCPs | Azure Policy (far more central) |
| Backup | AWS Backup | Recovery Services Vault |
| Private service access | PrivateLink / VPC endpoints | Private Endpoints / Private Link |
| Identity | IAM | Entra ID + Azure RBAC |
| Observability | CloudWatch | Azure Monitor + Log Analytics |
Where the analogy stops
Four mappings above are lossy enough to change how you design:
- Resource Groups have no AWS equivalent. Every resource lives in exactly one, and deleting the group cascades to everything inside it. This is a blast-radius boundary AWS simply doesn't have, and it has to be designed deliberately rather than inherited.
- Azure Policy is an enforcement engine, not an audit tool. AWS Config reports drift; Azure Policy can
Denya non-compliant deployment outright at management-group scope. Guardrails that need custom tooling on AWS are native here. - The account boundary splits in two. On AWS the account is identity, billing, and blast radius at once. On Azure the subscription is billing and quota, while the Entra tenant is identity. Isolation strategy has to account for both.
- SQL Managed Instance is VNet-injected. Unlike RDS, it lives inside your virtual network on a delegated subnet. That subnet has to be sized and designed before the first instance, and it cannot be changed afterward without a rebuild.
The Migration
Discovery, wave sequencing, and the three workload classes that need different treatment.
End-to-end flow
Discovery and wave sequencing
The Azure Migrate appliance runs on-premises against vCenter and performs discovery, right-sizing assessment, and — the part that actually matters — dependency mapping. That dependency graph is what defines the waves; wave membership should be derived from observed traffic, not from an org chart or an application list.
Give discovery four to six weeks of continuous collection before finalizing waves. Shorter windows systematically miss month-end batch jobs, quarterly reporting runs, and interfaces that only fire on a schedule — which is exactly how a "self-contained" application turns out to have a dependency discovered at cutover.
Compute — three workload classes
Storage — the decision that carries the most risk
| Workload | Target | Why |
|---|---|---|
| General SMB shares | Azure Files Premium | Native SMB, AD-integrated, straightforward. The default. |
| Clinical imaging / PACS | Azure NetApp Files | Sustained low-latency reads at high concurrency. Azure Files will not hold up under PACS access patterns — ANF costs more and is the right answer anyway. |
| Archive & retention | Blob + lifecycle policy | Hot → Cool → Archive on a rule. Six-year retention becomes a policy, not a storage bill. |
| Phased cutover | Azure File Sync | Keeps the on-prem server as a cache while the authoritative copy moves to Azure. Decouples the file migration from the server migration. |
Sizing imaging storage on capacity rather than IOPS and latency. Capacity is the cheap dimension and the one everyone plans for. A radiologist waiting on study loads is the failure mode that ends a migration's credibility — and it surfaces after cutover, when moving the data again is at its most expensive.
Databases — three targets, not two
Migration method by database size
| Size | Method | Downtime |
|---|---|---|
| < 200 GB | Native backup to Blob, restore onto MI | Maintenance window |
| 200 GB – 1 TB | DMS online mode — continuous replication, then cut over | Minutes |
| > 1 TB | Managed Instance Link (distributed availability group) | Near-minimal |
Landing Zone, DR & Governance
Where the workloads land, how they survive a region event, and how the estate proves it is compliant.
Landing zone topology
Spokes peer to the hub, never to each other. All egress and inter-spoke traffic transits Azure Firewall in the hub, which is where policy is enforced and logged — the same reason a Transit Gateway inspection VPC exists on AWS.
Disaster recovery
Azure Migrate for migration. Azure Site Recovery for DR. Microsoft is directing all new migration capability into Azure Migrate and explicitly not into Site Recovery. ASR still supplies the replication engine underneath some agent-based Migrate scenarios, but it is not the tool you select for a migration.
| Layer | Mechanism | Protects against |
|---|---|---|
| Virtual machines | ASR replication to paired region | Region loss |
| SQL Managed Instance | Auto-failover group | Region loss, with automatic listener redirection |
| Backups | Recovery Services Vault, GRS | Deletion, corruption, ransomware |
| Within-region | Availability zones | Datacenter or rack failure |
| File data | ANF cross-region replication | Region loss for imaging and shares |
Pre-stage the DR network. A failover that has to build VNets, NSGs, and DNS while the primary region is down is not a DR plan — it is an outage with extra steps.
HIPAA & governance
- The BAA is contractual, not per-service. Microsoft's Business Associate Agreement covers in-scope Azure services through the Product Terms — no separate signature chase per service. Confirm which services are in scope before designing one in.
- Azure Policy carries the compliance weight. Assign the built-in HIPAA/HITRUST initiative at management-group scope. Use
Deny, not justAudit, for the controls that genuinely matter — public IP creation, unencrypted storage, missing tags. - Private Endpoints everywhere. PaaS services default to public endpoints. In a PHI environment, every one gets a Private Endpoint with public network access disabled, and Private DNS Zones linked to the hub.
- Customer-managed keys in Key Vault for storage, disks, and SQL MI where the risk assessment calls for control over the key lifecycle rather than platform-managed encryption.
- Defender for Cloud as the evidence surface — its regulatory compliance dashboard maps live posture to HIPAA controls, which is what turns an audit into a report rather than a project.
Field Notes
The differences that cost time if you arrive from AWS expecting symmetry.
What bites AWS practitioners
- NSGs evaluate at both subnet and NIC. Two rule sets, both must permit the traffic. A rule that looks correct at one level is silently overridden at the other — a reliable multi-hour debugging session on the first encounter.
- vCPU quota is per subscription, per region, per VM family. Not a soft global limit. A wave stops dead when a family runs out. Request increases weeks ahead, per family, per region.
- SQL MI's first deployment into a new subnet takes hours, not minutes — the platform is standing up a dedicated virtual cluster. Schedule it as its own task well ahead of any cutover window it feeds.
- The delegated subnet for SQL MI is immutable. Size it for the eventual instance count on day one; changing it later means rebuilding.
- Resource Group deletion cascades. There is no AWS equivalent to this blast radius. Group by lifecycle, not by convenience, and lock production groups with
CanNotDelete. - Terraform's
azurermprovider replaces whereawsupdates in place. Attributes that are an in-place change on AWS force resource replacement on Azure. Read every plan carefully — a routine tag change should never be recreating a VM.
The account-assertion pattern — verifying the authenticated identity matches the intended target before any apply — translates directly. On AWS it is a Terraform check block against the caller identity; on Azure the equivalent guarantee is stronger, because a management-group Deny policy enforces it at the platform rather than inside the tool that happens to be running.