Amazon web services 如何最好地使用CodeDeploy将代码更改部署到ECS?
我们将运行简单Sinatra API的Docker映像部署到ECS Fargate服务。现在,我们的任务定义使用Amazon web services 如何最好地使用CodeDeploy将代码更改部署到ECS?,amazon-web-services,amazon-ecs,aws-code-deploy,aws-fargate,Amazon Web Services,Amazon Ecs,Aws Code Deploy,Aws Fargate,我们将运行简单Sinatra API的Docker映像部署到ECS Fargate服务。现在,我们的任务定义使用:production标记定义图像。我们希望使用CodeDeploy进行蓝色/绿色部署 当代码更改时-我们是否应该使用:production标签推送一个新映像并强制在我们的服务上进行新部署,或者在我们的任务定义中使用特定的标签(例如:97b9d390d869874c35c325632af0fc1c08e013cd)并创建一个新的任务修订版,然后更新我们的服务以使用这个新的任务修订版 我
:production
标记定义图像。我们希望使用CodeDeploy进行蓝色/绿色部署
当代码更改时-我们是否应该使用:production
标签推送一个新映像并强制在我们的服务上进行新部署,或者在我们的任务定义中使用特定的标签(例如:97b9d390d869874c35c325632af0fc1c08e013cd
)并创建一个新的任务修订版,然后更新我们的服务以使用这个新的任务修订版
我们对第二种方法的担忧是,我们没有看到任何关于任务修订的生命周期规则,所以它们会一直累积到我们有几万/几十万次吗
如果我们使用第一种方法,CodeDeploy是否能够在出现问题的情况下回滚失败的部署?简短回答
在这两种情况下,如果您的新映像以某种方式崩溃,但您当前的旧任务仍应处于活动状态,则没有定义回滚。但是,如果您正在使用运行状况检查,并且当前正在运行的任务低于所需的数量(可能是由于用户流量溢出等原因),Fargate将启动包含坏映像的最新任务定义修订版的新任务
长话短说
因为您只是要求CodeDeploy基于您的映像启动任务,所以它将创建一个新的任务定义,该任务定义具有您的映像的URI以提取正确的映像。新的任务定义将始终用于启动新的Fargate任务
因此,当Fargate发现需要创建任务时,它总是尝试使用最新版本,而最新版本总是图像不好的版本
好的方面是,如果旧映像任务工作正常,它应该仍然处于活动状态,因为最小运行任务为1,而另一个任务持续失败,因此旧映像任务不会退役
不过,您可以通过添加CloudWatch事件来触发lambda来克服这一问题,lambda可以使用良好的图像标记更新新任务修订版,也可以使用以前的任务定义修订版运行当前Fargate。以下是AWS的一篇文章:
关于Fargate部署是如何工作的,并帮助您的旧任务在新部署失败时运行,它将首先提供新任务,当所有新任务运行良好时,它将解除旧任务的运行。因此,如果新任务不能正常运行,旧任务应该仍然处于活动状态。简短回答
在这两种情况下,如果您的新映像以某种方式崩溃,但您当前的旧任务仍应处于活动状态,则没有定义回滚。但是,如果您正在使用运行状况检查,并且当前正在运行的任务低于所需的数量(可能是由于用户流量溢出等原因),Fargate将启动包含坏映像的最新任务定义修订版的新任务
长话短说
因为您只是要求CodeDeploy基于您的映像启动任务,所以它将创建一个新的任务定义,该任务定义具有您的映像的URI以提取正确的映像。新的任务定义将始终用于启动新的Fargate任务
因此,当Fargate发现需要创建任务时,它总是尝试使用最新版本,而最新版本总是图像不好的版本
好的方面是,如果旧映像任务工作正常,它应该仍然处于活动状态,因为最小运行任务为1,而另一个任务持续失败,因此旧映像任务不会退役
不过,您可以通过添加CloudWatch事件来触发lambda来克服这一问题,lambda可以使用良好的图像标记更新新任务修订版,也可以使用以前的任务定义修订版运行当前Fargate。以下是AWS的一篇文章:
关于Fargate部署是如何工作的,并帮助您的旧任务在新部署失败时运行,它将首先提供新任务,当所有新任务运行良好时,它将解除旧任务的运行。因此,如果新任务不能正常运行,旧任务应该仍然处于活动状态