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

如何将AWS CodeDeploy AppSpec变量传递至Shell脚本?

问题分析

你遇到的核心问题是:在build-and-push-image任务中修改了本地appspec.yml的占位符,但deploy-to-ec2任务通过--github-location让CodeDeploy直接从GitHub拉取原始代码,导致替换后的appspec.yml未被使用。CodeDeploy拿到的是仓库里未修改的appspec.yml,占位符<PLACEHOLDER_FOR_COMMIT_SHA>没有被替换成实际的GitHub SHA,因此传递给脚本的IMAGE_TAG变量为空。

解决方案

以下两种方法可以解决这个问题:

方法一:在Deploy任务中重新替换占位符并使用本地部署包

修改deploy-to-ec2任务,放弃从GitHub拉取代码,改为本地打包修改后的代码并上传到S3,让CodeDeploy从S3获取部署包:

deploy-to-ec2:
  name: Deploy to EC2
  needs: build-and-push-image
  runs-on: ubuntu-latest

  steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-southeast-2

    - name: Replace placeholder in AppSpec file
      run: |
        sed -i "s|<PLACEHOLDER_FOR_COMMIT_SHA>|${{ github.sha }}|" appspec.yml

    - name: Create deployment package
      run: zip -r deploy-package.zip . -x ".git/*" ".github/*"

    - name: Upload deployment package to S3
      run: |
        aws s3 cp deploy-package.zip s3://your-deployment-bucket/deploy-package-${{ github.sha }}.zip

    - name: Deploy to EC2 using AWS CodeDeploy
      run: |
        aws deploy create-deployment \
          --application-name cicd \
          --deployment-group-name cicdtest \
          --deployment-config-name CodeDeployDefault.OneAtATime \
          --description "Deploying Docker image to EC2" \
          --s3-location bucket=your-deployment-bucket,key=deploy-package-${{ github.sha }}.zip,bundleType=zip
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

注意:需要提前创建S3存储桶(替换your-deployment-bucket为实际桶名),并确保CodeDeploy服务角色拥有该桶的访问权限。

方法二:通过Artifact传递修改后的代码

在build-and-push-image任务中上传修改后的代码作为Artifact,再在deploy-to-ec2任务中下载使用:

  1. 修改build-and-push-image任务,添加上传Artifact步骤:
- name: Upload deployment artifact
  uses: actions/upload-artifact@v3
  with:
    name: deploy-artifact
    path: .
  1. 修改deploy-to-ec2任务,跳过代码拉取,直接下载Artifact:
deploy-to-ec2:
  name: Deploy to EC2
  needs: build-and-push-image
  runs-on: ubuntu-latest

  steps:
    - name: Download deployment artifact
      uses: actions/download-artifact@v3
      with:
        name: deploy-artifact

    - name: Set up AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-southeast-2

    - name: Create deployment package
      run: zip -r deploy-package.zip . -x ".git/*" ".github/*"

    - name: Upload deployment package to S3
      run: |
        aws s3 cp deploy-package.zip s3://your-deployment-bucket/deploy-package-${{ github.sha }}.zip

    - name: Deploy to EC2 using AWS CodeDeploy
      run: |
        aws deploy create-deployment \
          --application-name cicd \
          --deployment-group-name cicdtest \
          --deployment-config-name CodeDeployDefault.OneAtATime \
          --description "Deploying Docker image to EC2" \
          --s3-location bucket=your-deployment-bucket,key=deploy-package-${{ github.sha }}.zip,bundleType=zip
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
额外优化

你的download_docker_image.sh脚本中,IMAGE_TAG=$IMAGE_TAG属于冗余代码,直接使用$IMAGE_TAG即可,CodeDeploy会自动将环境变量注入到脚本的运行环境中。

内容的提问来源于stack exchange,提问作者Junyao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:27