Skip to content

Application Modernization

Last reviewed: August 2026

Modernization is the work of restructuring an existing application to fit the cloud environment in order to improve scalability, deployment speed, and operational efficiency. The core is not adding new features, but aligning an existing workload with cloud best practices.

Aspect Migration Modernization
Purpose Move to the cloud Leverage cloud-native advantages
Scope Infrastructure replacement Improving architecture/operational model
Timing During migration After migration, or concurrent
Representative activities Lift & Shift Replatform, Refactor, Rearchitect

Lift & Shift alone doesn’t capture enough of the cloud’s benefits. If you operate purely on a VM basis:

  • Scalability — Auto scaling is possible, but VM boot takes several minutes.
  • Deployment speed — Deployment cycles are slow and rollback is complex.
  • Operational burden — You have to manage OS patching, security, and monitoring yourself.
  • Cost — Less efficient compared to managed/serverless options.

Google Cloud’s official guide describes modernization as follows:

“A gradual journey that moves you beyond the limitations of legacy applications into a scalable, resilient, and flexible system”Google Cloud Architecture

Failure patterns commonly cited across multiple vendor guides:

  • Rewriting the entire system at once — High risk, schedules collapse. Transition gradually using the Strangler Fig pattern.
  • Excessive decomposition of low-business-value components — Splitting legacy code that changes rarely into microservices only increases operational cost.
  • Ignoring the state problem in the monolith — Even after moving to containers, auto scaling won’t work if sessions remain pinned to instances.
  • Lack of observability — Root-causing failures in a distributed system becomes difficult. Build distributed tracing/log aggregation first.
  • No accompanying organizational change — Conway’s Law: system structure follows organizational structure. If you change only the technology while keeping the team structure the same, modernization won’t stick.

The three main strategies proposed by the Microsoft Cloud Adoption Framework:

Strategy Description Difficulty Target
Replatform Keep the engine but move to a managed service. Slight optimization Medium DB to RDS, VM to App Service/Container Apps
Refactor Partially rewrite the application structure. Begin decomposing into services Medium-high Splitting out a specific function from a monolith
Rearchitect Redesign the architecture from scratch. Microservices, serverless High Fundamental improvement of scalability/resilience needed

Source: Azure CAF Modernization Strategies

Generally proceeds in this order.

graph LR
    A[VM - On-premises] --> B[VM - Cloud<br/>Lift & Shift]
    B --> C[Replatform<br/>Move to managed DB/Storage]
    C --> D[Refactor<br/>Containerize + partial decomposition]
    D --> E[Rearchitect<br/>Microservices/Serverless]

A pattern introduced by Martin Fowler in which a large monolithic application is replaced incrementally with a new system rather than all at once.

graph TD
    U[User] --> P[Routing proxy·API Gateway]
    P -->|New feature| N[New microservice]
    P -->|Existing feature| L[Legacy monolith]
    N -.Gradual expansion.-> L

Steps:

  1. Place a routing layer (API Gateway) in front of the legacy system
  2. Develop new features as microservices and have the proxy route to them
  3. Extract existing features into microservices one by one
  4. Remove the legacy system once everything has been migrated

Pros: Minimizes risk, no business interruption Cons: Requires maintaining dual systems during the transition period

Sources:

An intermediate layer that separates new microservices from legacy systems. It prevents the legacy system’s outdated model from affecting the new service.

graph LR
    N[New microservice<br/>Clean domain model] <--> A[Anti-Corruption Layer]
    A <--> L[Legacy<br/>Complex model]

A pattern for handling transactions that span multiple services in a microservices environment. Instead of the distributed transactions of a traditional DB, it maintains consistency through compensating transactions.

Source: AWS Prescriptive Guidance — Saga Pattern

Instead of direct calls between services, communication happens asynchronously via events. This gains scalability and loose coupling.

Element Vendor products
Messaging Amazon SQS/SNS/EventBridge, Azure Service Bus/Event Grid, Google Cloud Pub/Sub/Eventarc, OCI Events/Streaming
Event streaming Amazon MSK/Kinesis, Azure Event Hubs, Google Cloud Pub/Sub, OCI Streaming

The 12-Factor App is a set of design principles for cloud-native applications. Review each principle during modernization.

# Principle Core idea
1 Codebase One repository, many deploys
2 Dependencies Explicitly declared and isolated
3 Config Stored in environment variables
4 Backing services Treated as attached resources
5 Build, release, run Strictly separate stages
6 Processes Run as stateless processes
7 Port binding Export services via port binding
8 Concurrency Scale out via the process model
9 Disposability Fast startup and graceful shutdown
10 Dev/prod parity Keep environments as similar as possible
11 Logs Treat logs as event streams
12 Admin processes Run admin/management tasks as one-off processes

Principle 6 (stateless) in particular is key to cloud scaling. Sessions, caches, and files must be moved to external storage for horizontal scaling to work.

Product Purpose
App2Container Automatically containerize Java/.NET apps
Migration Hub Refactor Spaces Supports the Strangler Fig pattern with managed infrastructure
AWS Mainframe Modernization Mainframe application migration/modernization
AWS Transform AI-based legacy code conversion (.NET/mainframe)
Product Purpose
Azure App Service Managed web app hosting (Replatform)
Azure Container Apps Serverless containers
Azure Migrate: Containerization Containerize ASP.NET/Java apps
Azure Service Fabric Microservices platform
Product Purpose
Cloud Application Modernization Program (CAMP) End-to-end framework from assessment to modernization
Migrate to Containers VM → GKE containers
Cloud Run Serverless containers (Refactor target)
Apigee API management + Strangler Fig routing
Product Purpose
OKE (Oracle Kubernetes Engine) Container platform
OCI API Gateway Strangler Fig routing
OCI Functions Rewrite as serverless
  • Forcing a rarely-changing legacy system into microservices — This only increases operational complexity with no business value. For systems that change rarely, stop at Rehost/Replatform.
  • Moving to a distributed system without observability — Without distributed tracing, log aggregation, and metric collection, root-causing failures becomes impossible.
  • Changing only the technology without organizational change — By Conway’s Law, systems follow organizational structure. If team boundaries aren’t aligned with service boundaries, modernization won’t stick.
  • Have you evaluated the business value and change frequency of the workload targeted for modernization?
  • Is a routing layer (API Gateway, etc.) ready to apply the Strangler Fig pattern?
  • Is an observability foundation (distributed tracing, log aggregation, metric collection) established?