AWS ECS Blue/Green CodePipeline:尝试读取图像工件时出现异常

GeK*_*eKo 1 amazon-ecs blue-green-deployment aws-code-deploy aws-codepipeline aws-codebuild

我想创建一个 CodePipeline,它从 CodeCommit 源构建一个容器映像,然后以蓝/绿方式将新映像部署到我的 ECS 服务(EC2 启动类型)。

  • 源阶段是 CodeCommit,它已经包含 appspec.json
    和 taskdef.json
  • 构建阶段正在构建新容器并将其成功推送到 ECR,文件 imagedefinition.json 是在此步骤创建的 BuildArtifact,包含容器和最近创建的镜像,其标签对应于 CodeCommit commit-id。
  • 部署阶段由操作“Amazon ECS(蓝/绿)”组成,使用 SourceArtifact 和 BuildArtifact 作为 InputArtifact,从 SourceArtifact 获取 appspec 和 taskdef,从 BuildArtifact 获取图像描述,最终在 Blue/ 中部署新容器绿色方式。

问题出在 BuildArtifact 的图像定义上。管道在部署阶段失败并出现错误:

"" 尝试从工件中读取图像工件文件时出现无效的操作配置异常:BuildArtifact。“”

如何正确配置“Amazon ECS(蓝/绿)”部署阶段,以便它可以使用最近创建的映像并部署它....通过替换 taskdef.json 中的占位符 IMAGE_NAME ?

任何提示高度赞赏:D

GeK*_*eKo 5

在这里回答我自己的问题,希望它可以帮助面临同样情况的其他人。

  1. 文件 imagedefinitions.json 不适合部署操作“Amazon ECS Blue/Green”。为此,您必须在构建步骤中创建文件imageDetail.json并将其作为工件提供给部署步骤。如何 ?这是我的 buildspec.yaml 底部的样子:
      - printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
artifacts:
  files: 
    - 'image*.json'
    - 'appspec.yaml'
    - 'taskdef.json'
  secondary-artifacts:
    DefinitionArtifact:
      files:
        - appspec.yaml
        - taskdef.json
    ImageArtifact:
      files:
        - imageDetail.json
Run Code Online (Sandbox Code Playgroud)
  1. 在 CodePipeline 的 Deploy 阶段,使用 DefinitionArtifact 和 ImageArtifact 作为 Input Artifacts,并在对应的“ Amazon ECS 任务定义”和“ AWS CodeDeploy AppSpec 文件”部分进行配置。

确保您的 appspec.yaml 包含任务定义的占位符。这是我的 appspec.yaml:

version: 0.0

Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "my-test-container"
          ContainerPort: 8000
Run Code Online (Sandbox Code Playgroud)

还要确保您的 taskdef.json 包含最终图像的占位符,例如

...
"image": <IMAGE1_NAME>,
...
Run Code Online (Sandbox Code Playgroud)
  1. 通过选择输入工件作为“ImageArtifact”和占位符,在“动态更新任务定义图像 - 可选”部分的蓝/绿部署阶段的代码管道配置中使用该占位符<IMAGE1_NAME>