Azure Cloud Migrate
Migrate workloads to Azure in controlled waves with clear risk management, rollback options, and validation.
Use This Skill When
- The user is moving applications or data to Azure
- The user needs migration planning and wave sequencing
- The user needs cutover and post-migration validation
- The user wants to assess workload readiness and identify blockers
Context: Migration Maturity
Immature: Ad hoc migrations, no planning, high risk of failure
Developing: Discovery done, basic wave plan, some testing
Managed: Dependency mapping, wave execution, validation, rollback plan → Target
Optimized: Automated discovery, real-time risk scoring, self-healing post-migration
Required Inputs
- Workload inventory: Applications, databases, storage, and external dependencies
- Current infrastructure: Hosting stack (VMware, Hyper-V, cloud competitors)
- Constraints: Downtime window, cutover blackout dates, compliance/data residency
- Success criteria: Performance targets, cost targets, SLA requirements
- Team: Who executes? Internal, partner, Microsoft FastTrack?
Decision Tree
What's the migration strategy for each workload?
├─ Rehost (lift-and-shift) → Move VM as-is, minimal changes
├─ Replatform (lift, tinker, shift) → Update OS/runtime, same app logic
├─ Refactor (re-architect) → Rebuild for cloud-native (containers, serverless)
├─ Replace (buy SaaS) → Decommission, switch to SaaS alternative
└─ Retain → Stay on-premises (not migrating)
What's the business criticality and complexity?
├─ Low complexity, non-critical → Migrate first (learn fast)
├─ Medium complexity, moderate criticality → Migrate mid-wave
└─ High complexity, critical → Migrate last (proven process)
How much downtime is acceptable?
├─ Zero downtime (active-active) → Requires dual-run, complex
├─ Few hours (typical) → Scheduled cutover window
├─ Days/weeks (acceptable) → Phased over time
└─ Unlimited (decommissioned) → Can take time
Are there compliance/data residency constraints?
├─ No → Full flexibility, optimize for cost/speed
├─ Yes → Choose Azure region carefully, plan audit trail
└─ Multi-region required → Plan for data synchronization
Workflow
Phase 1: Discovery & Assessment
Collect inventory:
# Use Azure Migrate
az migrateprojects create --resource-group $RG \
--migrate-project-name "migration-prod" \
--location "eastus"
# Discover on-premises:
# ├─ VMs (Hyper-V, VMware, physical)
# ├─ Databases (SQL Server, Oracle, PostgreSQL)
# ├─ File shares and storage
# └─ Network and firewall rules
Map dependencies:
Application Tiers:
Frontend (Web):
└─ asp-web-01 (4-core, 8GB)
└─ asp-web-02 (4-core, 8GB)
└─ Depends on: api-backend, load balancer
Backend (API):
└─ api-backend-01 (8-core, 16GB)
└─ api-backend-02 (8-core, 16GB)
└─ Depends on: sql-db, cache, message queue
Data:
└─ sql-db (2-core, 32GB, 500GB storage)
└─ cache (2-core, 4GB)
└─ msg-queue (shared, 100GB)
Assess readiness:
Checklist:
✓ OS supported by Azure (Windows Server 2012+, Linux)
✓ No unsupported drivers/hardware
✓ Network connectivity (ExpressRoute or VPN gateway planned)
✓ Licensing (can migrate with Software Assurance)
✓ Backup & DR strategy documented
✗ Custom middleware (Oracle WebLogic) → May need workarounds
⚠️ Large database (500GB) → Plan staging environment
Calculate costs:
On-premises annual cost:
├─ Hardware/lease: $50K
├─ Datacenter/power: $15K
├─ Licensing: $30K
└─ Staff: $60K
Total: $155K/year
Azure annual cost estimate:
├─ VMs (2x D4s_v3): $2,176/month
├─ SQL Database (S3): $380/month
├─ Storage (1TB): $100/month
├─ Data transfer (egress): $500/month
└─ Networking: $200/month
Total: ~$45K/year → 71% cost reduction
Phase 2: Plan Migration Waves
Define waves (sequence by risk):
Wave 1 (Non-critical, simple) - Week 1-2
├─ Dev/Test environments
├─ Non-customer-facing apps
└─ Risk: Low | Duration: 1 day | Rollback: Easy
Wave 2 (Medium criticality) - Week 3-4
├─ Internal tools, ops systems
├─ Secondary workloads
└─ Risk: Medium | Duration: 2-4 hours | Rollback: 1 hour
Wave 3 (Critical, complex) - Week 5-6
├─ Customer-facing API
├─ Database tier
└─ Risk: High | Duration: 4 hours | Rollback: 4 hours
Wave 4 (Legacy, low urgency) - Month 2
├─ Deprecated systems, archive data
└─ Risk: Low | Duration: Flexible | Rollback: None (decommission)
Define success criteria per wave:
Wave 1 Validation:
✓ All VMs boot and pass health checks
✓ Application logs show no errors
✓ Network connectivity confirmed
✓ Backups run successfully
→ If all pass: Proceed to Wave 2 (hold 1 day for monitoring)
→ If any fail: Rollback and investigate
Wave 3 Validation (critical):
✓ Database migrated and schemas match (byte-level comparison)
✓ Performance benchmarks met (p95 latency <200ms)
✓ Users can log in and perform core operations
✓ Alerts firing correctly
→ Monitor for 24 hours before declaring success
Phase 3: Prepare Azure Landing Zone
Create landing zone:
# Hub VNet for shared services
az network vnet create \
--resource-group $RG \
--name "hub-vnet" \
--address-prefix "10.0.0.0/16" \
--location "eastus"
# Spoke VNet for migrated workloads
az network vnet create \
--resource-group $RG \
--name "spoke-prod-vnet" \
--address-prefix "10.1.0.0/16" \
--location "eastus"
# Peer hub to spoke
az network vnet peering create \
--resource-group $RG \
--vnet-name "hub-vnet" \
--name "hub-to-spoke" \
--remote-vnet "/subscriptions/$SUB/resourceGroups/$RG/providers/Microsoft.Network/virtualNetworks/spoke-prod-vnet" \
--allow-vnet-access --allow-forwarded-traffic
Setup connectivity:
# ExpressRoute (dedicated connection, recommended for large migrations)
OR
# VPN Gateway (cheaper, adequate for <100 Mbps)
az network vpn-gateway create \
--resource-group $RG \
--name "vpn-gateway" \
--vnet "hub-vnet" \
--public-ip-address "vpn-public-ip"
Configure identity:
# Azure AD Connect (sync on-premises AD with Entra ID)
# Enables seamless login for users post-migration
Phase 4: Execute Migration
Test migration (dry-run):
For Wave 1 Dev VM:
├─ Create snapshot of on-premises VM
├─ Replicate to Azure via Azure Migrate
├─ Boot test VM (non-production)
├─ Verify OS, applications, connectivity
├─ Take snapshots for rollback
├─ Validate performance (CPU, memory, disk I/O)
└─ Document issues and blockers
Production migration (Wave 1):
Timeline:
00:00 - Pre-cutover validation
├─ On-premises: All health checks pass
├─ Azure: Landing zone ready, connectivity confirmed
└─ Rollback: Test executed successfully
01:00 - Begin replication
├─ Disable on-premises VM
├─ Final delta sync to Azure (5-10 min)
├─ Boot Azure VM
└─ Verify applications online
01:20 - Update DNS/routing
├─ Route traffic to Azure VM
├─ Monitor error rate and latency
└─ Alert on-call if issues
02:00 - Validation
├─ Run smoke tests (login, core operations)
├─ Check logs for errors
├─ Verify backup job runs
└─ Declare success or rollback
Handle database migrations (special care):
For SQL Server Database:
Option 1: Azure Database Migration Service (DMS)
├─ Continuous replication (minimal downtime)
├─ Schema sync automatically
└─ Cutover: Switch connection string
Option 2: Full backup/restore
├─ Backup from on-premises
├─ Upload to storage
├─ Restore to Azure SQL
└─ Run validation queries
Option 3: Native replication
├─ Setup Always-On Availability Group
├─ Sync on-premises to Azure
├─ Failover when ready
└─ Decommission on-premises replica
Phase 5: Validate & Optimize
Post-migration validation:
Functional:
✓ All applications running (no errors in app logs)
✓ Users can access (login successful)
✓ Data integrity (row counts match, checksums pass)
✓ Integrations working (APIs, file shares accessible)
Performance:
✓ CPU utilization < 80%
✓ Memory utilization < 85%
✓ Disk I/O latency < 10ms
✓ Application response time: p95 < SLA
Operational:
✓ Backups running successfully
✓ Monitoring/alerting active
✓ Patch management configured
✓ Cost tracking shows expected usage
Optimize sizing (reduce costs post-migration):
Day 1 (over-provisioned for safety):
├─ Web tier: 2x D4s_v3 (4-core, 16GB) = $240/month
├─ API tier: 2x D8s_v3 (8-core, 32GB) = $480/month
└─ Total: $720/month
Day 30 (after monitoring):
├─ Web tier: Actually uses 20% CPU, 40% memory
├─ Downsize to: 1x D2s_v3 (2-core, 8GB) = $60/month
├─ API tier: Actually uses 30% CPU, 50% memory
├─ Downsize to: 1x D4s_v3 (4-core, 16GB) = $120/month
└─ Savings: $540/month (75% reduction)
Decommission on-premises:
After 30 days in production (stable):
├─ Keep on-premises running as backup (DR failback if needed)
├─ Reduce licensing/support cost
├─ Plan hardware decommissioning (6 months)
└─ Document lessons learned
Output Contract
Migration Strategy
- Rehost/replatform/refactor approach per workload
- Dependency map and criticality ranking
- Readiness assessment (blockers, risks)
Wave Plan
- Sequence (Wave 1, 2, 3...)
- Workloads per wave
- Timeline and blackout windows
- Success criteria and validation steps
Risk Assessment
- Identified risks (data loss, downtime, performance)
- Mitigation strategies
- Rollback procedures
Cutover Runbook
- Hour-by-hour timeline
- Pre-cutover validation checklist
- Go/no-go decision criteria
- Rollback triggers
Post-Migration Plan
- Validation checklist (functional, performance, ops)
- Cost optimization (right-sizing)
- Decommissioning timeline (on-premises)
Guardrails
- Don't skip dependency mapping: Hidden dependencies cause cutover failures.
- Include rollback path: Every wave must have <4-hour rollback procedure.
- Validate before/after: Use checksums, row counts, smoke tests.
- Plan data sync carefully: Large databases need careful timing to avoid data loss.
- Communicate with users: Publish maintenance windows, expected downtime.
- Test in dev first: Execute exact same procedures in non-prod before production.
- Monitor obsessively post-cutover: First 24 hours are highest risk; watch logs/alerts closely.
1---2name: azure-cloud-migrate3description: Plan and execute cloud migrations to Azure from on-premises or other clouds. Use this skill when users ask for discovery, migration waves, cutover, validation, or modernization during migration.4---56# Azure Cloud Migrate78Migrate workloads to Azure in controlled waves with clear risk management, rollback options, and validation.910## Use This Skill When1112- The user is moving applications or data to Azure13- The user needs migration planning and wave sequencing14- The user needs cutover and post-migration validation15- The user wants to assess workload readiness and identify blockers1617## Context: Migration Maturity1819**Immature**: Ad hoc migrations, no planning, high risk of failure 20**Developing**: Discovery done, basic wave plan, some testing 21**Managed**: Dependency mapping, wave execution, validation, rollback plan → **Target** 22**Optimized**: Automated discovery, real-time risk scoring, self-healing post-migration2324## Required Inputs2526- **Workload inventory**: Applications, databases, storage, and external dependencies27- **Current infrastructure**: Hosting stack (VMware, Hyper-V, cloud competitors)28- **Constraints**: Downtime window, cutover blackout dates, compliance/data residency29- **Success criteria**: Performance targets, cost targets, SLA requirements30- **Team**: Who executes? Internal, partner, Microsoft FastTrack?3132## Decision Tree3334```35What's the migration strategy for each workload?36├─ Rehost (lift-and-shift) → Move VM as-is, minimal changes37├─ Replatform (lift, tinker, shift) → Update OS/runtime, same app logic38├─ Refactor (re-architect) → Rebuild for cloud-native (containers, serverless)39├─ Replace (buy SaaS) → Decommission, switch to SaaS alternative40└─ Retain → Stay on-premises (not migrating)4142What's the business criticality and complexity?43├─ Low complexity, non-critical → Migrate first (learn fast)44├─ Medium complexity, moderate criticality → Migrate mid-wave45└─ High complexity, critical → Migrate last (proven process)4647How much downtime is acceptable?48├─ Zero downtime (active-active) → Requires dual-run, complex49├─ Few hours (typical) → Scheduled cutover window50├─ Days/weeks (acceptable) → Phased over time51└─ Unlimited (decommissioned) → Can take time5253Are there compliance/data residency constraints?54├─ No → Full flexibility, optimize for cost/speed55├─ Yes → Choose Azure region carefully, plan audit trail56└─ Multi-region required → Plan for data synchronization57```5859## Workflow6061### Phase 1: Discovery & Assessment62631. **Collect inventory**:64 ```bash65 # Use Azure Migrate66 az migrateprojects create --resource-group $RG \67 --migrate-project-name "migration-prod" \68 --location "eastus"69 70 # Discover on-premises:71 # ├─ VMs (Hyper-V, VMware, physical)72 # ├─ Databases (SQL Server, Oracle, PostgreSQL)73 # ├─ File shares and storage74 # └─ Network and firewall rules75 ```76772. **Map dependencies**:78 ```79 Application Tiers:80 81 Frontend (Web):82 └─ asp-web-01 (4-core, 8GB)83 └─ asp-web-02 (4-core, 8GB)84 └─ Depends on: api-backend, load balancer85 86 Backend (API):87 └─ api-backend-01 (8-core, 16GB)88 └─ api-backend-02 (8-core, 16GB)89 └─ Depends on: sql-db, cache, message queue90 91 Data:92 └─ sql-db (2-core, 32GB, 500GB storage)93 └─ cache (2-core, 4GB)94 └─ msg-queue (shared, 100GB)95 ```96973. **Assess readiness**:98 ```99 Checklist:100 ✓ OS supported by Azure (Windows Server 2012+, Linux)101 ✓ No unsupported drivers/hardware102 ✓ Network connectivity (ExpressRoute or VPN gateway planned)103 ✓ Licensing (can migrate with Software Assurance)104 ✓ Backup & DR strategy documented105 ✗ Custom middleware (Oracle WebLogic) → May need workarounds106 ⚠️ Large database (500GB) → Plan staging environment107 ```1081094. **Calculate costs**:110 ```111 On-premises annual cost:112 ├─ Hardware/lease: $50K113 ├─ Datacenter/power: $15K114 ├─ Licensing: $30K115 └─ Staff: $60K116 Total: $155K/year117 118 Azure annual cost estimate:119 ├─ VMs (2x D4s_v3): $2,176/month120 ├─ SQL Database (S3): $380/month121 ├─ Storage (1TB): $100/month122 ├─ Data transfer (egress): $500/month123 └─ Networking: $200/month124 Total: ~$45K/year → 71% cost reduction125 ```126127### Phase 2: Plan Migration Waves1281291. **Define waves** (sequence by risk):130 ```131 Wave 1 (Non-critical, simple) - Week 1-2132 ├─ Dev/Test environments133 ├─ Non-customer-facing apps134 └─ Risk: Low | Duration: 1 day | Rollback: Easy135 136 Wave 2 (Medium criticality) - Week 3-4137 ├─ Internal tools, ops systems138 ├─ Secondary workloads139 └─ Risk: Medium | Duration: 2-4 hours | Rollback: 1 hour140 141 Wave 3 (Critical, complex) - Week 5-6142 ├─ Customer-facing API143 ├─ Database tier144 └─ Risk: High | Duration: 4 hours | Rollback: 4 hours145 146 Wave 4 (Legacy, low urgency) - Month 2147 ├─ Deprecated systems, archive data148 └─ Risk: Low | Duration: Flexible | Rollback: None (decommission)149 ```1501512. **Define success criteria per wave**:152 ```153 Wave 1 Validation:154 ✓ All VMs boot and pass health checks155 ✓ Application logs show no errors156 ✓ Network connectivity confirmed157 ✓ Backups run successfully158 → If all pass: Proceed to Wave 2 (hold 1 day for monitoring)159 → If any fail: Rollback and investigate160 161 Wave 3 Validation (critical):162 ✓ Database migrated and schemas match (byte-level comparison)163 ✓ Performance benchmarks met (p95 latency <200ms)164 ✓ Users can log in and perform core operations165 ✓ Alerts firing correctly166 → Monitor for 24 hours before declaring success167 ```168169### Phase 3: Prepare Azure Landing Zone1701711. **Create landing zone**:172 ```bash173 # Hub VNet for shared services174 az network vnet create \175 --resource-group $RG \176 --name "hub-vnet" \177 --address-prefix "10.0.0.0/16" \178 --location "eastus"179 180 # Spoke VNet for migrated workloads181 az network vnet create \182 --resource-group $RG \183 --name "spoke-prod-vnet" \184 --address-prefix "10.1.0.0/16" \185 --location "eastus"186 187 # Peer hub to spoke188 az network vnet peering create \189 --resource-group $RG \190 --vnet-name "hub-vnet" \191 --name "hub-to-spoke" \192 --remote-vnet "/subscriptions/$SUB/resourceGroups/$RG/providers/Microsoft.Network/virtualNetworks/spoke-prod-vnet" \193 --allow-vnet-access --allow-forwarded-traffic194 ```1951962. **Setup connectivity**:197 ```bash198 # ExpressRoute (dedicated connection, recommended for large migrations)199 OR200 # VPN Gateway (cheaper, adequate for <100 Mbps)201 az network vpn-gateway create \202 --resource-group $RG \203 --name "vpn-gateway" \204 --vnet "hub-vnet" \205 --public-ip-address "vpn-public-ip"206 ```2072083. **Configure identity**:209 ```bash210 # Azure AD Connect (sync on-premises AD with Entra ID)211 # Enables seamless login for users post-migration212 ```213214### Phase 4: Execute Migration2152161. **Test migration** (dry-run):217 ```218 For Wave 1 Dev VM:219 ├─ Create snapshot of on-premises VM220 ├─ Replicate to Azure via Azure Migrate221 ├─ Boot test VM (non-production)222 ├─ Verify OS, applications, connectivity223 ├─ Take snapshots for rollback224 ├─ Validate performance (CPU, memory, disk I/O)225 └─ Document issues and blockers226 ```2272282. **Production migration** (Wave 1):229 ```230 Timeline:231 00:00 - Pre-cutover validation232 ├─ On-premises: All health checks pass233 ├─ Azure: Landing zone ready, connectivity confirmed234 └─ Rollback: Test executed successfully235 236 01:00 - Begin replication237 ├─ Disable on-premises VM238 ├─ Final delta sync to Azure (5-10 min)239 ├─ Boot Azure VM240 └─ Verify applications online241 242 01:20 - Update DNS/routing243 ├─ Route traffic to Azure VM244 ├─ Monitor error rate and latency245 └─ Alert on-call if issues246 247 02:00 - Validation248 ├─ Run smoke tests (login, core operations)249 ├─ Check logs for errors250 ├─ Verify backup job runs251 └─ Declare success or rollback252 ```2532543. **Handle database migrations** (special care):255 ```256 For SQL Server Database:257 258 Option 1: Azure Database Migration Service (DMS)259 ├─ Continuous replication (minimal downtime)260 ├─ Schema sync automatically261 └─ Cutover: Switch connection string262 263 Option 2: Full backup/restore264 ├─ Backup from on-premises265 ├─ Upload to storage266 ├─ Restore to Azure SQL267 └─ Run validation queries268 269 Option 3: Native replication270 ├─ Setup Always-On Availability Group271 ├─ Sync on-premises to Azure272 ├─ Failover when ready273 └─ Decommission on-premises replica274 ```275276### Phase 5: Validate & Optimize2772781. **Post-migration validation**:279 ```280 Functional:281 ✓ All applications running (no errors in app logs)282 ✓ Users can access (login successful)283 ✓ Data integrity (row counts match, checksums pass)284 ✓ Integrations working (APIs, file shares accessible)285 286 Performance:287 ✓ CPU utilization < 80%288 ✓ Memory utilization < 85%289 ✓ Disk I/O latency < 10ms290 ✓ Application response time: p95 < SLA291 292 Operational:293 ✓ Backups running successfully294 ✓ Monitoring/alerting active295 ✓ Patch management configured296 ✓ Cost tracking shows expected usage297 ```2982992. **Optimize sizing** (reduce costs post-migration):300 ```301 Day 1 (over-provisioned for safety):302 ├─ Web tier: 2x D4s_v3 (4-core, 16GB) = $240/month303 ├─ API tier: 2x D8s_v3 (8-core, 32GB) = $480/month304 └─ Total: $720/month305 306 Day 30 (after monitoring):307 ├─ Web tier: Actually uses 20% CPU, 40% memory308 ├─ Downsize to: 1x D2s_v3 (2-core, 8GB) = $60/month309 ├─ API tier: Actually uses 30% CPU, 50% memory310 ├─ Downsize to: 1x D4s_v3 (4-core, 16GB) = $120/month311 └─ Savings: $540/month (75% reduction)312 ```3133143. **Decommission on-premises**:315 ```316 After 30 days in production (stable):317 ├─ Keep on-premises running as backup (DR failback if needed)318 ├─ Reduce licensing/support cost319 ├─ Plan hardware decommissioning (6 months)320 └─ Document lessons learned321 ```322323## Output Contract3243251. **Migration Strategy**326 - Rehost/replatform/refactor approach per workload327 - Dependency map and criticality ranking328 - Readiness assessment (blockers, risks)3293302. **Wave Plan**331 - Sequence (Wave 1, 2, 3...)332 - Workloads per wave333 - Timeline and blackout windows334 - Success criteria and validation steps3353363. **Risk Assessment**337 - Identified risks (data loss, downtime, performance)338 - Mitigation strategies339 - Rollback procedures3403414. **Cutover Runbook**342 - Hour-by-hour timeline343 - Pre-cutover validation checklist344 - Go/no-go decision criteria345 - Rollback triggers3463475. **Post-Migration Plan**348 - Validation checklist (functional, performance, ops)349 - Cost optimization (right-sizing)350 - Decommissioning timeline (on-premises)351352## Guardrails353354- **Don't skip dependency mapping**: Hidden dependencies cause cutover failures.355- **Include rollback path**: Every wave must have <4-hour rollback procedure.356- **Validate before/after**: Use checksums, row counts, smoke tests.357- **Plan data sync carefully**: Large databases need careful timing to avoid data loss.358- **Communicate with users**: Publish maintenance windows, expected downtime.359- **Test in dev first**: Execute exact same procedures in non-prod before production.360- **Monitor obsessively post-cutover**: First 24 hours are highest risk; watch logs/alerts closely.