AWS CodeDeploy运行过时的appspec文件?Django项目CI配置疑问
解决CircleCI 2.0 + AWS CodeDeploy部署Django项目的常见问题
作为经常处理Django+AWS部署的开发者,我太懂你作为新手在配置这套流程时的纠结了——尤其是复制了别人的配置但因为细微差异卡壳的情况。结合你的场景,我整理了几个最可能遇到的坑和对应的解决方案,都是基于类似DRF/Django项目的实战经验:
一、先把CircleCI的构建+上传流程跑通
如果你的CircleCI还没完成构建并把包传到S3,先确认这几个核心步骤:
- 依赖安装与测试:确保
config.yml里正确配置了虚拟环境和依赖安装,别漏了测试环节(可选但推荐):version: 2.1 jobs: build-deploy: docker: - image: circleci/python:3.9 steps: - checkout - run: name: 初始化虚拟环境 command: python -m venv venv - run: name: 安装项目依赖 command: | . venv/bin/activate pip install --upgrade pip pip install -r requirements.txt - run: name: 运行单元测试 command: | . venv/bin/activate python manage.py test - 打包并上传到S3:构建完成后,要把代码打包成CodeDeploy识别的zip包(排除虚拟环境、git目录这些冗余内容),再上传到指定S3桶:
注意:要给CircleCI的IAM用户配置- run: name: 打包部署文件 command: zip -r deploy-package.zip . -x "venv/*" ".git/*" ".circleci/*" - run: name: 上传到S3存储桶 command: | aws s3 cp deploy-package.zip s3://your-deploy-bucket/$(date +%Y%m%d%H%M%S)-deploy.zipS3PutObject权限,并且在CircleCI项目的环境变量里设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,这样才能正常访问S3。
二、针对appspec.yml的差异调整(你最可能遇到的问题)
你提到复制了别人的appspec但有区别,下面几个点是最需要根据自己项目修改的:
- 部署路径适配:如果你的项目在EC2上的目标目录和原作者不一样,一定要修改
files部分的destination:version: 0.0 os: linux files: - source: / destination: /home/ubuntu/my-django-project # 改成你的EC2实际部署路径 - 虚拟环境与脚本路径:如果你的EC2上虚拟环境的位置不同,要在钩子脚本里调整激活命令。比如
after_install.sh:
对应的appspec里要确保脚本路径正确,并且#!/bin/bash cd /home/ubuntu/my-django-project # 改成你自己的虚拟环境路径 source venv/bin/activate pip install -r requirements.txtrunas是你的EC2实例用户名(比如ubuntu):hooks: AfterInstall: - location: scripts/after_install.sh timeout: 300 runas: ubuntu - 静态文件与数据库迁移:如果你的项目需要收集静态文件、执行数据库迁移,一定要在
ApplicationStart钩子添加这些步骤:ApplicationStart: - location: scripts/application_start.sh timeout: 300 runas: ubuntuapplication_start.sh示例:#!/bin/bash cd /home/ubuntu/my-django-project source venv/bin/activate # 收集静态文件到指定目录(如果用S3存储的话要提前配置好django-storages) python manage.py collectstatic --noinput # 执行数据库迁移 python manage.py migrate --noinput # 重启WSGI服务器(这里假设用gunicorn,根据你的实际服务调整) sudo systemctl restart gunicorn - 权限修正:如果你的EC2实例用户和原作者不同(比如原作者用ec2-user,你用ubuntu),所有钩子的
runas都要改成你的实例用户名,否则会因为权限不足执行失败。
三、部署失败的快速排查技巧
如果部署出问题,别慌,按这几步查:
- 看CodeDeploy日志:登录EC2实例,查看
/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log,里面会有详细的错误信息,比如脚本执行失败、文件路径不存在等。 - 检查IAM权限:确保CodeDeploy的服务角色有访问EC2的权限,EC2实例的IAM角色也附加了
AWSCodeDeployRole策略,不然CodeDeploy连实例都连不上。 - 安全组验证:CircleCI需要能访问S3(出站允许HTTPS),EC2实例要允许CodeDeploy服务的入站访问(可以放通AWS CodeDeploy的服务IP段,或者允许所有HTTPS入站)。
内容的提问来源于stack exchange,提问作者Adolfo Esparza
相关产品推荐
相关产品推荐

