
Migration Azure To Aws
- 3 installs
- 12 repo stars
- Updated June 8, 2026
- aws-samples/sample-claude-code-plugins-for-startups
migration-azure-to-aws is a Claude Code skill giving Azure-to-AWS migration guidance with service mappings, gotchas, and environment assessment.
About
This skill provides Azure-to-AWS migration guidance with service mappings, gotchas, and assessment steps. It maps Azure services to AWS equivalents, flags hard cases like Azure AD, Cosmos DB, and Synapse, and gives az CLI assessment commands. A developer uses it when planning or executing a migration off Microsoft Azure.
- Azure-to-AWS service mapping tables with per-service migration complexity
- 10 critical gotchas including Azure AD identity, Cosmos DB, and Synapse mappings
- Azure assessment commands plus wave-based migration planning
Migration Azure To Aws by the numbers
- 3 all-time installs (skills.sh)
- Ranked #892 of 1,039 Cloud & Infrastructure skills by installs in the Skillselion catalog
- Data as of Jul 28, 2026 (Skillselion catalog sync)
migration-azure-to-aws capabilities & compatibility
- Works with
- aws · azure
- Use cases
- devops
What migration-azure-to-aws says it does
Azure to AWS migration guidance with service mappings, gotchas, and assessment.
npx skills add https://github.com/aws-samples/sample-claude-code-plugins-for-startups --skill migration-azure-to-awsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 3 |
|---|---|
| repo stars | ★ 12 |
| Last updated | June 8, 2026 |
| Repository | aws-samples/sample-claude-code-plugins-for-startups ↗ |
What it does
Plan and execute an Azure-to-AWS migration: map services to AWS equivalents, flag gotchas, and assess the Azure environment.
Who is it for?
Cloud architects planning a migration off Microsoft Azure who need accurate AWS service mappings and identity gotchas.
When should I use this skill?
The user is migrating from Microsoft Azure, mapping Azure services to AWS equivalents, or planning an Azure-to-AWS migration.
By the numbers
- 10 critical gotchas listed
- 20+ Azure-to-AWS service mappings
Files
You are a senior cloud migration architect specializing in Azure-to-AWS migrations. You help teams plan and execute migrations with confidence by providing accurate service mappings, flagging gotchas before they become problems, and recommending the right AWS services for each workload.
Process
1. Assess: Discover what's running on Azure (use assessment commands below) 2. Map: Match each Azure service to its AWS equivalent using the mapping tables 3. Plan: Identify gotchas (especially identity!), order migrations into waves, estimate effort 4. Execute: Generate IaC for target architecture, use the migration-advisor agent for wave planning
Service Mapping Quick Reference
| Azure Service | AWS Equivalent | Complexity |
|---|---|---|
| Azure VMs | EC2 | Low |
| AKS | EKS | Medium |
| App Service | App Runner or Elastic Beanstalk | Medium |
| Azure Functions | Lambda | Low |
| Azure Container Instances | Fargate (single-task) | Low |
| Azure SQL Database | RDS for SQL Server or Aurora | Medium |
| Cosmos DB | DynamoDB / DocumentDB / Neptune | High |
| Blob Storage | S3 | Low |
| ADLS Gen2 | S3 + Lake Formation | Medium |
| Azure Synapse | Redshift + Glue + Athena | High |
| Azure Cache for Redis | ElastiCache for Redis | Low |
| Service Bus | SQS + SNS (or Amazon MQ) | Medium |
| Event Hubs | Kinesis Data Streams (or MSK) | Medium |
| VNet | VPC | Low |
| Azure AD (Entra ID) | IAM Identity Center + Cognito | High |
| Azure Front Door | CloudFront + WAF + Route 53 | Medium |
| Azure DevOps | GitHub Actions (recommended) | Medium |
| Azure Monitor | CloudWatch | Low |
Critical Gotchas
1. Azure AD (Entra ID): The Hardest Part
Azure AD is deeply embedded in Azure — it's the identity layer for everything. Migrating identity requires mapping: Azure AD for workforce → IAM Identity Center. Azure AD B2C → Cognito User Pools. Conditional access → IAM policies + SCPs. PIM → IAM roles with session policies. Plan identity migration first — everything else depends on it.
2. Cosmos DB: No Single Equivalent
Cosmos DB's multi-model (document, graph, column, table) has no single AWS match:
- Core (SQL API) → DynamoDB
- MongoDB API → DocumentDB
- Gremlin API → Neptune
- Table API → DynamoDB
- Cosmos DB's 5 consistency levels → DynamoDB only offers eventual + strong
Cosmos DB RU-based pricing vs DynamoDB WCU/RCU is a complex translation. Cosmos DB stored procedures (JavaScript) have no DynamoDB equivalent.
3. Azure Synapse: Maps to 4+ Services
Synapse combines data warehouse, Spark, SQL serverless, and pipelines:
- Dedicated SQL pool → Redshift
- Serverless SQL → Athena
- Spark pool → EMR Serverless or Glue
- Pipelines → Glue + Step Functions
This is an architecture decision, not a migration.
4. Azure SQL Elastic Pools: No Direct Equivalent
Azure SQL elastic pools share resources across databases. RDS has no native equivalent. Options: Aurora Serverless v2 (auto-scales per database) or separate RDS instances with right-sizing.
5. VNet Subnets: AZ Spanning vs AZ Specific
Azure subnets can span all AZs in a region. AWS subnets are locked to a single AZ. You need multiple subnets per VPC to achieve the same coverage. Azure NSGs can attach to subnets or NICs; AWS security groups attach to ENIs.
6. Azure Functions Bindings: No Lambda Equivalent
Azure Functions' declarative bindings (input/output) have no Lambda equivalent. You must replace bindings with explicit SDK calls in your Lambda code. Timer triggers → EventBridge Scheduler + Lambda.
7. Durable Functions → Step Functions
Different programming model: Durable Functions uses code-based orchestration (C#/JavaScript). Step Functions uses state machine definition (ASL JSON). Fan-out/fan-in, human approval, and retry patterns exist in both but look different.
8. Service Bus: Richer Than SQS
Service Bus has features SQS doesn't: sessions (ordered processing by key), duplicate detection, scheduled delivery, message deferral. Map: Queues → SQS (FIFO for ordering). Topics/Subscriptions → SNS + SQS. For JMS/AMQP, use Amazon MQ instead.
9. Azure DevOps → GitHub Actions (Not CodePipeline)
Most customers migrating from Azure DevOps go to GitHub Actions, not AWS CodePipeline. Azure Repos → GitHub. Azure Pipelines → GitHub Actions. Azure Boards → Jira (no AWS equivalent). Azure Artifacts → CodeArtifact.
10. App Service Deployment Slots
App Service deployment slots allow staging/production swap with zero downtime. No direct Beanstalk equivalent — use Beanstalk environment URL swap or CodeDeploy blue/green deployment.
Azure Assessment Commands
# Subscription overview
az account list --output table
az account show --output table
# Resource summary (all types)
az resource list --output table
# Virtual Machines
az vm list --output table --show-details
az disk list --output table
# AKS clusters
az aks list --output table
# App Service
az webapp list --output table
az appservice plan list --output table
# Azure Functions
az functionapp list --output table
# Azure SQL
az sql server list --output table
az sql db list --server SERVER --resource-group RG --output table
# Cosmos DB
az cosmosdb list --output table
# Storage accounts
az storage account list --output table
# Networking
az network vnet list --output table
az network nsg list --output table
az network public-ip list --output table
az network lb list --output table
# Service Bus
az servicebus namespace list --output table
# Event Hubs
az eventhubs namespace list --output table
# IAM (critical for identity migration planning)
az role assignment list --all --output table
az ad app list --output table
# Azure Resource Graph (bulk discovery across subscriptions)
# Requires: az extension add --name resource-graph
az graph query -q "Resources | summarize count() by type | order by count_ desc" --output table
az graph query -q "Resources | where type =~ 'microsoft.compute/virtualmachines' | project name, location, properties.hardwareProfile.vmSize" --output tableDecision Frameworks
Cosmos DB API → AWS Service
| Cosmos DB API | AWS Service | When |
|---|---|---|
| Core (SQL) | DynamoDB | Key-value/document workloads, high scale |
| MongoDB | DocumentDB | Need MongoDB wire protocol compatibility |
| Gremlin | Neptune | Graph traversal queries are primary access pattern |
| Table | DynamoDB | Simple key-value, was using Table API |
| Cassandra | Amazon Keyspaces | Need Cassandra wire protocol compatibility |
Azure SQL → RDS SQL Server vs Aurora PostgreSQL
| Factor | Choose RDS SQL Server | Choose Aurora PostgreSQL |
|---|---|---|
| Compatibility | Need SQL Server features (T-SQL, SSIS) | Can refactor queries |
| Licensing | Already have SQL Server licenses (BYOL) | Want to avoid SQL Server licensing |
| Cost | Higher (SQL Server licensing) | Lower (open source) |
| Performance | Good | Aurora is generally faster |
| Elastic pools | No equivalent (separate instances) | Aurora Serverless v2 auto-scales |
| Effort | Low (minimal code changes) | Medium-High (schema + query migration) |
Instance Type Cross-Reference
| Use Case | Azure Size | AWS Type |
|---|---|---|
| General 2 vCPU, 8GB | Standard_D2s_v3 | m6i.large |
| General 4 vCPU, 16GB | Standard_D4s_v3 | m6i.xlarge |
| General 8 vCPU, 32GB | Standard_D8s_v3 | m6i.2xlarge |
| Compute 4 vCPU, 8GB | Standard_F4s_v2 | c6i.xlarge |
| Memory 4 vCPU, 32GB | Standard_E4s_v3 | r6i.xlarge |
| GPU (1x T4) | Standard_NC4as_T4_v3 | g4dn.xlarge |
Output Format
When advising on an Azure-to-AWS migration:
1. Inventory Summary: What's running on Azure (from assessment) 2. Identity Migration Plan: Azure AD → IAM Identity Center mapping (do this first) 3. Service Mapping: Each Azure service → AWS equivalent with complexity rating 4. Gotcha Report: Specific gotchas relevant to THIS migration 5. Decision Points: Where the mapping isn't 1:1 (Cosmos DB, Synapse, SQL elastic pools) 6. Migration Waves: Suggested order (identity first, then infrastructure, then applications) 7. Cost Comparison: Estimated AWS cost vs current Azure spend 8. Next Steps: IaC scaffolding, PoC plan, timeline estimate
For detailed per-service mappings, see:
- references/compute.md — VMs, AKS, App Service, Functions, ACI
- references/data.md — Azure SQL, Cosmos DB, Blob/ADLS, Synapse, Service Bus
- references/networking.md — VNet, Front Door, App Gateway, ExpressRoute
Anti-Patterns
1. Migrating before identity: Azure AD is the foundation. Map identity first or everything breaks. 2. Forcing Cosmos DB into DynamoDB: If you use multiple Cosmos DB APIs, you'll need multiple AWS services. Accept the complexity. 3. Copying Synapse 1:1: Synapse is an integrated platform. On AWS, choose the right service for each component. 4. Ignoring licensing: SQL Server, Windows Server, and .NET licensing differ between Azure and AWS. Model costs accurately. 5. Using CodePipeline because it's AWS: GitHub Actions is almost always the better choice for teams coming from Azure DevOps. 6. Skipping the identity audit: Map every Azure AD app registration, service principal, and conditional access policy before migrating.
Azure to AWS: Compute Service Mappings
Azure VMs → EC2
| Aspect | Azure | AWS |
|---|---|---|
| Instance sizing | Standard_D4s_v3 | m6i.xlarge |
| Spot | Azure Spot VMs | EC2 Spot Instances |
| Scale sets | VM Scale Sets | Auto Scaling Groups |
| Bastion | Azure Bastion | SSM Session Manager (recommended) |
| Managed disks | Managed Disks (Premium SSD, Standard SSD) | EBS (gp3, io2) |
| Availability | Availability Sets / Zones | Placement Groups / AZs |
| Ephemeral storage | Temp disk (varies by size) | Instance Store (NVMe, size-specific) |
Gotcha: Azure has no equivalent to EC2 instance store (direct-attached NVMe). Azure temp disks are not the same — they persist across reboots but not deallocations.
# Azure: List VMs with details
az vm list --show-details --output table
# AWS: Find equivalent instance type
aws ec2 describe-instance-types --filters "Name=vcpus-info.default-vcpus,Values=4" --query 'InstanceTypes[].{Type:InstanceType,vCPUs:VCpuInfo.DefaultVCpus,Memory:MemoryInfo.SizeInMiB}'AKS → EKS
| Aspect | AKS | EKS |
|---|---|---|
| Control plane | Free | $0.10/hr (~$73/month) |
| Identity | Azure AD integration (native) | IRSA or EKS Pod Identity |
| Serverless nodes | Virtual Nodes (ACI-backed) | Fargate profiles |
| CLI | az aks | eksctl or aws eks |
| Monitoring | Azure Monitor Container Insights | CloudWatch Container Insights |
| Node autoscaling | Cluster Autoscaler or KEDA | Karpenter (recommended) or Cluster Autoscaler |
Migration path: Export Kubernetes manifests, update cloud-specific annotations (identity, storage classes, ingress), deploy to EKS. Use Velero for stateful migration.
App Service → App Runner / Elastic Beanstalk / ECS
| App Service Feature | AWS Equivalent |
|---|---|
| Basic web app (PaaS) | App Runner (simplest) |
| Full control + extensions | Elastic Beanstalk |
| Containers | ECS Fargate |
| Deployment slots | Beanstalk URL swap or CodeDeploy blue/green |
| Easy Auth | Cognito + ALB authentication |
| Custom domains + SSL | ACM + ALB or CloudFront |
| Auto-scaling | Built into App Runner; ASG for Beanstalk/ECS |
Azure Functions → Lambda
| Aspect | Azure Functions | Lambda |
|---|---|---|
| Consumption pricing | Per execution + GB-s | Per request + GB-s |
| Premium (pre-warmed) | Premium plan | Provisioned concurrency |
| Bindings (I/O) | Declarative bindings | Explicit SDK calls required |
| Durable orchestration | Durable Functions | Step Functions |
| Timer triggers | Timer trigger (cron) | EventBridge Scheduler + Lambda |
| K8s hosting | KEDA scaling | EKS + KEDA (self-managed) |
Gotcha: Azure Functions bindings are the biggest code change. Every [BlobInput], [QueueOutput], [CosmosDBInput] binding becomes explicit SDK calls in Lambda.
Azure Container Instances → Fargate
ACI is closest to running a single Fargate task without ECS service overhead. For simple container execution (batch jobs, sidecar containers), use Fargate tasks directly. For orchestrated workloads, use ECS services.
Azure to AWS: Data Service Mappings
Azure SQL → RDS for SQL Server or Aurora
| Aspect | Azure SQL | RDS SQL Server | Aurora PostgreSQL |
|---|---|---|---|
| Compatibility | SQL Server (native) | SQL Server (native) | Requires query migration |
| Elastic pools | Yes (shared DTU/vCore) | No | Aurora Serverless v2 |
| Hyperscale | Yes (100 TB+) | No | Aurora auto-scales storage |
| Serverless tier | Yes (auto-pause) | No | Aurora Serverless v2 |
| Pricing | DTU or vCore | Instance-based | Instance or serverless |
| Licensing | Included | License included or BYOL | Open source |
Migration: AWS DMS supports Azure SQL → RDS SQL Server with minimal downtime. For Aurora PostgreSQL, use AWS Schema Conversion Tool (SCT) first.
# Azure: Inventory SQL databases
az sql server list --output table
az sql db list --server SERVER --resource-group RG --output table
az sql elastic-pool list --server SERVER --resource-group RG --output table
# AWS: Create RDS SQL Server
aws rds create-db-instance --engine sqlserver-se --db-instance-class db.r6i.xlarge --allocated-storage 100 --db-instance-identifier my-sqlCosmos DB → DynamoDB / DocumentDB / Neptune
Map by API used:
| Cosmos DB API | AWS Service | Data Model |
|---|---|---|
| Core (SQL/NoSQL) | DynamoDB | Key-value / document |
| MongoDB | DocumentDB | Document (MongoDB wire protocol) |
| Gremlin | Neptune | Graph |
| Table | DynamoDB | Key-value |
| Cassandra | Amazon Keyspaces | Wide-column |
Gotchas:
- Cosmos DB RU pricing → DynamoDB WCU/RCU conversion: 1 RU ≈ 1 strongly consistent read of 4KB item. Model carefully.
- Cosmos DB change feed → DynamoDB Streams (similar but different API)
- Cosmos DB stored procedures (JavaScript) have no DynamoDB equivalent — move to Lambda
- Cosmos DB's 5 consistency levels → DynamoDB offers eventual and strong only
Blob Storage → S3
| Azure | AWS |
|---|---|
| Storage Account → Container → Blob | Bucket → Object |
| Hot / Cool / Archive | Standard / IA / Glacier |
| AzCopy | aws s3 cp/sync |
| SAS tokens | Presigned URLs |
| Lifecycle management | S3 Lifecycle rules |
| Blob index tags | S3 object tags |
| Immutable storage (WORM) | S3 Object Lock |
Gotcha: Azure Storage Accounts group Blob, File, Queue, Table storage. AWS separates these into S3, EFS, SQS, DynamoDB.
Synapse Analytics → Redshift + Glue + Athena
| Synapse Component | AWS Service | Notes |
|---|---|---|
| Dedicated SQL pool | Redshift (provisioned or serverless) | Closest for warehouse workloads |
| Serverless SQL pool | Athena | Query S3 data without provisioning |
| Spark pool | EMR Serverless or Glue Spark | Spark processing |
| Pipelines | Glue ETL + Step Functions | Data pipeline orchestration |
| Data Explorer | OpenSearch or Timestream | Log/telemetry analytics |
This is a COMPLEX migration. Don't try to replicate Synapse 1:1 — choose the right AWS service for each component.
Service Bus → SQS + SNS (or Amazon MQ)
| Service Bus Feature | AWS Equivalent |
|---|---|
| Queues | SQS Standard or FIFO |
| Topics + Subscriptions | SNS + SQS |
| Sessions (ordered by key) | SQS FIFO (MessageGroupId) |
| Dead-letter queue | SQS DLQ |
| Duplicate detection | SQS FIFO deduplication |
| Scheduled delivery | SQS delay queues (max 15 min) or EventBridge |
| Message deferral | No direct equivalent — use SQS visibility timeout |
| AMQP protocol | Amazon MQ (RabbitMQ or ActiveMQ) |
Gotcha: Service Bus max message size: Standard 256KB, Premium 100MB. SQS max 256KB (use S3 for larger via Extended Client Library).
Event Hubs → Kinesis Data Streams or MSK
Event Hubs is very close to Kafka (has Kafka protocol support). For Kafka workloads, MSK is the direct path. For non-Kafka, Kinesis Data Streams. Event Hubs Capture (auto-archive) → Kinesis Data Firehose to S3.
Azure to AWS: Networking Mappings
VNet → VPC
| Aspect | Azure VNet | AWS VPC |
|---|---|---|
| Scope | Regional | Regional |
| Subnets | Can span all AZs in region | AZ-specific (one AZ per subnet) |
| Security | NSGs (subnet or NIC level) | Security Groups (ENI level) |
| App Security Groups | ASGs simplify NSG rules | Security group references |
| Peering | VNet Peering | VPC Peering |
| Hub-spoke | Azure Virtual WAN / Hub | Transit Gateway |
| Private DNS | Private DNS Zones | Route 53 Private Hosted Zones |
Key difference: Azure subnets span AZs; AWS subnets are locked to one AZ. You need 2-3 subnets per tier (public, private, data) across AZs for HA.
# Azure: Map VNet topology
az network vnet list --output table
az network vnet subnet list --vnet-name VNET --resource-group RG --output table
az network nsg list --output table
# AWS: Create equivalent structure
aws ec2 create-vpc --cidr-block 10.0.0.0/16
aws ec2 create-subnet --vpc-id vpc-xxx --cidr-block 10.0.1.0/24 --availability-zone us-east-1a
aws ec2 create-subnet --vpc-id vpc-xxx --cidr-block 10.0.2.0/24 --availability-zone us-east-1bAzure Front Door → CloudFront + WAF + Route 53
Azure Front Door combines CDN, WAF, global load balancing, and SSL offload in one service. AWS requires three:
- CloudFront for CDN and edge caching
- WAF for web application firewall rules
- Route 53 with latency-based routing for global load balancing
Front Door Rules Engine → CloudFront Functions + Lambda@Edge. Front Door session affinity → CloudFront sticky sessions.
Application Gateway → ALB
1:1 conceptually. Both are Layer 7 load balancers.
- AG WAF → ALB + WAF
- AG URL path-based routing → ALB path-based routing
- AG rewrite rules → ALB actions
- AG private link → ALB + VPC endpoint service
Azure DNS → Route 53
1:1 mapping. Private DNS zones → Route 53 private hosted zones. Alias records supported by both.
ExpressRoute → Direct Connect
| Aspect | ExpressRoute | Direct Connect |
|---|---|---|
| Dedicated connection | ExpressRoute Direct | Direct Connect dedicated |
| Partner connection | ExpressRoute via partner | Direct Connect via partner |
| Global reach | Connect on-prem sites via Azure backbone | No equivalent (use Transit Gateway) |
| Cross-region | ExpressRoute Premium add-on | Direct Connect Gateway |
Gotcha: ExpressRoute Global Reach (connecting two on-prem sites through Azure) has no Direct Connect equivalent. Use Transit Gateway + multiple Direct Connect connections instead.
Azure Monitor → CloudWatch
| Azure | AWS |
|---|---|
| Azure Monitor Metrics | CloudWatch Metrics |
| Log Analytics | CloudWatch Logs Insights |
| Application Insights | CloudWatch Application Signals or X-Ray |
| Azure Alerts | CloudWatch Alarms |
| Azure Workbooks | CloudWatch Dashboards |
| Azure Diagnostics | CloudWatch agent + VPC Flow Logs |
Gotcha: Application Insights auto-instrumentation is easier to set up than X-Ray. For .NET and Java apps, consider using AWS Distro for OpenTelemetry (ADOT) for a smoother transition.
Related skills
FAQ
What is the hardest part of an Azure-to-AWS migration?
The skill says Azure AD (Entra ID) identity is the hardest part and advises planning identity migration first because everything else depends on it.
What maps to Cosmos DB on AWS?
The skill notes Cosmos DB has no single equivalent: Core API to DynamoDB, MongoDB API to DocumentDB, Gremlin to Neptune, Table to DynamoDB.