您确实是正确的,没有关于此的适当文档(我向我们的 AWS 团队打开了一个支持案例来验证!)。
但是,一切都没有丢失。确实存在解决您难题的解决方案,并且是我们每天使用的解决方案。您不必使用任务组,不管是什么(因为我们实际上还不知道(AWS 工程师正在为我编写一些文档,当我得到它们时会将它们发布在这里) )。
您所需要的只是 放置约束(您的同一个文档),它们很容易设置。如果您有启动配置,您可以在 Advanced > User Data 部分添加类似的内容,以便它在启动期间运行(或者只是在手动启动实例时添加它(或者如果您感觉异常hacky,您可以登录到您的实例并手动运行 commands.. 用于科学和东西)):
echo ECS_INSTANCE_ATTRIBUTES={\"env\": \"prod\",\"primary\": \"app1\",\"secondary\": \"app2\"} >> /etc/ecs/ecs.config
引号中的所有内容都是由您任意定义的,因此请使用对您的用例有意义的任何标签和值。如果你走这条路,请确保将以下行添加到 docker 启动命令中:--env-file=/etc/ecs/ecs.config
既然您有一个正确标记的实例(并确保它只是您想要的单个实例(这意味着您可能需要针对这种特定类型的实例进行专门的启动配置)),您可以继续创建您的ECS 服务就像您想做的那样。但是,请确保您正确设置任务放置,以匹配现在为您的实例配置的角色:
因此,对于上面的示例,此服务配置为仅在为 env==prod 和 secondary==app2 配置的实例上启动此任务——因为您的其他两个实例没有配置对于secondary==app2,不允许他们主持这个任务。
一开始可能会让人感到困惑,我们花了一段时间才弄好,但我希望这会有所帮助!
来自 AWS 支持的响应
我研究了如何使用任务组的过程,以下是我的发现: - 如果您有从 RunTask/StartTask 启动的现有任务,假设您已经有一个名为“databases”的任务组 API。
当您使用 RunTask 或 StartTask 操作启动任务时,您可以为该任务指定任务组的名称。如果您没有为任务指定任务组,则默认名称是任务定义的家族名称(例如,family:my-task-definition) - 因此要创建任务组,您可以定义一个 TaskGroup(比如webserver)在任务控制台上创建任务或使用以下命令:$ aws ecs run-task --cluster <ecs-cluster> --task-definition taskGroup-td:1 --group webserver
创建后,您会注意到一个与组一起运行的任务:webserver。
现在,您可以将以下放置约束与任务定义一起使用,将您的任务仅放置在使用此任务组运行任务的容器上。
"placementConstraints":
[
{
"expression": "task:group == webserver", "type": "memberOf"
}
]
如果您尝试使用上述placementConstraint 运行任务,但没有任何使用taskGroup : webserver 运行的任务,您将收到以下错误:Run tasks failed Reasons : ["memberOf constraint unsatisfied"]。
参考:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html