我们有一个任务,从外部数据源加载一些配置文件。上传设置后,我们希望能够重新启动服务中的所有任务,以便将设置传播到所有实例。
重新启动所有服务的最佳方法是什么?
我们有一个“解决方法”,即将“任务数”设置为 0,然后再备份,但这绝对不是应该做的方式,而且会导致停机。
答案1
使用 AWS CLI 工具:
aws ecs update-service --force-new-deployment --service my-service --cluster cluster-name
答案2
您想要做的事情基本上与重新部署服务相同。
要在不停机的情况下重新部署服务:
- 根据当前任务定义注册一个新的任务定义(具有相同的详细信息)
- 调用 UpdateService,将现有服务与新的任务定义关联起来。
这应该会为新的任务定义启动新的任务,然后终止旧任务定义的旧任务,从而有效地重新启动任务而无需停机。
看:更新服务
答案3
这对我有用:
aws ecs list-tasks --cluster <cluster_name> | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster <cluster_name> --task \""$0"\""}' | sh
然后在相同的实例上重新创建任务。
如果您需要新实例,请使用以下命令:
aws ecs list-services --cluster <cluster_name> | jq -r ".serviceArns[]" | awk '{print "aws ecs update-service --cluster <cluster_name> --force-new-deployment --service \""$0"\""}' | sh
答案4
我正在扩展上面@user326608 的回答(感谢您的见解!)。
这将重新启动集群的所有服务的所有任务通过停止其所有任务。然后每个服务将自动启动X
数量的新任务,其中X
是服务的desired task count
。
#!/bin/bash
index=0
taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)
until [ "$taskArn" = "None" ]
do
aws ecs stop-task --cluster ${CLUSTER_NAME} --task $taskArn
((index++))
taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)
done