假设有一个在 ECS 中运行的服务,比如说有 2 个任务,我想启动一个新版本的底层镜像。如果我创建任务的新版本,并更新服务以使用新定义,它将使用新版本启动 2 个新任务,等待它们变得健康,然后取消注册旧任务。
这一切都很好,但这意味着我正在创建一堆相同的任务定义,因为图像名称没有改变(它是
myapplication:latest
)。而且,实验表明,如果我手动停止任务并让 ECS 重新启动它,它将使用更新后的映像。但是,手动停止任务会导致其在启动替代任务之前立即取消注册,这意味着短暂的停机时间。
据我所知,无法从控制台重新启动图像。 CLI 有什么办法吗?或者,还有其他我没有想到的技巧?
这里没有技巧 - 启动新版本任务(作为服务运行)的正确方法是注册新任务定义,然后更新服务以指向该新定义。请记住,您的图像存在于任务定义中,存在于任务中,存在于服务中。
最简单的方法:
register-task-definition
)。即使您的定义文件中没有任何更改,AWS 也会注册一个新定义。以非常简单的方式实现此目的的一种方法是使用所需的标签更新图像,然后只需执行
force-new-deployment
,如果您的集群是这样配置的,这将进行滚动更新。
aws ecs update-service --cluster ${CLUSTER} --service ${SVC} --force-new-deployment --region=${REGION}
这将避免任务定义混乱(或至少在蓝色和绿色之间切换并跟踪它)
此外,我们还使用下面的方法在滚动重启之前自动更新图像
ECR_REPO_NAME=${1}
STAGE_TAG=${2:-"pre-release"}
PROD_TAG=${3:-"prod-ready"}
MANIFEST=$(aws ecr batch-get-image --region us-east-2 --repository-name ${ECR_REPO_NAME} --image-ids imageTag=${STAGE_TAG} --output text --query images[].imageManifest)
aws ecr put-image --repository-name ${ECR_REPO_NAME} --image-tag "${PROD_TAG}" --image-manifest "${MANIFEST}"