Elastic Beanstalk配合GitHub Action部署失败:无法从staging迁移文件至current目录
Elastic Beanstalk 部署失败问题及解决方案
问题描述
我尝试通过GitHub Action部署项目,GitHub Action本身运行正常,成功将源码包上传到S3并更新EB环境,EB已顺利将S3中的源码包拉取到staging目录。
通过关联EC2查看日志确认:
- EC2已成功下载源码包、完成解压,且执行
pip install -r requirements.txt完成依赖安装 /var/app/staging/路径下存在完整的解压后源码文件
但EB环境更新持续失败,已尝试以下排查方案均无效:
- 终止EB关联的EC2和配套Classic ELB负载均衡器后重新创建,环境更新依然失败
- 修改源码包名称(源码包名称本身随git commit sha动态变化)
- 重新创建应用、环境后再重新部署,仍然失败
详细信息
系统为Amazon Linux 2,应用已成功同步至/var/app/staging目录,但无法迁移到/var/app/current目录。需要确认哪个Elastic Beanstalk引擎脚本负责将/var/app/staging的内容拷贝到/var/app/current,或是负责该步骤的校验工作。
ElasticBeanstalk环境配置:64位Amazon Linux 2/3.3.6平台运行Python 3.7
用到的GitHub Action配置文件 .github/workflow/main.yml
name: PlayplzAction-deploy on: push: branches: [ playplz/backend ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Create ZIP deployment package run: zip -r deploy_package.zip ./ - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEYID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} - name: Create env file run: | touch .env echo SECRET_KEY="${{ secrets.SECRET_KEY }}" >> .env echo VIMEO_SECRET_KEY = "${{ secrets.VIMEO_SECRET_KEY }}" >> .env echo DEBUG = "${{ secrets.DEBUG }}" >> .env echo DB_NAME= "${{ secrets.DB_NAME }}">> .env echo DB_USER= "${{ secrets.DB_USER }}">> .env echo DB_PASSWORD= "${{ secrets.DB_PASSWORD }}">> .env echo DB_HOST= "${{ secrets.DB_HOST }}">> .env echo DB_PORT= "${{ secrets.DB_PORT }}">> .env echo AWS_ACCESS_KEYID= "${{ secrets.AWS_ACCESS_KEYID }}">> .env echo AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .env echo AWS_STORAGE_BUCKET_NAME="${{ secrets.AWS_STORAGE_BUCKET_NAME }}" >> .env echo AWS_REGION= "${{ secrets.AWS_REGION}}">> .env cat .env - name: Upload package to S3 bucket run: aws s3 cp deploy_package.zip s3://playplz/gitaction/deploy-${{ github.sha }}.zip - name: Create new ElasticBeanstalk Application Version run: | aws elasticbeanstalk create-application-version \ --application-name classic_DRF \ --source-bundle S3Bucket="playplz",S3Key="gitaction/deploy-${{ github.sha }}.zip" \ --version-label "ver-${{ github.sha }}" \ --description "commit-sha-${{ github.sha }}" - name: Deploy new ElasticBeanstalk Application Version run: aws elasticbeanstalk update-environment --environment-name Classicdrf-env --version-label "ver-${{ github.sha }}"
日志截图
- EB EC2实例
/var/log/目录日志
- EB EC2实例
/var/log/eb-engine.log日志

解决方案
1. 负责staging到目录迁移的EB引擎脚本
Amazon Linux 2的Python EB环境中,/opt/elasticbeanstalk/hooks/appdeploy/enact/00_flip.sh负责该迁移流程:依赖安装、配置校验完成后,该脚本会删除旧的/var/app/current目录,将/var/app/staging重命名为/var/app/current,随后重启应用服务。如果前置校验不通过,该脚本不会执行。
2. 部署失败的核心原因
- 步骤顺序错误:你先执行打包步骤,后生成.env文件,生成的.env配置没有被包含到部署包中,EB启动应用时读取不到配置,校验失败中断部署流程。
- 打包规则错误:当前打包命令会把
.git目录、GitHub Action运行环境的冗余文件全部打进包,且如果你的项目入口文件不在仓库根目录,EB解压后无法识别到启动入口,直接触发校验失败。
3. 修复代码
调整步骤顺序,优化打包规则:
steps: - uses: actions/checkout@v2 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEYID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} # 先生成.env文件再打包 - name: Create env file run: | touch .env echo SECRET_KEY="${{ secrets.SECRET_KEY }}" >> .env echo VIMEO_SECRET_KEY="${{ secrets.VIMEO_SECRET_KEY }}" >> .env echo DEBUG="${{ secrets.DEBUG }}" >> .env echo DB_NAME="${{ secrets.DB_NAME }}">> .env echo DB_USER="${{ secrets.DB_USER }}">> .env echo DB_PASSWORD="${{ secrets.DB_PASSWORD }}">> .env echo DB_HOST="${{ secrets.DB_HOST }}">> .env echo DB_PORT="${{ secrets.DB_PORT }}">> .env echo AWS_ACCESS_KEYID="${{ secrets.AWS_ACCESS_KEYID }}">> .env echo AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .env echo AWS_STORAGE_BUCKET_NAME="${{ secrets.AWS_STORAGE_BUCKET_NAME }}" >> .env echo AWS_REGION="${{ secrets.AWS_REGION}}">> .env cat .env # 优化打包命令,排除冗余文件 - name: Create ZIP deployment package run: | zip -r deploy_package.zip . \ -x '*.git*' \ -x '.github/*' \ -x '*.pyc' \ -x '__pycache__/*' # 后续上传、部署步骤不变 - name: Upload package to S3 bucket run: aws s3 cp deploy_package.zip s3://playplz/gitaction/deploy-${{ github.sha }}.zip # 其余原有步骤保持不变即可
如果你的应用入口文件存放在仓库的子目录中,需要调整打包路径,将子目录下的所有内容打包到压缩包根路径。
内容的提问来源于stack exchange,提问作者Sanghak
相关产品推荐
相关产品推荐

