← Blog
By Jimmy MG Lim

My Journey Across Clouds: Lessons from an AWS to GCP Migration

A personal retrospective on migrating infrastructure and services from AWS to GCP at a previous role, focusing on strategic planning, stakeholder alignment, and fostering organizational adoption.

At one of my prior gigs, after years operating predominantly within AWS, my team and I embarked on a strategic journey to migrate a significant portion of our infrastructure and services to Google Cloud Platform (GCP). This wasn’t merely a technical endeavor; it was an organizational transformation that demanded meticulous planning, relentless cross-functional collaboration, and a clear vision for the future of our cloud operations. This article reflects on the key phases, challenges, and successes we experienced during that migration, offering insights for those considering a similar path.

The Strategic Imperative: Why We Moved

For us, the decision to migrate from AWS to GCP was driven by a combination of factors. While AWS had served us well, we saw GCP presenting compelling advantages in areas such as advanced data analytics capabilities, Kubernetes-native tooling, a more streamlined pricing model for specific workloads, and a strategic alignment with our long-term product roadmap. Our goal wasn’t just to lift and shift, but to leverage GCP’s strengths to help our teams innovate faster, reduce operational overhead, and empower our engineers with more modern, efficient tooling. Crucially, this migration also presented a unique opportunity to strategically cut off legacy dependencies and technical debt for good, enabling a cleaner, more performant future state.

Blueprinting the Journey: Planning and Design

For us, the planning phase was both critical and extensive. It began with a thorough assessment of our existing AWS estate. We categorized applications by their complexity, dependencies, and migration readiness. My team and I then developed a clear, well-defined target architecture for GCP, carefully outlining everything from network topology and security controls to intricate data migration strategies and service mappings. This foundational clarity was non-negotiable; a fuzzy architecture in the planning stage guarantees chaos later.

Risk mitigation was paramount; this involved creating phased migration plans, robust fallback strategies, and comprehensive testing protocols. Crucially, we baked in mechanisms to handle inherent uncertainties: the ability to safely swap between old (AWS) and new (GCP) production instances during cutovers, and the extensive use of feature flags and environment toggles. These weren’t just for features; they allowed us to control traffic, test services in production with minimal blast radius, and rapidly revert if issues arose, making our transition highly flexible and resilient. Throughout this, our mantra was to “always fix forward”—address issues quickly, learn, and iterate, avoiding paralysis by analysis or attempts to perfectly predict every outcome.

A significant aspect of this phase was also “learning on the go.” While our partners provided expertise, the nuances of mapping our specific AWS resources to their GCP equivalents often required deep dives and iterative understanding. For instance, translating our established AWS RDS instances to GCP’s AlloyDB for PostgreSQL or Cloud SQL was not a one-to-one exercise. It demanded understanding the architectural differences, performance characteristics, and operational models of each. This learning curve underscored the imperative for robust automation. Every resource we provisioned, every service we configured, was done through Infrastructure as Code (IaC). Our philosophy was simple: if it wasn’t automated, it couldn’t scale and it wouldn’t last. Manual management might offer quick wins, but automation ensures longevity, consistency, and a greatly reduced cognitive load for future teams. We also spearheaded a dedicated migration steering committee, comprising leadership from engineering, security, finance, and operations, ensuring broad alignment and providing strategic oversight.

Partners in Progress: Leveraging External and Internal Expertise

Recognizing the sheer scale and complexity of the undertaking, we knew we couldn’t do it alone – success hinged on knowing and gathering the right people. This meant not only engaging specialized external cloud migration partners, whose expertise in GCP best practices, migration tooling, and experience with similar transitions proved invaluable, but also mobilizing our internal talent. These GCP partners augmented our internal teams, providing critical capacity and specialized knowledge, particularly in areas like networking, complex data migration, and cloud security architecture.

Equally vital was forging strong cross-team relations across our engineering organization and meticulously pulling experts from different domains. This included seasoned veterans from testing, core services, storage, and various application domains. Their institutional knowledge and specific technical insights were indispensable. Our collaboration with both external and internal experts involved establishing clear communication channels, integrating our project management efforts, and fostering a shared understanding of success metrics. This ensured everyone acted as true extensions of a unified, high-performing migration team.

