如何将部署在Heroku的Django Web应用迁移至AWS Elastic Beanstalk
从Heroku迁移Django应用到AWS Elastic Beanstalk完整步骤
注意:Elastic Beanstalk运行环境的本地存储是非持久化的,不要继续使用sqlite作为生产数据库,否则实例重启或替换后所有存在sqlite里的数据都会丢失,建议迁移到AWS RDS托管数据库。
一、迁移前准备工作
- 把Heroku上的现有项目代码完整拉到本地,确保本地可以正常运行:
git clone <你的heroku项目git地址> - 导出Heroku上的存量数据:可以直接在Heroku CLI执行
heroku run python manage.py dumpdata > data.json导出全量数据备份,也可以把远程sqlite文件拉到本地后执行python manage.py dumpdata > data.json - 整理项目依赖,把所有用到的包都写入requirements.txt,所有包最好固定版本号,额外添加
gunicorn依赖(Elastic Beanstalk运行Python WSGI应用的默认服务器) - 修改Django的settings.py配置:
- 把
DEBUG改为False,生产环境禁止开启调试 - 后续要用到的AWS域名、自定义域名都加到
ALLOWED_HOSTS列表 - 注释原有sqlite数据库配置,替换为适配AWS RDS的配置,数据库连接信息用环境变量占位,后续在Elastic Beanstalk控制台配置即可
- 新增静态文件配置
STATIC_ROOT = os.path.join(BASE_DIR, "static/"),适配Elastic Beanstalk的静态文件收集逻辑
- 把
二、安装配置AWS工具
- 本地安装AWS CLI,安装完成后执行
aws configure,按照提示配置你的AWS访问密钥、默认部署区域 - 安装Elastic Beanstalk CLI(eb cli),用于后续快速操作Elastic Beanstalk资源
三、初始化Elastic Beanstalk环境
- 进入本地Django项目根目录,执行
eb init,按照提示选择对应AWS区域、选择Python作为运行平台、输入应用名称,SSH访问配置按需选择即可 - 执行
eb create <自定义环境名称>创建运行环境,过程中如果需要配套RDS数据库,可以直接选择新建RDS实例,选择对应数据库类型、规格,设置数据库账号密码即可 - 等待环境创建完成,耗时大概5到10分钟,创建完成后执行
eb open可以打开默认应用页面,确认基础环境运行正常
四、部署应用&导入数据
- 把本地项目代码部署到刚创建的Elastic Beanstalk环境:执行
eb deploy - 部署完成后可以通过
eb ssh登录实例,或者直接用Elastic Beanstalk控制台的远程命令功能执行以下操作:- 执行数据库表结构迁移:
python manage.py migrate - 导入之前备份的存量数据:
python manage.py loaddata data.json - 收集静态资源:
python manage.py collectstatic
- 执行数据库表结构迁移:
- 访问应用地址,验证所有功能、数据展示都正常
五、收尾配置
- 把原有的自定义域名解析到Elastic Beanstalk的负载均衡地址
- 可以通过AWS Certificate Manager申请免费HTTPS证书,绑定到负载均衡上开启HTTPS访问
- 检查所有敏感配置(比如Django的SECRET_KEY、第三方服务密钥、数据库连接信息)都已经配置到Elastic Beanstalk的环境变量中,不要硬编码在项目代码里
- 全量测试功能无异常后,再销毁Heroku上的原有应用资源
内容的提问来源于stack exchange,提问作者Shreyash mishra
相关产品推荐
相关产品推荐

