Migrating a legacy government portfolio to Azure without making the work feel fragile.
Alaska education systems depend on a constellation of long-lived .NET applications. The migration work is part cloud platform, part application modernization, and part operational discipline.
§ 01Where it started
The portfolio includes legacy .NET applications, deployment scripts, databases, and operational knowledge accumulated over years of state education work. The directive was straightforward: modernize the stack, move infrastructure to Azure, and keep critical services reliable for the people who depend on them.
Treating the work as a single lift-and-shift would have created a brittle cloud copy of the same operational problems. The better approach was to build repeatable migration patterns, then apply those patterns system by system.
Migration projects succeed when the platform work becomes boring enough for the next system to follow the same playbook.
§ 02The approach
- Modernize each application toward .NET 8 and current ASP.NET Core conventions.
- Express infrastructure as reusable Terraform modules with environment-specific configuration.
- Wire CI/CD through Azure DevOps with controlled promotion and repeatable deployments.
- Use staged cutovers, monitoring, and rollback paths so service owners keep confidence.
§ 03What changed
Applications, repositories, pipelines, and databases moving from on-premise infrastructure.
Legacy .NET Framework applications lifted into current ASP.NET Core patterns.
Terraform-managed Azure resources, deployment automation, and repeatable environments.
The durable outcome is not just cloud hosting. It is a platform baseline: secrets management, infrastructure as code, deployment automation, observability, and accessibility practices that new and migrated systems can inherit.
§ 04What I would repeat
The most useful work is the documentation and automation that turns one successful migration into the next team member's repeatable path. Each decision that becomes a module, pipeline template, or checklist reduces the amount of institutional memory needed for the next application.