Successful Migration to AWS AppRunner: Optimizing Infrastructure for a Pre-Seed Startup

Successful Migration to AWS AppRunner: Optimizing Infrastructure for a Pre-Seed Startup
Photo by Sebastian Svenson / Unsplash

TL;DR

A pre-seed startup, faced with high costs and operational challenges with their self-hosted Kubernetes cluster on AWS, successfully migrated to AWS AppRunner. The migration reduced their AWS bill by 50%, and allowed the small team to operate the infrastructure without requiring expertise in managing a Kubernetes cluster. With built-in metrics and logging, the startup experienced improved stability, security, and monitoring capabilities.

Introduction

The pre-seed startup operated a technology stack involving an Apollo GraphQL server, MongoDB Atlas for data management, and a React-based single-page web application as the frontend. Their infrastructure was initially set up on a self-managed Kubernetes cluster on AWS, with separate AWS accounts for development/staging and the live environment.

Challenge

The team faced significant challenges after the departure of their Senior DevOps Engineer. The Kubernetes clusters and AWS accounts remained unchanged, leading to outdated infrastructure, increasing instability, security issues, and a lack of proper monitoring practices.

Solution

To address the challenges and align with the startup's strategic direction, we proposed the following architectural solution:

  1. Migration to AWS App Runner: The Kubernetes services were migrated to AWS App Runner, a fully managed, serverless container deployment service. This eliminated the need for managing and scaling the Kubernetes cluster, resulting in reduced operational overhead.
  2. Proxy Instances for Outbound Communication: As the backend service became serverless and lost its static IP, we introduced two proxy instances with elastic IPs. These instances facilitated communication with external network devices located in the client's infrastructure. The fixed IP addresses were essential for whitelisting the IPs on the client's firewalls.

We choose AWS App Runner since only 2 service were running in the Kubernetes cluster.

Benefits

The migration to AWS App Runner provided several significant benefits:

  1. Cost Reduction: By eliminating the need for a self-managed Kubernetes cluster, the startup reduced their AWS bill by 50%. This cost optimization allowed them to allocate resources more efficiently and invest in other critical areas.
  2. Simplified Operations: The small team was relieved from the burden of managing a Kubernetes cluster, as AWS App Runner handled the underlying infrastructure. This resulted in improved operational efficiency, allowing the team to focus on core business activities.
  3. No Expertise Required: The transition to AWS App Runner removed the need for specialized Kubernetes knowledge. The team could operate the infrastructure without requiring dedicated DevOps expertise, enabling a faster development cycle.
  4. Improved Stability and Security: With AWS App Runner, the infrastructure received regular updates and patches, ensuring enhanced stability and reduced security risks. The startup could avoid vulnerabilities caused by unpatched systems.
  5. Built-in Metrics and Logging: AWS App Runner provided easy-to-use metrics and logging capabilities, enabling the team to monitor and troubleshoot the application effectively. This improved observability contributed to better decision-making and proactive issue resolution.

Challenges

There are some challenges that we faced and are analysing:

  • Infrequent slow request/response that might be caused by cold-starts
  • Some Content length mismatch errors on the client-side which are investigated
  • Fix 120s request timeout on AWS App Runner which seems to be plenty, but the application has some unoptimized endpoints.

Conclusion

The successful migration from a self-hosted Kubernetes cluster to AWS App Runner highlights the importance of carefully evaluating infrastructure needs and aligning them with the goals and capabilities of the organization. While Kubernetes has gained significant popularity for its flexibility and scalability, it may not always be the ideal solution, particularly for startups with a small team and a low number of services.

In this case study, the pre-seed startup faced challenges with high costs, operational complexities, and the departure of their Senior DevOps Engineer. By migrating to AWS App Runner, they were able to overcome these hurdles and achieve remarkable improvements in their infrastructure management.

One key takeaway from this migration is that Kubernetes is not a one-size-fits-all solution. It requires specialized expertise, dedicated resources, and ongoing maintenance efforts to operate effectively. For small teams with limited resources, these requirements can become overwhelming, leading to inefficiencies, increased costs, and security vulnerabilities.

AWS App Runner, on the other hand, offered a simplified and serverless alternative that allowed the startup to focus on their core business activities without the need for managing and scaling a Kubernetes cluster. The migration significantly reduced costs, improved operational efficiency, and provided built-in monitoring capabilities, empowering the team to achieve stability and security without the complexity of Kubernetes.

It is crucial for organizations to carefully assess their requirements, team size, and available resources before adopting any infrastructure solution. While Kubernetes may be the right choice for larger enterprises with complex needs, startups and small teams should consider alternatives like AWS App Runner or ECS that offer similar benefits without the overhead and expertise requirements of managing a Kubernetes cluster.

By choosing the appropriate infrastructure solution based on their specific needs, organizations can optimize costs, improve operational efficiency, and allocate resources effectively. The success of this migration serves as a valuable lesson in selecting the right tool for the job and embracing solutions that align with the team's capabilities and objectives.