最近刚带团队完成了一次从本地机房到AWS的云迁移,整个过程没有花钱买商业迁移工具,核心全靠十几段Python脚本加上AWS CLI硬啃下来。不少朋友在群里问我要方案,今天干脆整理成一篇实战记录,把设计思路、脚本细节和踩过的坑都摊开来讲清楚。
如果你正准备把自己的应用、文件或数据库迁到AWS,又不想被手工上传下载折磨到半夜,这篇文章应该能帮你省下大量时间。你不用是AWS专家,只要会一点Python基础语法,能把boto3装起来,就能跟着这篇文章走一遍完整的自动化迁移流程。
1. 迁移方案设计:先想清楚再动手
1.1 为什么选Python而不是纯命令或商业工具
很多人问,迁移这种事用aws s3 sync不就完了吗,为什么还要写Python?没错,简单场景下aws命令行确实够用,但真实迁移项目一旦超过几十个实例、上百GB文件、多个数据库,纯命令行的短板就暴露了:没法做复杂的重试逻辑,没法实现自定义的依赖顺序,更没法把流程串起来做统一的进度追踪。
选择Python,主要是因为它的生态和灵活性。boto3是AWS官方SDK,Python环境下调用S3、EC2、RDS、IAM这些服务的API非常顺手,写出来的自动化脚本可读性和可维护性都比Shell脚本高一个档次。对于团队里有研发背景的运维来说,这套方案几乎是零学习成本。
另外,迁移不是一次性动作,后面还有增量同步、定期备份、数据校验。用代码把流程固化下来,等于给整个迁移上了保险,随时可以重放、可以审计、可以改进。这一点是手动操作和简单命令无法替代的。
1.2 迁移对象盘点:搞清楚你手里有什么
动手之前最重要的一件事,是把迁移对象分门别类。我的习惯是按数据特征来分:
- 静态文件与对象存储:比如图片、附件、日志归档、静态网页资源,这类数据对一致性要求不高,但对传输速度和完整性校验有要求。
- 数据库数据:MySQL、PostgreSQL这类关系型数据库,迁移时需要考虑一致性、字符集、账号权限等问题。
- 服务器镜像与配置:云主机、虚拟机镜像,以及Nginx、Tomcat、定时任务等配置文件。服务器迁移最怕漏配置,脚本化可以保证每一步都执行到位。
- 中间件状态与依赖组件:Redis缓存、消息队列里的积压数据等,部分可以重建,部分需要导出。
把盘点结果记在一张表格里,每类数据对应一套迁移方案。有些可以全量迁移后再增量同步,有些必须先停机再迁,这些会在后面的章节具体展开。
1.3 迁移流程的四个阶段
整个自动化迁移,我把它拆成四个阶段:盘点、备份、搬运、校验。
- 盘点:统计数据量、文件数、实例规格、依赖关系,输出一份迁移清单。
- 备份:迁移前必须做完整备份,这是所有云迁移的底线,别指望“应该没问题”这种话。
- 搬运:写脚本把数据传到AWS,考虑并发、断点续传、失败重试。
- 校验:对比源端和目的端的文件数量、大小、哈希,数据库做行数统计和抽样查询。
四个阶段不是串行执行,很多时候是循环的。比如S3增量同步阶段,先跑全量,再定期跑增量,等到正式切换前做最终一致性校验,然后才把流量切过去。这个过程脚本化之后,执行起来非常踏实。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:Python、AWS CLI和IAM权限一个都不能少
2.1 Python运行环境准备
这一步最简单,但对新手来说也是最容易卡住的。通常Linux服务器自带Python 3,Windows机器如果没有,需要去官网下载安装包,记得勾选Add Python to PATH。装完在终端确认一下:
bash复制python3 --version
pip3 --version
我更推荐用虚拟环境来隔离依赖,尤其是迁移脚本所在的服务器可能还会跑其他业务。创建虚拟环境:
bash复制python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
然后安装本次迁移需要的基础依赖:
bash复制pip install boto3 awscli
boto3负责在Python脚本里调用AWS API,awscli提供命令行工具,两个都很轻量,装完基本不会冲突。如果服务器在国内,pip源建议换成国内镜像,否则下载速度会很折磨人。
2.2 AWS CLI与boto3的初始化配置
安装完成后,先配置AWS凭证。AWS CLI支持通过aws configure命令交互式输入Access Key、Secret Key、region和输出格式:
bash复制aws configure
如果团队里有多套环境,建议用命名配置文件,避免把生产环境的Key和本地测试环境混在一起:
bash复制aws configure --profile migration
在Python脚本里指定使用哪个配置:
python复制import boto3
session = boto3.Session(profile_name="migration")
s3_client = session.client("s3")
这段代码的意思是:创建一个名为migration的会话对象,然后在会话基础上创建S3客户端。后续所有脚本都复用这行逻辑,不管
