Amazon ECS-如何重新启动服务的所有任务?


18

我们的任务是从外部数据源加载一些配置文件。上载设置后,我们希望能够重新启动服务中的所有任务,以便将设置传播到所有实例。

重新启动所有服务的最佳方法是什么?

我们有一个“解决方法”,其中涉及将“任务数”设置为0,然后进行备份,但这绝对不是应该完成的方式,并且会造成停机。


PS:如果有人可以创建标记amazon-ecs,那就太好了了:)
Dennkster 2015年

标签上的电话很好,我为您添加了标签。
ceejayoz

Amazon的文档是否说明您当前正在使用的解决方法?
马特

Answers:


16

使用AWS CLI工具:

aws ecs update-service --force-new-deployment --service my-service

9

您想要做的基本上与重新部署服务相同。

在不停机的情况下重新部署服务:

  1. 根据当前任务定义(具有相同的详细信息)注册新的任务定义
  2. 调用UpdateService,将现有服务与新的任务定义相关联。

这应该为新的任务定义启动新的任务,然后为旧的任务定义终止旧的任务,从而有效地重新启动任务而无需停机。

请参阅:UpdateService


1
我需要通过AWS控制台执行此操作,这是最简单的方法-如果需要,您可以手动管理整个过程。当您需要快速重新启动所有任务并且没有为流程设置更强大的功能时,此方法很有用-在UI中,转到“任务”定义,创建新的修订版,更新服务,然后过一会儿所有任务重新启动!
geerlingguy

2
他们在服务更新“强制进行新部署”中添加了一个复选框,使您可以跳过过程中的步骤1。
Josh Vickery

我对“强制进行新部署”选项的评论是“已接受的答案”。
ecbrodie

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

第二个似乎除了启动新实例之外还做其他事情。
user130681 '18

2

可以通过StopTask调用来停止作为ECS构建块的任务。服务由可通过同一API调用停止的基础任务组成。这里只有缺失的部分是关于带有定义的参数的ListTasks调用的结果的foreach 。我写了简单的Lambda函数,可以帮助您。


1

我在上面扩展@ 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

注意:如果要重新启动单个服务的任务,只需按照@Ben Whaley所述强制执行新的部署。
sudo soul

0

根据Amazon文档,看来您应该能够使用UpdateService API调用编写有问题的操作的脚本。上一个链接中有一些代码示例,看来您应该能够适应。在任务配置更新之后,似乎编写脚本以使用适当的任务定义来重新加载服务将是解决该问题的最佳方法。

有关将AWS CLI与ECS一起使用的更多文档,似乎是处理批处理脚本重新启动服务的最简单方法。


我可以编写和发布脚本/命令序列,但目前无法访问可以用来测试这种事情的AWS账户,因此这是一个粗略的草稿/起点,因为我不会能够有效地对其进行测试...
马特


0

我一直在努力。能够一次可靠地重新启动一项任务将非常有用。下面的脚本是我现在正在使用的脚本。这是非常谨慎的。要求您为每个任务点击回车键。有一个命令可以等待服务稳定,但这并不意味着该任务运行正常。我可以延迟一下时间。但是最后如果情况变坏,脚本将慢慢终止该应用程序。所以...

#!/bin/bash

if [ $# -eq 2 ]
then
    cluster=$1
    service=$2
else
    echo "Usage: $0 <cluster> <service>"
    exit 1
fi

echo
echo "Restarting $cluster $service tasks:"
echo

for task in $(aws ecs list-tasks --cluster $cluster --service-name $service | awk '{print $2}')
do
    echo
    echo -n "Press enter to stop $task"
    read -r
    echo
    echo "stopping $task..."
    aws ecs stop-task --cluster "$cluster" --task "$task"
    echo
    # aws ecs wait services-stable --cluster "$cluster" --services "$service"    done

0

我有一个执行ff的python boto3脚本:

  1. 通过创建服务状态为“运行中”的任务列表

ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')

  1. 对上面的任务列表执行for循环,并通过停止每个任务

ecs_client.stop_task(cluster=mycluster,task=mytask)

  1. 描述获取运行计数和期望计数的服务

ecs_client.describe_services(cluster=mycluster,services=[myservice])

  1. while循环,如果运行计数<期望计数-意味着当前正在停止任务并且尚未替换任务,所以不要停止下一个任务!

while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:

如果while循环不再成立-意味着运行计数和期望计数相等,则停止列表中的下一个任务。

这是实际的流程,我无法显示实际的代码,因为我仍在从事当前的工作,并且我所有的代码都属于它们:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.