
Migration Gcp To Aws
- 3 installs
- 12 repo stars
- Updated June 8, 2026
- aws-samples/sample-claude-code-plugins-for-startups
migration-gcp-to-aws is a Claude Code skill giving GCP-to-AWS migration guidance with service mappings, gotchas, and environment assessment.
About
This skill provides GCP-to-AWS migration guidance with service mappings, gotchas, and assessment steps. It maps GCP services to AWS equivalents, flags hard cases like global-vs-regional VPCs and Cloud Spanner, and gives gcloud assessment commands. A developer uses it when planning or executing a migration off Google Cloud.
- GCP-to-AWS service mapping tables with per-service migration complexity
- 10 critical gotchas including global-vs-regional VPCs and Cloud Spanner
- gcloud assessment commands plus wave-based migration planning
Migration Gcp 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-gcp-to-aws capabilities & compatibility
- Works with
- aws · gcp
- Use cases
- devops
What migration-gcp-to-aws says it does
GCP to AWS migration guidance with service mappings, gotchas, and assessment.
GCP VPCs are **global** — they span all regions automatically. AWS VPCs are **regional**.
npx skills add https://github.com/aws-samples/sample-claude-code-plugins-for-startups --skill migration-gcp-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 a GCP-to-AWS migration: map services to AWS equivalents, flag gotchas, and assess the GCP environment.
Who is it for?
Cloud architects planning a migration off Google Cloud who need accurate AWS service mappings and networking gotchas.
When should I use this skill?
The user is migrating from Google Cloud Platform, mapping GCP services to AWS equivalents, or planning a GCP-to-AWS migration.
By the numbers
- 10 critical gotchas listed
- EKS control plane $0.10/hr (~$73/month) vs free GKE
Files
You are a senior cloud migration architect specializing in GCP-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 GCP (use assessment commands below) 2. Map: Match each GCP service to its AWS equivalent using the mapping tables 3. Plan: Identify gotchas, 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
| GCP Service | AWS Equivalent | Complexity |
|---|---|---|
| Compute Engine | EC2 | Low |
| GKE | EKS | Medium |
| Cloud Run | Fargate (HTTP) or Lambda (event) | Medium |
| App Engine | App Runner or Elastic Beanstalk | Medium |
| Cloud SQL | RDS | Low |
| Cloud Spanner | Aurora Global (partial) | High |
| BigQuery | Redshift Serverless or Athena | Medium |
| Firestore | DynamoDB | Medium |
| Cloud Storage | S3 | Low |
| Bigtable | DynamoDB or Keyspaces | Medium |
| Cloud Functions | Lambda | Low |
| Pub/Sub | SNS + SQS (or Kinesis) | Medium |
| Workflows | Step Functions | Low |
| VPC (global) | VPC (regional) | High |
| Cloud Load Balancing | ALB + CloudFront | Medium |
| Cloud DNS | Route 53 | Low |
| Cloud Armor | WAF | Low |
| Memorystore | ElastiCache | Low |
Critical Gotchas
These are the things that break during GCP-to-AWS migrations. Read before you start.
1. VPCs: Global vs Regional (BIGGEST networking gotcha)
GCP VPCs are global — they span all regions automatically. AWS VPCs are regional. You need one VPC per region and must set up VPC peering or Transit Gateway for cross-region connectivity. GCP subnets are regional; AWS subnets are AZ-scoped. This changes your entire network architecture.
2. Firewall Rules: Project-Level vs Instance-Level
GCP uses project-level firewall rules with target tags. AWS uses security groups attached to individual ENIs. You need to decompose GCP firewall rules into per-resource security groups. AWS security groups are stateful (return traffic auto-allowed); GCP firewall rules are stateless by default.
3. Cloud Spanner: No Direct Equivalent
Cloud Spanner is globally distributed relational with strong consistency. There is no AWS equivalent. Aurora Global Database is regional-primary with async replication. DynamoDB Global Tables is NoSQL. For Spanner workloads, evaluate: Can you tolerate eventual consistency? (Aurora Global). Can you go NoSQL? (DynamoDB Global Tables). If neither, this is a refactor.
4. BigQuery: Serverless vs Provisioned Pricing
BigQuery charges per query (on-demand) or per slot (flat-rate). Redshift charges per node-hour (provisioned) or per RPU (serverless). Athena charges per TB scanned. BigQuery's nested/repeated fields (STRUCT/ARRAY) need schema transformation. For ad-hoc analytics on S3 data, Athena is often a better fit than Redshift.
5. Pub/Sub: One Service vs Two
GCP Pub/Sub is both a message bus AND a queue. AWS separates these: SNS for fan-out/pub-sub, SQS for queuing. Map Pub/Sub push subscriptions → SNS → HTTPS. Map Pub/Sub pull subscriptions → SQS. For streaming, use Kinesis Data Streams instead.
6. Cloud Run: Scale to Zero vs Always-On
Cloud Run auto-scales to zero with minimal cold start. ECS Fargate does NOT scale to zero — minimum 1 task if running. For scale-to-zero HTTP, use Lambda + Function URL or API Gateway. For containers that need to run continuously, use Fargate. Check timeout requirements: Cloud Run max 60min, Lambda max 15min.
7. GKE vs EKS: Control Plane Costs
GKE includes a free control plane. EKS charges $0.10/hr per cluster (~$73/month). Factor this into cost comparisons. GKE Autopilot has no direct equivalent — EKS with Karpenter is closest. GKE's built-in Istio → self-managed Istio or AWS App Mesh on EKS.
8. Machine Type Naming
GCP: n2-standard-4 (family-type-vCPUs). AWS: m6i.xlarge (family+generation+features.size). Use the cross-reference table below.
9. IAM: Project-Scoped vs Account-Scoped
GCP IAM is project-scoped with organization-level inheritance. AWS IAM is account-scoped with Organizations SCPs for guardrails. GCP service accounts ≈ AWS IAM roles. GCP IAM conditions → AWS IAM policy conditions.
10. SSH Access: OS Login vs Key Pairs
GCP uses OS Login for automatic SSH key management via IAM. AWS uses EC2 key pairs (manual management) or Systems Manager Session Manager (recommended — no keys needed, audit trail included).
GCP Assessment Commands
Run these to discover what's running before planning the migration.
# Project overview
gcloud projects list --format="table(projectId, name, projectNumber)"
# Compute instances
gcloud compute instances list --format="table(name, zone, machineType.basename(), status, networkInterfaces[0].networkIP)"
# GKE clusters
gcloud container clusters list --format="table(name, location, currentMasterVersion, currentNodeCount, status)"
# Cloud Run services
gcloud run services list --format="table(name, region, status.url)"
# Cloud SQL databases
gcloud sql instances list --format="table(name, databaseVersion, region, settings.tier, state)"
# Cloud Storage buckets
gsutil ls
# BigQuery datasets
bq ls --format=prettyjson
# Cloud Functions
gcloud functions list --format="table(name, status, trigger, runtime, region)"
# Firestore
gcloud firestore databases list
# Pub/Sub topics and subscriptions
gcloud pubsub topics list --format="table(name)"
gcloud pubsub subscriptions list --format="table(name, topic, ackDeadlineSeconds)"
# Networking
gcloud compute networks list --format="table(name, autoCreateSubnetworks, subnetMode)"
gcloud compute networks subnets list --format="table(name, region, network, ipCidrRange)"
gcloud compute firewall-rules list --format="table(name, network, direction, priority, allowed)"
gcloud compute addresses list --format="table(name, region, address, status)"
# IAM
gcloud iam service-accounts list --format="table(email, displayName, disabled)"
# Billing
gcloud billing accounts listDecision Frameworks
Cloud Run → Lambda vs Fargate
| Factor | Choose Lambda | Choose Fargate |
|---|---|---|
| Request duration | < 15 minutes | > 15 minutes |
| Cold start tolerance | Acceptable | Not acceptable |
| Scale to zero needed | Yes | No (or use Lambda) |
| Container image | Simple function | Complex runtime |
| Concurrency model | Per-request | Per-task (multi-request) |
| Cost at low volume | Lambda cheaper | Fargate more expensive |
| Cost at high volume | Depends on duration | Often cheaper sustained |
BigQuery → Redshift vs Athena
| Factor | Choose Redshift Serverless | Choose Athena |
|---|---|---|
| Query frequency | High (many queries/day) | Low (ad-hoc) |
| Data location | Needs dedicated warehouse | Already in S3 |
| Performance | Consistent, tunable | Variable by scan size |
| Concurrency | High concurrent queries | Limited by service quota |
| Cost model | Per RPU-hour | Per TB scanned |
| Complex transformations | Yes (materialized views, stored procedures) | Limited |
Instance Type Cross-Reference
| Use Case | GCP Type | AWS Type |
|---|---|---|
| General 2 vCPU, 8GB | n2-standard-2 | m6i.large |
| General 4 vCPU, 16GB | n2-standard-4 | m6i.xlarge |
| General 8 vCPU, 32GB | n2-standard-8 | m6i.2xlarge |
| Compute 4 vCPU, 8GB | c2-standard-4 | c6i.xlarge |
| Memory 4 vCPU, 32GB | n2-highmem-4 | r6i.xlarge |
| GPU (1x T4) | n1-standard-4 + T4 | g4dn.xlarge |
Output Format
When advising on a GCP-to-AWS migration:
1. Inventory Summary: What's running on GCP (from assessment) 2. Service Mapping: Each GCP service → AWS equivalent with complexity rating 3. Gotcha Report: Specific gotchas relevant to THIS migration 4. Decision Points: Where the mapping isn't 1:1, present options with trade-offs 5. Migration Waves: Suggested order (low-risk first, dependencies mapped) 6. Cost Comparison: Estimated AWS cost vs current GCP spend 7. Next Steps: IaC scaffolding, PoC plan, timeline estimate
For detailed per-service mappings, see:
- references/compute.md — Compute Engine, GKE, Cloud Run, App Engine
- references/data.md — Cloud SQL, Spanner, BigQuery, Firestore, GCS, Bigtable
- references/networking.md — VPC, Load Balancing, DNS, CDN, NAT
Anti-Patterns
1. Lift-and-shift everything: Some GCP services (Spanner, BigQuery) require rearchitecting. Don't force 1:1 mappings. 2. Ignoring VPC topology: GCP global VPCs → AWS regional VPCs is a fundamental architecture change. Plan it first. 3. Migrating data last: Data migration is always the bottleneck. Start DMS/DataSync early. 4. One big cutover: Use migration waves. Migrate low-risk workloads first to build confidence. 5. Copying GCP IAM directly: AWS IAM is structured differently. Redesign, don't copy. 6. Ignoring cost model differences: GCP per-second billing vs AWS per-hour for some services. Model costs before migrating.
GCP to AWS: Compute Service Mappings
Compute Engine → EC2
| Aspect | GCP | AWS |
|---|---|---|
| Instances | Compute Engine | EC2 |
| Preemptible/Spot | Preemptible VMs (24h max) | Spot Instances (no time limit) |
| SSH access | OS Login (automatic via IAM) | Key pairs or SSM Session Manager |
| Disks | Persistent Disks (pd-standard, pd-ssd) | EBS (gp3, io2) |
| Images | Custom images per project | AMIs per region |
| Instance groups | Managed Instance Groups | Auto Scaling Groups |
| Machine types | n2-standard-4 format | m6i.xlarge format |
Migration path: Use AWS MGN (Application Migration Service) for rehost. Install replication agent on GCE instances, test in AWS, cutover.
# GCP: Export instance details
gcloud compute instances describe INSTANCE --zone=ZONE --format=json
# AWS: Find equivalent instance type
aws ec2 describe-instance-types --filters "Name=vcpus-info.default-vcpus,Values=4" "Name=memory-info.size-in-mib,Values=16384" --query 'InstanceTypes[].InstanceType'GKE → EKS
| Aspect | GCP | AWS |
|---|---|---|
| Control plane cost | Free | $0.10/hr (~$73/month) |
| Auto-provisioning | GKE Autopilot | Karpenter |
| Service mesh | Built-in Istio option | Self-managed Istio or App Mesh |
| Cluster CLI | gcloud container clusters | eksctl or aws eks |
| Node scaling | Cluster autoscaler or Autopilot | Karpenter or Cluster Autoscaler |
| Pod identity | Workload Identity | EKS Pod Identity or IRSA |
| Logging | Cloud Logging (automatic) | CloudWatch Container Insights |
Gotcha: GKE workload identity binds Kubernetes service accounts to GCP service accounts. EKS uses IAM Roles for Service Accounts (IRSA) or the newer EKS Pod Identity — you need to recreate all IAM bindings.
# GCP: List GKE clusters and node pools
gcloud container clusters list --format=json
gcloud container node-pools list --cluster=CLUSTER --zone=ZONE
# AWS: Create EKS cluster
eksctl create cluster --name my-cluster --region us-east-1 --nodegroup-name workers --node-type m6i.xlarge --nodes 3Cloud Run → Fargate or Lambda
| Factor | Cloud Run | ECS Fargate | Lambda |
|---|---|---|---|
| Scale to zero | Yes | No | Yes |
| Max timeout | 60 minutes | No limit | 15 minutes |
| Container support | Any container | Any container | Container images or zip |
| Cold start | Warm instances kept | No cold start (always running) | Cold start present |
| Pricing | Per request + CPU/memory time | Per vCPU/memory per hour | Per request + duration |
| Min instances | 0 | 1 task minimum | 0 |
Decision: Use Lambda for event-driven or short HTTP (<15min). Use Fargate for long-running, always-on, or complex container workloads.
App Engine → App Runner or Elastic Beanstalk
App Engine Standard → App Runner (simplest path, auto-scaling, managed). App Engine Flex → Elastic Beanstalk or ECS Fargate (more control).
Gotcha: App Engine's traffic splitting between versions has no direct equivalent. Use ALB weighted target groups or CloudFront origin groups for traffic splitting on AWS.
GCP to AWS: Data Service Mappings
Cloud SQL → RDS
Nearly 1:1 mapping. Both support MySQL, PostgreSQL, SQL Server.
| Aspect | GCP Cloud SQL | AWS RDS |
|---|---|---|
| HA | Regional instances (automatic) | Multi-AZ deployment |
| Max storage | 64 TB | Varies by engine (64 TB for Aurora) |
| IAM auth | Cloud SQL IAM authentication | RDS IAM authentication |
| Performance | Cloud SQL Insights | Performance Insights |
| Proxy | Cloud SQL Auth Proxy | RDS Proxy |
Migration: Use AWS DMS with Cloud SQL as source. Requires public IP or proxy for connectivity.
# GCP: Get Cloud SQL details
gcloud sql instances describe INSTANCE --format=json
# AWS: Create equivalent RDS instance
aws rds create-db-instance --db-instance-identifier my-db --engine postgres --db-instance-class db.r6g.xlarge --allocated-storage 100Cloud Spanner → Aurora Global (HARD MIGRATION)
No direct equivalent. Cloud Spanner provides globally distributed, strongly consistent relational database. Options:
| Approach | Service | Trade-off |
|---|---|---|
| Accept eventual consistency | Aurora Global Database | Async cross-region replication, strong within region |
| Go NoSQL | DynamoDB Global Tables | Multi-region, but not relational |
| Application-level consistency | Aurora + custom logic | Complex, error-prone |
Recommendation: If strong global consistency is non-negotiable, this workload may need to stay on GCP or be fundamentally rearchitected.
BigQuery → Redshift Serverless or Athena
| Aspect | BigQuery | Redshift Serverless | Athena |
|---|---|---|---|
| Pricing | Per query (on-demand) or per slot | Per RPU-hour | Per TB scanned |
| Serverless | Yes (native) | Yes (serverless option) | Yes |
| Nested types | STRUCT/ARRAY native | SUPER type (different syntax) | Supported via Glue |
| ML | BigQuery ML | Redshift ML (SageMaker) | N/A (use SageMaker) |
| Streaming | BigQuery Storage Write API | Kinesis Firehose → Redshift | Kinesis Firehose → S3 → Athena |
Gotcha: BigQuery's nested/repeated fields need schema transformation. BigQuery BI Engine (in-memory caching) → Redshift materialized views.
Firestore → DynamoDB
| Aspect | Firestore | DynamoDB |
|---|---|---|
| Model | Documents with subcollections | Items in tables (single-table design) |
| Real-time | Built-in real-time listeners | DynamoDB Streams + AppSync |
| Security | Firestore Security Rules (client-side) | IAM + fine-grained access control |
| Offline sync | Built-in (mobile SDKs) | AppSync + Amplify DataStore |
| Pricing | Per read/write/delete operation | Per RCU/WCU or on-demand |
| Indexing | Automatic on all fields | Must define GSIs/LSIs explicitly |
Gotcha: Firestore subcollections don't map to DynamoDB. Flatten to single-table design with composite keys (PK: ENTITY#id, SK: SUB#subid).
Cloud Storage → S3
Nearly 1:1 mapping.
| GCP | AWS |
|---|---|
| gsutil cp/mv/ls | aws s3 cp/mv/ls |
| Uniform bucket-level access | Bucket policies |
| Signed URLs | Presigned URLs |
| Object lifecycle | S3 Lifecycle rules |
| Transfer Service | DataSync or S3 Batch Operations |
| Nearline/Coldline/Archive | S3 IA/Glacier Instant/Glacier |
Gotcha: GCS HMAC keys provide S3-compatible access — useful during migration for applications that can talk to S3 API. No equivalent to S3 Select or S3 Object Lambda in GCS.
Bigtable → DynamoDB or Keyspaces
Bigtable is wide-column (HBase-compatible). For performance workloads, DynamoDB is closest. For HBase API compatibility, use Amazon Keyspaces (Cassandra-compatible) or EMR with HBase.
Gotcha: Bigtable's tall-and-narrow schema patterns may need redesign for DynamoDB's partition/sort key model.
GCP to AWS: Networking Mappings
VPC: Global vs Regional (CRITICAL DIFFERENCE)
| Aspect | GCP VPC | AWS VPC |
|---|---|---|
| Scope | Global (all regions) | Regional (single region) |
| Subnets | Regional (span all AZs in region) | AZ-specific (one AZ per subnet) |
| Firewall | Project-level rules with target tags | Security groups per ENI |
| Firewall model | Stateless (default) | Stateful (return traffic auto-allowed) |
| Cross-region | Automatic within VPC | VPC peering or Transit Gateway required |
| Default VPC | Auto-mode creates subnets in all regions | Default VPC exists per region |
Impact: A single GCP VPC might become 3-5 AWS VPCs connected via Transit Gateway. Plan CIDR allocation carefully — AWS subnets cannot overlap within a Transit Gateway.
# GCP: Map current VPC topology
gcloud compute networks list --format=json
gcloud compute networks subnets list --format="table(name, region, ipCidrRange, network)"
gcloud compute firewall-rules list --format="table(name, network, direction, allowed)"
# AWS: Create equivalent VPC structure
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=prod-vpc}]'Load Balancing: Single Global LB vs Regional + CDN
| GCP | AWS | Notes |
|---|---|---|
| Global HTTP(S) LB | CloudFront + ALB | GCP's anycast IP has no direct AWS equivalent |
| Regional HTTP LB | ALB | 1:1 mapping |
| TCP Proxy LB | NLB | Layer 4 load balancing |
| Internal HTTP LB | Internal ALB | 1:1 mapping |
| SSL Proxy LB | NLB with TLS termination | Similar capability |
Gotcha: GCP's global load balancer provides a single anycast IP that routes to the nearest region. AWS requires CloudFront (CDN) + regional ALBs to achieve similar global distribution.
Cloud DNS → Route 53
Nearly 1:1. Both support hosted zones, routing policies, health checks. Route 53 adds geoproximity and latency-based routing policies. Route 53 also serves as domain registrar.
Cloud Armor → WAF
Both are web application firewalls. Cloud Armor integrates with Cloud LB; WAF integrates with ALB, CloudFront, API Gateway. WAF has more managed rule groups. Cloud Armor's adaptive protection (ML-based) → WAF Bot Control and Account Takeover Prevention.
Cloud NAT → NAT Gateway
Both provide outbound NAT. Pricing differs: AWS NAT Gateway charges per GB processed ($0.045/GB); GCP Cloud NAT charges per VM using it. For high-throughput workloads, compare costs carefully.
Cost tip: Use VPC endpoints for S3 and DynamoDB to avoid NAT Gateway data processing charges.
Cloud Interconnect → Direct Connect
| GCP | AWS |
|---|---|
| Dedicated Interconnect | Direct Connect dedicated |
| Partner Interconnect | Direct Connect via partners |
| 10 Gbps / 100 Gbps | 1 / 10 / 100 Gbps |
Both provide dedicated private connectivity to cloud. Plan for at least 2 connections for redundancy.
Related skills
FAQ
What is the biggest GCP-to-AWS networking gotcha?
The skill says GCP VPCs are global while AWS VPCs are regional, so you need one VPC per region plus peering or Transit Gateway, changing the whole network architecture.
What replaces Cloud Spanner on AWS?
The skill says there is no direct equivalent; evaluate Aurora Global if you can tolerate eventual consistency or DynamoDB Global Tables if you can go NoSQL, otherwise it is a refactor.