Amazon web services AWS ECS重启服务具有相同的任务定义和映像,无停机

Amazon web services AWS ECS重启服务具有相同的任务定义和映像,无停机,amazon-web-services,deployment,amazon-ecs,Amazon Web Services,Deployment,Amazon Ecs,我正在尝试重新启动AWS服务(基本上停止和启动服务中的所有任务),而不更改任务定义 这是因为图像的每个构建都附带了latest标记 我已尝试停止所有任务并让服务重新创建它们,但这意味着在我的实例中重新启动服务时会出现一些暂时不可用的错误(2) 处理这个问题的最佳方法是什么?比如说,一个蓝绿色的部署策略,这样就不会出现停机 这就是我目前拥有的。它的缺点是,我的应用程序将关闭几秒钟,因为删除它们后,服务的任务将被重建 configure_aws_cli(){ aws --version

我正在尝试重新启动AWS服务(基本上停止和启动服务中的所有任务),而不更改任务定义

这是因为图像的每个构建都附带了
latest
标记

我已尝试停止所有任务并让服务重新创建它们,但这意味着在我的实例中重新启动服务时会出现一些暂时不可用的
错误(2)

处理这个问题的最佳方法是什么?比如说,一个蓝绿色的部署策略,这样就不会出现停机

这就是我目前拥有的。它的缺点是,我的应用程序将关闭几秒钟,因为删除它们后,服务的任务将被重建

configure_aws_cli(){
    aws --version
    aws configure set default.region us-east-1
    aws configure set default.output json
}

start_tasks() {
    start_task=$(aws ecs start-task --cluster $CLUSTER --task-definition $DEFINITION --container-instances $EC2_INSTANCE --group $SERVICE_GROUP --started-by $SERVICE_ID)
    echo "$start_task"
}

stop_running_tasks() {
    tasks=$(aws ecs list-tasks --cluster $CLUSTER --service $SERVICE | $JQ ".taskArns | . []");
    tasks=( $tasks )
    for task in "${tasks[@]}"
    do
        [[ ! -z "$task" ]] && stop_task=$(aws ecs stop-task --cluster $CLUSTER --task "$task")
    done
}

push_ecr_image(){
    echo "Push built image to ECR"
    eval $(aws ecr get-login --region us-east-1)
    docker push $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/repository:$TAG
}

configure_aws_cli
push_ecr_image
stop_running_tasks
start_tasks

将新映像推送到Docker存储库后,您可以(它可以与现有任务定义相同)使用新任务定义修订版。这将触发服务部署,您的服务将从存储库中提取新映像


这样,您的任务定义保持不变(尽管触发图像拉取需要将服务更新为新的任务定义修订版),并且仍然使用图像的“最新”标记,但您可以利用ECS服务部署功能来避免停机。

即使任务定义本身没有更改,我也必须每次创建新的任务定义修订版,这一事实是不正确的

在这方面有很多粗糙的bash实现,这意味着AWS应该让ECS服务调度器监听映像中的更改/更新,特别是对于自动构建过程

我的
rough
解决方法是使用两个相同的任务定义,并为每个构建在它们之间切换。这样我就不会有多余的修改

下面是实现这一点的特定脚本片段

update_service() {
    echo "change task definition and update service"
    taskDefinition=$(aws ecs describe-services --cluster $CLUSTER --services $SERVICE | $JQ ".services | . [].taskDefinition")
    if [ "$taskDefinition" = "$TASK_DEF_1" ]; then
        newDefinition="$TASK_DEF_2"
    else
        newDefinition="$TASK_DEF_1"
    fi
    rollUpdate=$(aws ecs update-service --cluster $CLUSTER --service $SERVICE --task-definition $newDefinition)
}
效果很好


python ecsServiceRestart.py restart--services=“app app2”--cluster=test

  • 登录到运行该任务的EC2实例
  • 使用
    docker容器列表查找您的容器
  • 使用
    docker重新启动[容器]

使用
更新服务
强制新部署
标志:

aws ecs update-service --force-new-deployment --service my-service --cluster cluster-name
等一下。 如果我正确理解了您的用例,那么这将在官方文件中得到解决:

如果更新的Docker映像使用与服务的现有任务定义中相同的标记(例如,my_image:latest),则无需创建任务定义的新修订版。您可以使用以下过程更新服务,保留服务的当前设置,然后选择强制新部署

为避免停机,您应操作两个参数:最小正常百分比和最大百分比:

例如,如果您的服务具有所需数量的四个任务,且最大百分比值为200%,则计划程序可能会在停止四个旧任务之前启动四个新任务(前提是执行此操作所需的群集资源可用)。最大百分比的默认值为200%

这基本上意味着,无论您的任务定义是否发生了更改,以及更改的程度如何,新旧任务之间都可能存在“重叠”,这是实现恢复力和可靠性的方法

更新:
Amazon只有用于ECS的外部部署控制器(EC2和Fargate)。它包括一个称为TaskSet的新抽象级别。我自己还没有尝试过,但对服务和任务管理的这种精细控制(两种API都受支持)可能会解决类似于此的问题。

这个问题解决了吗?也许这对你有用

将带有版本标签(即
v1.05
latest
标签)的新发行版图像推送到ECR后,我的任务定义中的
图像
定位器需要显式更新,以便像
:v1.05
一样将此版本标签后置

使用
:latest
,在
aws ecs更新服务--强制新部署--服务我的服务之后,新容器不会拉取此新映像

我是这样做标签和推动的:

docker标记${imageId}${ecrRepoUri}:v1.05
docker标记${imageId}${ecrRepoUri}:最新
docker推送${ecrRepoUri}
…因为这是推送多个标记的正确方式:

docker标记${imageId}${ecrRepoUri}
docker push${ecrRepoUri}:v1.05
docker push${ecrRepoUri}:最新版本

这在中简要提到,但没有适当的示例。

我的设置也有此问题。我使用没有任何负载平衡器的ECS。我的集装箱在80号端口上运行。我的任务定义定义了主机端口0和容器端口80。我在端口80和443上使用了nginx,当我上传一个标记为“最新”的新映像时,我得到了以下错误:我更新了我的服务,如下所示:
aws ecs更新服务--强制新部署--服务我的服务

这是我得到的错误:

service my-service was unable to place a task because no container instance met all of its requirements. The closest matching container-instance 3d58315f-1062-416c-8997-412161ab18b5 is already using a port required by your task. For more information, see the Troubleshooting section.

我不知道我缺少了什么?

aws现在有这种引擎吗?如果没有任何变化,为什么要重新部署?什么改变了?密码改变了。不是环境/配置。请将链接内容的重要部分复制到此处。如果任务定义没有更改,
更新服务
不会执行任何操作,即使使用
--强制新部署
。请看下面的回答,您必须切换到另一个任务定义:或者。不,这不正确<代码>--强制新部署
启动2个新任务,在ALB目标组中注册它们,取消注册以前的任务,删除以前任务上的连接,并停止它们。我刚刚确认了。调用UpdateService操作时出现了一个错误(ClusterNotFoundException):找不到群集。
@Xin您需要