Vision Casting: Engaging Stakeholders Across the Board with Expected Outcomes

A cloud migration of this magnitude inevitably sparks uncertainty and, at times, resistance. Counteracting this required our relentless focus on communicating not just what we were doing, but why it mattered and what specific outcomes to expect. For management, we clearly articulated the strategic advantages: projected cost efficiencies, improved scalability and reliability, enhanced developer velocity, and reduced vendor lock-in, all tied to tangible business goals.

For our peer engineers, fostering cross-team relations was key. We highlighted how GCP would not only simplify their daily workflows and introduce exciting new tools (like GKE and BigQuery) but also create opportunities for collaborative platform development and shared ownership. We focused on expected outcomes like faster deployments, fewer production incidents, and a more robust, enjoyable development environment. We personally led regular town halls, organized hands-on workshops, and created easily digestible documentation to demystify the process and build widespread excitement and a sense of collective purpose across all engineering teams.

Building the Foundation: The GCP Landing Zone

Establishing a robust GCP landing zone was the cornerstone of our migration strategy. This involved several key architectural decisions and implementations:

  • Hierarchical Resource Structure: We designed an organizational hierarchy that meticulously mirrored our business units, providing clear separation of environments (dev, staging, prod) and accountability.
  • Identity and Access Management (IAM): We implemented a granular IAM strategy, leveraging service accounts and groups for least-privilege access, seamlessly integrated with our existing identity provider.
  • Network Architecture: My team and I set up a secure and performant network, including distinct VPCs, shared VPCs for common services, Cloud Interconnect for hybrid connectivity, and robust firewall rules tailored to our security posture.
  • Security Baselines: We were responsible for defining and enforcing stringent security policies through Organization Policies and Security Command Center, ensuring compliance from day one.
  • Billing and Cost Management: We established clear billing accounts and projects to track and allocate costs effectively, a crucial step for financial transparency.

Bridging the Gap: Resource Management and Governance with Measurable Success

Post-migration, we focused heavily on ensuring effective resource management and governance, with a keen eye on measurable success. We implemented automated tooling for provisioning and de-provisioning resources, tightly integrated with our CI/CD pipelines to ensure Infrastructure as Code (IaC) principles were consistently applied across all deployments. Crucially, we defined key performance indicators (KPIs) and established robust monitoring for critical metrics. Cost management dashboards and alerts were set up to diligently monitor spending, identify anomalies, and optimize resource utilization, directly tying back to our initial strategic goals. Regular security audits and compliance checks became an integral part of our operational rhythm, ensuring that our GCP environment remained secure and adhered to regulatory requirements. This continuous governance loop, driven by clear measurables, was vital for maintaining control and deriving maximum value from our new cloud home.

Engineering Empowerment: A Long-Term Vision for Usability

The ultimate success of this migration, in our view, hinged on its impact on our engineers. Our long-term vision was to create a cloud environment that was not only powerful but also intuitively usable. This involved:

  • Self-Service Capabilities: We championed the development of internal platforms and automation that allowed engineers to provision resources and deploy applications with minimal friction.
  • Standardized Tooling: We promoted consistent tooling and best practices across teams to reduce cognitive load and accelerate development.
  • Enhanced Observability: We leveraged GCP’s native monitoring and logging solutions (Cloud Monitoring, Cloud Logging, Cloud Trace) to provide engineers with deep insights into their applications’ performance and health.
  • Knowledge Sharing: We actively fostered a vibrant internal community for sharing GCP best practices, war stories, and innovative solutions.

By intensely focusing on usability, our team aimed to transform our engineers from passive cloud consumers into proactive cloud innovators, empowering them to leverage GCP’s full potential to build the next generation of our products.

Transitioning from AWS to GCP was a marathon, not a sprint. It required not just technical prowess from our team, but also strong leadership, unwavering cross-functional collaboration, and a steadfast commitment to a long-term vision, supported by clear architecture and quantifiable success. Our journey reinforced that a successful cloud migration is ultimately about people, processes, and a clear understanding of the strategic value it brings to the entire organization.