You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }}"

日志截图

  1. EB EC2实例/var/log/目录日志
    日志截图
  2. EB EC2实例/var/log/eb-engine.log日志
    eb-engine日志截图
    日志截图

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:27:03