如何在ElasticBeanstalk中自动扩容Django项目并解决扩容实例代码缺失问题
问题排查与解决方案
可能遗漏的配置项
- 实例配置文件(.ebextensions)缺失S3源码拉取逻辑:如果没有显式配置实例启动时的钩子指令,扩容启动的新实例默认只会执行EB内置的基础环境初始化,不会主动拉取之前上传到S3的source bundle代码
- IAM实例角色权限不足:EB关联的EC2实例角色(默认是aws-elasticbeanstalk-ec2-role)没有对应S3存储桶的
s3:GetObject权限,导致实例启动时请求源码被拒绝 - 应用版本关联配置错误:当前的EB环境没有绑定固定的应用版本,扩容时EC2找不到对应版本的源码包地址
- 启动模板/配置未关联当前部署配置:如果手动修改过EC2启动模板,没有把EB的源码部署步骤写入启动配置,新启动的实例只会加载基础AMI内容,不会部署应用
可行解决方法
- 补全IAM权限:给EB对应的EC2实例角色添加S3权限,权限范围限定为存放source bundle的S3桶即可,示例权限语句如下:
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::你的source bundle存储桶名/*" }
- 配置.ebextensions启动钩子:在Django项目根目录新建
.ebextensions/00_pull_source.config文件,写入实例启动时拉取S3源码并部署的指令,示例配置:
commands: 01_download_source: command: | aws s3 cp s3://你的桶名/对应应用版本的sourcebundle.zip /tmp/sourcebundle.zip unzip -o /tmp/sourcebundle.zip -d /opt/python/current/app/ chown -R wsgi:wsgi /opt/python/current/app/ test: test ! -f /opt/python/current/app/manage.py
- 重新绑定应用版本:进入EB控制台的「应用版本」页面,把当前运行正常的版本设置为环境的默认部署版本,确保扩容时实例能匹配到正确的源码包地址
- 重置EC2启动配置:不要手动修改EB自动生成的EC2启动模板,在EB控制台执行一次「重建环境」操作,让平台自动生成包含源码部署逻辑的启动配置
自定义AMI自动化方案
可以通过自定义AMI实现该流程的自动化,操作步骤如下:
- 先启动一个运行正常的单实例EB环境,确认应用代码、依赖、配置都符合预期
- 进入EC2控制台,给该运行中的实例创建自定义AMI,记录AMI ID
- 进入EB控制台的「配置」-「实例」页面,修改「自定义AMI ID」为刚才生成的AMI ID,保存配置
- 注意:每次更新应用代码后,都需要重新生成一次自定义AMI再更新EB配置,否则扩容的实例还是会运行旧版本的代码
- 该方案适合应用版本迭代频率低的场景,相比默认从S3拉取源码的方案,扩容启动速度会快30%~50%
内容的提问来源于stack exchange,提问作者NonStopuser
相关产品推荐
相关产品推荐

