<AWS CloudFormation> 如何在不更新 docker 映像的情况下触发 ECS blue/green 部署?
<AWS CloudFormation> How to trigger ECS blue/green deployments without updating the docker image?
我正在尝试通过 CloudFormation 创建 ECS blue/green 部署设置。我看到了这个文档,其中提到 ECS blue/green 部署可以由 CloudFormation 处理,无需显式创建 CodeDeploy 应用程序和部署组。
参考:
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html
https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html
它提到只有在需要重新创建以下资源之一时才会触发 blue/green 部署:
- AWS::ECS::任务定义
- AWS::ECS::任务集
我的问题是,如果我的 docker 图像没有改变(因为它始终具有“最新”版本),假设任务定义不会改变,那么我如何触发 CloudFormation ECS blue/green 部署?
目前无法通过 CloudFormation 的 ECS blue/green 部署设置实现所需的行为,因为我们无法在不更新 docker 图像标签的情况下触发任务定义更改。
另一种方法是使用显式 CodeDeploy 应用程序来处理 ECS blue/green 部署。
在 CodePipeline 构建阶段,它可以选择更新 docker 图像标记并创建指定图像 URI 的“imageDetail.json”。在部署阶段,CodeDeploy 将使用图像 URI 更新 taskdef.json,从而创建一个新的任务定义。这将依次使用更新的任务定义更新 appspec.yaml。然后,这将使用更新的任务定义和 docker 映像触发 ECS blue/green 部署。
我已将相关的示例 CloudFormation 模板放在 GitHub 上以供参考。大多数基础设施创建都可以使用 CloudFormation 进行简化,但 CodeDeploy 部署组的创建除外。 CloudFormation 还不支持创建 blue/green 个部署组,因此我们必须使用 CLI 创建它。
创建 ECS 集群、任务定义和服务,并在应用程序负载均衡器后面公开 ECS 集群
https://github.com/patrickpycheung/aws/blob/main/ECS/Create_ECS_Cluster.yaml
创建 CodeDeploy 应用程序
https://github.com/patrickpycheung/aws/blob/main/CodeDeploy/Create_CodeDeploy_Application.yaml
创建 CodeDeploy 部署组
https://github.com/patrickpycheung/aws/blob/main/CodeDeploy/Create_Sampe_Deployment_Group_CLI_Command.txt
https://github.com/patrickpycheung/aws/blob/main/CodeDeploy/Create_Deployment_Group_CLI_Param.json
为 ECS blue/green 部署创建三阶段 CodePipeline
https://github.com/patrickpycheung/aws/blob/main/CodePipeline/Create_CodePipeline.yaml
https://github.com/patrickpycheung/aws/blob/main/CodeBuild/Create_CodeBuild_Project.yaml
我正在尝试通过 CloudFormation 创建 ECS blue/green 部署设置。我看到了这个文档,其中提到 ECS blue/green 部署可以由 CloudFormation 处理,无需显式创建 CodeDeploy 应用程序和部署组。
参考:
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html
https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html
它提到只有在需要重新创建以下资源之一时才会触发 blue/green 部署:
- AWS::ECS::任务定义
- AWS::ECS::任务集
我的问题是,如果我的 docker 图像没有改变(因为它始终具有“最新”版本),假设任务定义不会改变,那么我如何触发 CloudFormation ECS blue/green 部署?
目前无法通过 CloudFormation 的 ECS blue/green 部署设置实现所需的行为,因为我们无法在不更新 docker 图像标签的情况下触发任务定义更改。
另一种方法是使用显式 CodeDeploy 应用程序来处理 ECS blue/green 部署。
在 CodePipeline 构建阶段,它可以选择更新 docker 图像标记并创建指定图像 URI 的“imageDetail.json”。在部署阶段,CodeDeploy 将使用图像 URI 更新 taskdef.json,从而创建一个新的任务定义。这将依次使用更新的任务定义更新 appspec.yaml。然后,这将使用更新的任务定义和 docker 映像触发 ECS blue/green 部署。
我已将相关的示例 CloudFormation 模板放在 GitHub 上以供参考。大多数基础设施创建都可以使用 CloudFormation 进行简化,但 CodeDeploy 部署组的创建除外。 CloudFormation 还不支持创建 blue/green 个部署组,因此我们必须使用 CLI 创建它。
创建 ECS 集群、任务定义和服务,并在应用程序负载均衡器后面公开 ECS 集群
https://github.com/patrickpycheung/aws/blob/main/ECS/Create_ECS_Cluster.yaml
创建 CodeDeploy 应用程序
https://github.com/patrickpycheung/aws/blob/main/CodeDeploy/Create_CodeDeploy_Application.yaml
创建 CodeDeploy 部署组
https://github.com/patrickpycheung/aws/blob/main/CodeDeploy/Create_Sampe_Deployment_Group_CLI_Command.txt https://github.com/patrickpycheung/aws/blob/main/CodeDeploy/Create_Deployment_Group_CLI_Param.json
为 ECS blue/green 部署创建三阶段 CodePipeline
https://github.com/patrickpycheung/aws/blob/main/CodePipeline/Create_CodePipeline.yaml https://github.com/patrickpycheung/aws/blob/main/CodeBuild/Create_CodeBuild_Project.yaml