Amazon ecs AWS ECS蓝色/绿色代码管道:尝试读取图像瑕疵时发生异常

Amazon ecs AWS ECS蓝色/绿色代码管道:尝试读取图像瑕疵时发生异常,amazon-ecs,aws-code-deploy,aws-codepipeline,aws-codebuild,blue-green-deployment,Amazon Ecs,Aws Code Deploy,Aws Codepipeline,Aws Codebuild,Blue Green Deployment,我想创建一个CodePipeline,它从CodeCommit源代码构建一个容器映像,然后以蓝色/绿色的方式将新映像部署到我的ECS服务(EC2 launchtype) 源阶段是CodeCommit,它已经包含appspec.json 以及taskdef.json 构建阶段是构建新的 容器&成功将其推送到ECR,文件 imagedefinition.json是在此步骤中创建的BuildArtifact, 包含容器和最近创建的图像及其 与CodeCommit commit-id相对应的标记 部署

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

  • 源阶段是CodeCommit,它已经包含appspec.json
    以及taskdef.json
  • 构建阶段是构建新的 容器&成功将其推送到ECR,文件 imagedefinition.json是在此步骤中创建的BuildArtifact, 包含容器和最近创建的图像及其 与CodeCommit commit-id相对应的标记
  • 部署阶段 由使用 SourceArtifact和BuildArtifact作为InputArtifacts,以 源工件和图像中的appspec和taskdef 来自BuildArtifact的描述,以最终部署新的 蓝色/绿色方式的容器
问题在于BuildArtifact的图像定义。管道在部署阶段失败,错误为:

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

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

任何高度赞赏的提示:D

Amazon ECS蓝/绿(或CodeDeployToECS)代码管道操作需要TaskDefinitionTemplateArtifact参数(请参见[1])

除上述文件外,请注意,ECS蓝色/绿色部署(不是“imagedefinition.json”)需要imageDetail.json。此处提供了文件结构和详细信息[2]。将此文件添加到部署工件/版本控制的根目录中。如果您不想手动添加此文件,可以使用ECR源操作将其添加到代码管道,并使用您在ECS服务/taskdef.json中使用的映像配置此文件。为了清楚起见,这些都在[2]中讨论过

要了解这一切是如何结合在一起的,您还可以按照此处有关ECS蓝/绿部署的分步说明进行操作[3]

参考资料:

[1] :CodePipeline管道结构参考-CodePipeline中的动作结构要求 [2] :Image Definitions File Reference-用于Amazon ECS蓝色/绿色部署操作的imageDetail.json文件 [3] :教程:使用Amazon ECR源和ECS到CodeDeploy部署创建管道

Amazon ECS蓝/绿(或CodeDeployToECS)CodePipeline操作需要TaskDefinitionTemplateArtifact参数(请参见[1])

除上述文件外,请注意,ECS蓝色/绿色部署(不是“imagedefinition.json”)需要imageDetail.json。此处提供了文件结构和详细信息[2]。将此文件添加到部署工件/版本控制的根目录中。如果您不想手动添加此文件,可以使用ECR源操作将其添加到代码管道,并使用您在ECS服务/taskdef.json中使用的映像配置此文件。为了清楚起见,这些都在[2]中讨论过

要了解这一切是如何结合在一起的,您还可以按照此处有关ECS蓝/绿部署的分步说明进行操作[3]

参考资料:

[1] :CodePipeline管道结构参考-CodePipeline中的动作结构要求 [2] :Image Definitions File Reference-用于Amazon ECS蓝色/绿色部署操作的imageDetail.json文件
[3] :教程:使用Amazon ECR源和ECS创建一个管道,以进行CodeDeploy部署

回答我自己的问题,希望它能帮助其他面临同样情况的人

  • imagedefinitions.json文件不适用于部署操作“Amazon ECS蓝色/绿色”。为此,您必须在构建步骤中创建文件imageDetail.json,并将其作为工件提供给部署步骤。怎样?以下是buildspec.yaml的底部外观:
  • 在CodePipeline的部署阶段,使用DefinitionArtifact和ImageArtifact作为输入工件,并在相应的部分“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
    
    版本:0.0
    资源:
    -目标服务:
    类型:AWS::ECS::服务
    特性:
    任务定义:
    LoadBalancer信息:
    ContainerName:“我的测试容器”
    集装箱港口:8000
    
    还要确保taskdef.json包含最终图像的占位符,如

    ...
    "image": <IMAGE1_NAME>,
    ...
    
    。。。
    “图像”:,
    ...
    
  • 在“动态更新任务定义映像-可选”部分的蓝/绿部署阶段的代码管道配置中使用该占位符,方法是选择输入工件作为“ImageArtifact”,并选择占位符

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

  • imagedefinitions.json文件不适用于部署操作“Amazon ECS蓝色/绿色”。为此,您必须在构建步骤中创建文件imageDetail.json,并将其作为工件提供给部署步骤。怎样?以下是buildspec.yaml的底部外观:
  • 在CodePipeline的部署阶段,使用DefinitionArtifact和ImageArtifact作为输入工件,并在相应的部分“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
    
    版本:0.0
    资源:
    -目标服务:
    类型:AWS::ECS::服务
    特性:
    任务定义:
    LoadBalancer信息:
    ContainerName:“我的测试容器”
    集装箱港口:8000
    
       {"ImageURI":"########.dkr.ecr.eu-west-1.amazonaws.com/##/#####:2739511dd87d4e4e1f65ed69c9e779b63fb72e36-master-fbe73fdc-6213-4bd6-a784-dcc3d2ae7845"}
    
    {
      "containerDefinitions": [
        {
          "name": "ronantest1",
          "image": "<IMAGE1_NAME>",
                           ]
    }
    
    
    {
      "version": 0.0,
      "Resources": [
        {
          "TargetService": {
            "Type": "AWS::ECS::Service",
            "Properties": {
              "TaskDefinition": "<TASK_DEFINITION>",
              "LoadBalancerInfo": {
                "ContainerName": "ronantest1",
                "ContainerPort": "8080"
              }
            }
          }
        }
      ],
      "Hooks": [
          {
          "AfterAllowTestTraffic": "arn:aws:lambda:eu-west-1:######:function:code-deploy-after-allow-test-traffic"
          }
    
        ]
      }
    
    
                - Name: BlueGreenDeploy
                  InputArtifacts:
                  - Name: BuildDockerOutput
                  - Name: PrepareCodeDeployOutputTesting
                  Region: !Ref DeployRegion1
                  ActionTypeId:
                    Category: Deploy
                    Owner: AWS
                    Version: '1'
                    Provider: CodeDeployToECS
                  RoleArn: !Sub arn:aws:iam::${TestingAccountId}:role/######/CrossAccountsDeploymentRole
                  Configuration:
    
                    AppSpecTemplateArtifact: PrepareCodeDeployOutputTesting
                    AppSpecTemplatePath: appspec.json
    
                    ApplicationName: !Ref ApplicationName
                    DeploymentGroupName: !Ref ApplicationName
                    
                    TaskDefinitionTemplateArtifact: PrepareCodeDeployOutputTesting
                    TaskDefinitionTemplatePath: taskdef.json
    
                    Image1ArtifactName: BuildDockerOutput
                    Image1ContainerName: "IMAGE1_NAME"
                  RunOrder: 4