A big bang cutover is a plan with exactly one attempt in it. The incremental version costs a little more elapsed time and keeps a working rollback available until the very last step. This walks through the inventory that decides whether the cutover is clean, continuous replication that runs while the old server keeps serving, a dress rehearsal you can repeat, the DNS time to live arithmetic you have to do backwards from the cutover date, and the single action that ends the rollback window for good.
A big bang cutover is a plan with exactly one attempt in it. You stop the old server, move everything, start the new one, and if something nobody thought of breaks at 2am you are debugging with no traffic served and no way back except a restore. The incremental version costs a little more elapsed time and gives you a rollback that stays available until the very last step.
Inventory the box, not the plan
Before any tooling, write down what the server actually does, because a good half of what makes a cutover fail is not the application.
- Every listening port and what talks to it.
- Every outbound destination, including the ones that only fire monthly.
- Every cron job, systemd timer and at job.
- Every certificate on the box and when it expires.
- Every DNS record anywhere that points at this server, including records in zones you do not control.
- Every hard-coded IP address anyone has ever put in a firewall on the other side.
The last two are what turn a clean cutover into a week of follow-up. A partner allowlist holding your old address does not fail at cutover, it fails quietly on their next batch run.
# listening sockets with the owning process
ss -tulpn
# scheduled work, per user
systemctl list-timers --all
for u in $(cut -d: -f1 /etc/passwd); do crontab -l -u "$u" 2>/dev/null; done
# certificates and their expiry dates
find /etc -name '*.pem' -o -name '*.crt' 2>/dev/null | \
xargs -r -I{} sh -c 'echo "{}"; openssl x509 -enddate -noout -in "{}" 2>/dev/null'
Replication runs while the server keeps working
For lifting a whole server, the AWS tool is Application Migration Service, now presented as AWS Transform MGN. It performs continuous block-level replication of your source servers and converts them for launch on AWS, and it covers physical, virtual and cloud servers across Windows Server and various Linux distributions. The source keeps serving traffic throughout. Nothing about the replication needs downtime, and AWS describes the cutover window itself as typically minutes.
Settings come from three configurable templates, for replication, launch and post-launch. They are applied to each newly added server and can be overridden per server at any time. Beyond a handful of machines, group servers into applications and applications into waves so that launch, cutover and archival can be done in bulk.
aws mgn describe-source-servers \
--query 'items[].{id:sourceServerID,host:sourceProperties.identificationHints.hostname,state:lifeCycle.state}' \
--output table
The dress rehearsal
The test launch is what makes this approach safe, and it helps to know exactly what it does not disturb.
Launching a test instance leaves replication running. After the test, data replication continues as before, and the new and modified data on the source server is transferred to the staging area subnet rather than to the test instance you launched. You can test as many times as you want. Each new test first deletes any previously launched test instance and its dependent resources, then launches a fresh one reflecting the most up-to-date state of the source. AWS recommends performing a test at least two weeks before you plan to migrate, which is realistic, because that is roughly how long it takes for the second and third problems to surface.
aws mgn start-test --source-server-ids s-0123456789abcdef0
Then connect to the launched instance over SSH or RDP and actually exercise it. Validate connectivity and run your acceptance tests against it. When you are done you either revert the test, which returns the server to the Ready for testing lifecycle state, or mark it as ready for cutover, which moves it to Ready for cutover. Both offer to terminate the launched test instances, and you should take that option.
DNS is the part you cannot rush
Lower the TTL on every record pointing at the server days before the cutover, not on the day. Route 53's own guidance for a domain or subdomain that is already in use is to specify a shorter value first, such as 300 seconds, and increase the value again after you have confirmed the new settings are correct.
Lowering a TTL does not take effect immediately. A resolver that already cached the record under the old TTL keeps it until that expires, so if the record sat at a day, the change only becomes reliable a day later. Do the arithmetic backwards from the cutover date.
# what a resolver is handing out right now, TTL included
dig +noall +answer app.example.com
# what the authoritative nameserver says
dig +noall +answer @ns-1.example.net app.example.com
After you flip the record, watch traffic on the old server. The tail of clients still arriving is the honest measure of whether the TTL plan worked.
Cutover, and the point of no return
Launching a cutover instance moves the server to Cutover in progress. As with a test, MGN first deletes any previously launched test instance, then launches a cutover instance reflecting the most up-to-date state of the source. Crucially, after the cutover data replication continues as before, and new and modified data on the source is still transferred to the staging area subnet rather than to the cutover instance.
That is your rollback window. The source server is still running, still replicating, and DNS is the only thing pointing at AWS. If the new instance misbehaves you point the record back and lose nothing.
The point of no return is a separate, deliberate action. Finalizing the cutover changes the state to Cutover complete, stops data replication, causes all replicated data to be discarded, and terminates all AWS resources used for data replication. Do not finalize on cutover night. Finalize once the new server has been through a full business cycle, including the monthly jobs that only exist in the inventory you wrote at the start.
aws mgn start-cutover --source-server-ids s-0123456789abcdef0
# destructive: stops replication and discards all replicated data
aws mgn finalize-cutover --source-server-id s-0123456789abcdef0
Databases move differently
Block-level replication of a running database gives you a crash-consistent copy, which is not the same thing as a database you would choose to serve from. For the data itself, use AWS Database Migration Service with a task that migrates existing data and replicates ongoing changes, the option called full-load-and-cdc in the API. It loads what is there, then applies the changes captured during the load as units of single committed transactions, so the target keeps catching up while the source stays live. The switch becomes a short pause on writes rather than an export and an import.
Run a premigration assessment before you start the task, since it warns you about potential migration issues before the migration runs rather than halfway through it.
Everything above is the shape of a low-risk move, and the details that decide whether it is low-risk in your case are the ones in your inventory. If you would rather not carry that alone, this is what our migration services do, with the target design settled first in architecture and planning.
Frequently asked questions
What should I check on a server before migrating it to AWS?
Inventory what the server actually does, because a good half of what makes a cutover fail is outside the application. List every listening port and its clients, every outbound destination including monthly ones, every cron job, systemd timer and at job, every certificate and its expiry, every DNS record pointing at the server, and every hard-coded IP in someone else's firewall. Useful starting commands are ss -tulpn and systemctl list-timers --all. A partner allowlist holding the old address fails quietly on their next batch run.
Does AWS Application Migration Service need downtime to replicate a server?
No. AWS Application Migration Service, now presented as AWS Transform MGN, performs continuous block-level replication while the source server keeps serving traffic, and AWS describes the cutover window itself as typically minutes. MGN covers physical, virtual and cloud servers across Windows Server and various Linux distributions, and converts them for launch on AWS.
How do test launches work in AWS Application Migration Service?
Running aws mgn start-test --source-server-ids s-0123456789abcdef0 launches a test instance while replication keeps running, with new source data still going to the staging area subnet. Tests can be repeated as often as needed, and each one first deletes the previous test instance before launching a fresh copy of the latest source state. AWS recommends testing at least two weeks before the planned migration. Afterwards, revert to Ready for testing or mark the server Ready for cutover, terminating the test instances either way.
When should I lower DNS TTL before a server migration?
Lower it days before the cutover, never on the day. Resolvers that cached a record under the old TTL keep it until that expires, so a record that sat at a day only becomes reliable a day after the change. Route 53 guidance for a record already in use is to set a shorter value first, such as 300 seconds, and raise it again once the new settings are confirmed. Check what resolvers hand out with dig +noall +answer app.example.com.
Can I roll back after an AWS MGN cutover?
Yes, until the cutover is finalized. After aws mgn start-cutover launches the cutover instance, data replication continues as before, the source server keeps running, and DNS is the only thing pointing at AWS. If the new instance misbehaves, pointing the record back loses nothing. Watching the tail of clients still arriving at the old server shows whether the TTL plan worked.
What does aws mgn finalize-cutover do and when should I run it?
Finalizing the cutover changes the server state to Cutover complete, stops data replication, discards all replicated data and terminates the AWS resources used for replication, which ends the rollback window for good. Avoid running aws mgn finalize-cutover --source-server-id s-0123456789abcdef0 on cutover night. Wait until the new server has been through a full business cycle, including the monthly jobs recorded in the original inventory.
How should a database be migrated when moving a server to AWS?
Use AWS Database Migration Service with a full-load-and-cdc task, which loads the existing data and then applies the changes captured during the load as single committed transactions while the source stays live. Block-level replication of a running database only gives a crash-consistent copy. With DMS the switch becomes a short pause on writes, and a premigration assessment run first warns about potential issues before the migration starts.
How does AWS Application Migration Service handle many servers at once?
MGN applies settings from three configurable templates, for replication, launch and post-launch, to each newly added server, and any server can override them at any time. Beyond a handful of machines, group servers into applications and applications into waves so that launch, cutover and archival can be done in bulk. Running aws mgn describe-source-servers lists the source servers along with their lifecycle state.
Read how we handle it in Migration Services.
Related Articles
How to Give Applications AWS Credentials Without Storing Any
Every long-lived access key in your account is a copy waiting to leak, and no amount of rotation discipline fixes that. The alternative is to have no key at all, because each place an application normally needs credentials already has a mechanism that hands it fresh ones on demand. This walks through instance profiles on EC2, task roles on ECS, EKS Pod Identity and IRSA on Kubernetes, and OIDC federation for a CI pipeline, with the trust policy shape for each. It also covers the one condition in the CI trust policy that decides whether the whole thing is secure or theatre.
Server & DevOpsServer Hardening Checklist for Ubuntu 24.04 - The Complete Guide
A comprehensive server hardening checklist for Ubuntu 24.04, covering SSH configuration, firewall setup, fail2ban, unattended upgrades, CIS benchmarks, audit logging, and kernel hardening.
Server & DevOpsThe GitHub to GitLab Migration Nobody Warns You About
GitLab imports your repositories, reviews and history almost completely. It imports none of your GitHub Actions. What moves, what you rewrite, and when.