易碎的ECS Fargate部署(需要一个AppSpec文件,但找不到)

我们遇到了一些令人沮丧的不稳定的CodeDeploy错误。在大约10%的部署中,出现以下错误:需要一个AppSpec文件,但在修订版中找不到该文件。

问题是,当我们从s3下载工件zip文件时,我们清楚地看到一个appspec.yaml文件。在部署之间以及在同一提交(使用“ Release change”按钮使用相同的提交)重新运行管道时,我们的构建脚本不会更改,而无需进行任何更改即可使用。

该错误消息没有帮助,而且看来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"
tingting04 回答:易碎的ECS Fargate部署(需要一个AppSpec文件,但找不到)

可能不再相关,但是看起来AppSpec文件的后缀(.yml)与buildspec文件(artifcats)的.yaml定义中所示不同。

本文链接:https://www.f2er.com/3062299.html

大家都在问