部署的弹性云服务器不稳定(需要应用规格文件,但找不到)



我们有一些令人沮丧的 CodeDeploy 错误。在大约 10% 的部署中,我们收到以下错误:AppSpec 文件是必需的,但在修订版中找不到。

问题是,当我们从s3下载工件zip文件时,我们清楚地看到一个appspec.yaml文件。我们的构建脚本在部署之间不会更改,当我们在同一提交(使用"发布更改"按钮(上重新运行管道时,无需更改任何内容,它就可以工作。

错误消息没有帮助,似乎 CodeDeploy 不是 100% 可靠的。

我们使用 ECS Fargate 使用蓝/绿部署。

我们的buildspec.yml文件如下所示:

version: 0.2
env:
  parameter-store:
    BUILD_ENV: key-foo-site-node-env
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-6)
      - ACCOUNT_ID=$(aws sts get-caller-identity --output text --query 'Account')
      - REPOSITORY_URI="$ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/foo-site"
      - echo Saving source version into version.txt...
      - echo $IMAGE_TAG >> version.txt
  build:
    commands:
      - echo Build started on `date`
      - echo Building the app Docker image...
      - docker build -t $REPOSITORY_URI/app:$IMAGE_TAG .
      - echo Building the nginx Docker image...
      - docker build -t $REPOSITORY_URI/nginx:$IMAGE_TAG docker/nginx
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI/app:$IMAGE_TAG
      - docker push $REPOSITORY_URI/nginx:$IMAGE_TAG
      # Create a valid json file that will be used to create a new task definition version
      # Using sed we need to replace $APP_IMAGE and $NGINX_IMAGE by image urls
      - echo Creating a task definition json
      - sed "s+$APP_IMAGE+$REPOSITORY_URI/app:$IMAGE_TAG+g; s+$NGINX_IMAGE+$REPOSITORY_URI/nginx:$IMAGE_TAG+g;" taskdef.$BUILD_ENV.json > register-task-definition.json
      # Using the aws cli we register a new task definition
      # We need to new task definition arn to create a valid appspec.yaml
      # If you need debugging, the next line is useful
      # - aws --debug ecs register-task-definition --cli-input-json "$(cat register-task-definition.json)" > task-definition.json
      - echo Creating an appspec.yaml file
      - TASK_DEFINITION_ARN=`aws ecs register-task-definition --cli-input-json "$(cat register-task-definition.json)" --query 'taskDefinition.taskDefinitionArn' --output text`
      - sed "s+$TASK_DEFINITION_ARN+$TASK_DEFINITION_ARN+g" appspec.yml > appspec.yaml
artifacts:
  files:
    - appspec.yaml
    - register-task-definition.json
    - task-definition.json

我们的appspec.yml文件如下所示:

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "$TASK_DEFINITION_ARN"
        LoadBalancerInfo:
          ContainerName: "nginx"
          ContainerPort: "80"

可能不再相关,但看起来您的AppSpec文件的后缀(.yml(与构建规范文件(.yaml(的artifcats定义中指示的后缀((不同。

最新更新