如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除

Posted

技术标签:

【中文标题】如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除【英文标题】:How to run an AWS ECS task inside a service of AWS ECS cluster and not ouside the service from Circle CI's "aws-ecs/run-task" 【发布时间】:2021-02-13 21:29:40 【问题描述】:

我正在使用 Circle CI 构建映像并将其推送到 AWS ECR,然后使用此映像在 AWS ECS 的集群内的服务中部署容器(以 FARGATE 作为实例)。问题是,这些任务是在这个服务之外运行的,但是在同一个集群中。

以下是 AWS 自动启动的任务: 组名为service:adp-ecs-service 的组是在服务内部运行的组,组adp-ecs-service 的组是在服务外运行的组。如果我停止它,则具有名为service:adp-ecs-service 的组将自动重新启动,并使用 ECR 中标记为“latest_ci”的图像,但另一个不会启动。而且这个服务一次只能有一个服务。

通过查看此图像中的组,我尝试以多种方式在“config.yml”文件中的group 标记中指定服务的名称,但无济于事。这是我尝试过的所有内容(您可以在我的提交中看到这些 here):

    '服务:adp-ecs-service' 服务:adp-ecs-服务 他们两个(带引号和不带引号)都产生了以下错误:
An error occurred (InvalidParameterException) when calling the RunTask operation: Invalid namespace for group.
    adp-ecs-服务 服务

他们都在服务之外运行任务(您可以在上图中看到 3 的输出。我什至也尝试了 1 和 2 的环境变量。


这是“/.circleci/config.yml”中“aws-ecs/run-task”的代码(完整文件可以在here找到):

      - aws-ecs/run-task:
          requires:
            - aws-ecr/build-and-push-image
          task-definition: 'adp-ecs-family'
          group: adp-ecs-service
          cluster: 'adp-cluster'
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          aws-region: 'ap-south-1'
          awsvpc: true
          launch-type: FARGATE
          subnet-ids: $AWS_SUBNETS
          security-group-ids: $AWS_ADP_SG
          started-by: 'circle-ci'
          assign-public-ip: ENABLED

这里是服务: 上图可以看到,正在运行的任务数和期望的任务数都是1,但是这个集群里有2个任务在运行,一个在服务之外。

我想要的是,如果我在服务中运行一个新任务,它应该通过停止前一个图像从 ECR 中提取最新图像来启动一个容器。那么,如何正确指定服务的名称并完成此操作?

【问题讨论】:

【参考方案1】:

简单地说 aws-ecs/run-task 不是你想要的。您需要将新的任务定义部署到服务,而不是运行它。

如果您还没有找到aws-ecs/deploy-service-update 和update-task-definition,您正在寻找。

【讨论】:

使用这两个解决了任务在服务之外运行的问题。但是,我现在在服务中还有两个任务,一个是以前运行的,另一个是由“deploy-service-update”启动的,这意味着一个任务超过了所需的任务计数 1。 这可能在部署期间发生。确保您的服务最大健康百分比至少为 200%,并且新服务版本可以稳定。查看 ECS 事件选项卡以获取更多信息。祝你好运 如果我总是使用带有最新标签的图像怎么办?我是否还需要每次都创建一个新的任务定义?没有其他方法可以做到这一点吗? @HadasArik 通常,如果您使用:latest 标记重新部署带有taskdef 的任务,即使任务定义相同,它也会拾取新图像。出于这个原因,建议不要使用最新的标签,并且每次都创建一个具有唯一标签的新任务定义。这样,您始终可以安全地回滚到旧版本的服务。几乎没有什么理由不应该一直创建新的 taskdef —— 对于 ECS 服务,它们可部署的工件。

以上是关于如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除的主要内容,如果未能解决你的问题,请参考以下文章

如何为在 EC2 模式下运行在 AWS ECS 集群中的容器分配公共 IP

如何更改 AWS ECS 集群中的实例类型?

如何从 AWS Lambda 函数运行 ECS 任务?

Terraform 中的 ECS 服务如何连接到 AWS 自动缩放组

连接到 AWS ECS 集群中正在运行的容器

在 AWS ECS EC2 集群中运行 docker 镜像