如何使用 CodeDeploy 最好地将代码更改部署到 ECS?

How to best deploy code changes to ECS using CodeDeploy?

我们将运行简单 Sinatra API 的 Docker 映像部署到 ECS Fargate 服务。现在我们的任务定义使用 :production 标签定义图像。我们想使用 CodeDeploy 进行 blue/green 部署。

当代码更改时——我们应该推送带有 :production 标签的新图像并强制在我们的服务上进行新部署,还是在我们的任务定义中使用特定标签(例如 :97b9d390d869874c35c325632af0fc1c08e013cd)和创建一个新的任务修订版然后更新我们的服务以使用这个新的任务修订版?

我们对第二种方法的担忧是,我们没有看到任何关于任务修订的生命周期规则,所以它们是否会不断增加,直到我们有 tens/hundreds 数千个?

如果我们使用第一种方法,CodeDeploy 是否能够在出现问题的情况下回滚失败的部署?

简答

在这两种情况下,如果您的新图像以某种方式崩溃但您当前的旧任务应该仍然存在,则没有定义回滚。但是,如果您正在使用健康检查并且当前 运行ning 任务低于所需数量(可能是由于用户流量溢出等),Fargate 将使用最新的任务定义修订版启动新任务其中包含不良图像。

长答案

由于您只是要求 CodeDeploy 根据您的图像启动任务,它会创建一个新的任务定义,其中包含您图像的 URI 以提取正确的图像。该新任务定义将始终用于启动新的 Fargate 任务。

所以当 Fargate 发现它需要创建任务时,它总是会尝试使用最新的版本,而这总是图像不好的版本。

好消息是,如果您的旧图像任务正常工作,它应该仍然存在,因为最小 运行ning 任务将为 1,并且由于另一个任务不断失败,您的旧图像任务不会退役。

但是,您可以通过添加一个 CloudWatch 事件来触发 lambda 来克服这个问题,该 lambda 可以使用良好的图像标签更新新的任务修订版,或者 运行使用先前的任务定义修订版更新当前的 Fargate。这是来自 AWS 的一篇关于此的文章:https://aws.amazon.com/blogs/compute/automating-rollback-of-failed-amazon-ecs-deployments/

更多关于 Fargate 部署如何在这里工作并帮助您的旧任务 运行ning 当新部署失败时,它会首先配置新任务,当所有新任务 运行ning很好,它将停用旧任务。因此,如果新任务没有正常 运行,旧任务应该仍然存在。