From AWS to Azure — Migrating to Azure

Chapter 1 1 min read Strategic Guide AWSAzure
This is Part I of our ongoing series on migrating LEAD's enterprise platform from AWS to Azure. This chapter covers the executive summary and strategic overview of our migration journey.

Overview

In 2025, we successfully migrated the infrastructure and services behind LEAD.bot and Sunrize — two core components of our enterprise knowledge platform — from Amazon Web Services (AWS) to Microsoft Azure.

At the time of migration, our platform was processing over 30+ million events per month. These events power our Slack, Microsoft Teams & Outlook, and Google Calendar integrations, covering real time user events and notifications, analytics pipelines, reporting, auditing, and the full functionality of our platform.

From the outset we knew that downtime or service degradation would be unacceptable, so we had to plan for a zero-downtime transition, across a dozen services that were deeply embedded in the AWS ecosystem. We operate as a small team with the resources to dedicate a single engineer to the migration, so we needed to explore the full set of tooling available to us in order to execute the migration successfully and on schedule.

This post will provide an overview of that migration. The following chapters are dedicated to each specific aspect of the migration.

Why We Migrated

This migration was part of a strategic move to:

Background: What We Do

At LEAD, we build enterprise tools that transform how organizations transfer knowledge, map expertise, and optimize collaboration. Our goal is to help leaders see not just what their teams are doing—but how well knowledge actually flows across the organization.

Two of our core products are:

🔹 LEAD.bot

🔹 Sunrize

Together, LEAD.bot and Sunrize form a behavior-aware KM platform that does more than just store knowledge; it actively improves how it’s shared, accessed, and amplified across an enterprise

What We Were Running

Before migration, our architecture spanned:

Some services were containerized. Some were managed via Dokku and run as containers on EC2 hosts. Over time, operational complexity had resulted in many bespoke configurations. This worked for us, but it required care and constant attention. As a result, simplicification was a key goal of the migration.

What Changed

After migration:

The typical architecture for our services is as follows (with some minor variations across our services):

Overview Architecture

We are already heavy users of Azure, with many services now running in the ecosystem. We plan to continue embedding deeper over time as our platform expands, and are currently very focused on Machine Learning pipelines and AI services:

Overview Resource Chart

Downtime or Service Degradation Was Non-Negotiable

Several aspects of this migration required careful coordination:

We’ll unpack the exact mechanisms in later chapters, including:

The migration was completed without customer-visible disruption.

Before and After: Cloud Infrastructure Mapping

At a high level, these are the Azure equivalents we chose for each of our AWS services. Note that they are not always functionally equivalent, but we’ll discuss the motivations for each choice within their dedicated chapters.

AWS Azure
EC2 Azure App Service
ECS Azure App Service (Containers)
ECS Task Definitions Azure Container Registry
LightSail Azure App Service
RDS (Postgres) Azure Database for PostgreSQL
S3 (static sites & assets) Azure Blob Storage + CDN
CloudFront (CDN) Azure CDN
Route53 (DNS) Azure DNS Zones
S3 (files) Azure Blob Storage

What This Series Covers

This migration wasn’t a single event, but done in phases (the ordering of which impacts the process). We’ll cover the following aspects of it in the following chapters:

Part I — Strategic Migration

Part II — Container Migration

Part III — Database Migration

Part IV — Network & Infrastructure

Part V — Machine Learning

Each chapter focuses on implementation details, tradeoffs, and real-world lessons.

Lessons at a Glance

A few high-level takeaways covered in the next chapters:

Each of these deserves its own explanation — and will get one

Enjoying this migration guide?

Get notified when new chapters are published. No spam, unsubscribe anytime.