【问题标题】:How to listen for an "Insufficient cpu/memory" event in an AWS ECS service?如何在 AWS ECS 服务中侦听“CPU/内存不足”事件?
【发布时间】:2017-07-12 16:32:33
【问题描述】:

我对侦听/响应事件感兴趣,因为 cpu 或内存不足,服务无法启动任务。如果我选择特定服务并查看其“事件”选项卡,则可以在控制台中查看此信息。在那里,将显示如下事件:

“服务 X 无法放置任务,因为没有容器实例满足其所有要求。最匹配的容器实例 Y 的可用 CPU 单元不足。有关详细信息,请参阅故障排除部分。”

集群中的容器实例在 AutoScalingGroup 中进行管理,因此适当的操作是通过扩展额外的实例来对此事件做出反应,然后允许安排任务运行。现在,我的问题是,我该如何应对这个事件?

我有一个 LogGroup,其中包含来自集群中所有 EC2 实例的以下文件的数据:

  • /var/log/dmesg
  • /var/log/messages
  • /var/log/docker
  • /var/log/ecs/ecs-init.log.*
  • /var/log/ecs/ecs-agent.log.*

(EC2 实例基于 amazon-ecs-optimized 镜像)

最初,我认为“服务 X 无法放置任务...”消息会出现在这些日志文件之一中(更具体地说,在 ecs-agent.log 或 ecs-init.log 中),但事实并非如此。

然后我意识到“ECS 事件”是一个东西(在http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html 上查看更多信息)。但不幸的是,此特定事件不是“ECS 事件”支持的事件。仅有的: 容器实例状态更改事件任务状态更改事件不是“服务状态更改事件”。即使有人会认为服务中“事件”选项卡中的事件也会被流式传输,但事实并非如此。我开始意识到文档甚至说:

“您可以使用 CloudWatch Events 的 Amazon ECS 事件流来接收有关 Amazon ECS 集群中容器实例的当前状态以及所有 在这些容器实例上运行的任务。”

因此,“用于 CloudWatch 事件的 Amazon ECS 事件流”不是流式传输服务事件(因此不是被阻止运行的任务的事件)。我真的希望将来会包含“服务状态更改事件”,这样我就可以创建一个与该事件匹配的 CloudWatch 事件规则,触发一个 Lambda 函数,然后确定该事件是否是“服务 X”类型的事件无法放置任务...”,并基于此操作 AutoScalingGroup 以将其他实例扩展到集群。

但如前所述,目前不支持此功能。有没有其他方法可以让我“倾听”这个事件?我什至想过每 2-3 分钟运行一次 lambda,它使用 CLI 调用“aws ecs describe-services --service X”以输出事件列表,然后匹配“服务 X 无法放置任务” ...“ 事件。但这似乎是错误的......

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 如果 AWS 为 ECS 提供了合理的指标(absolute cpu/memory available),那么这是可能的。也就是说,当这些值低于集群上运行的服务的最大要求并适当扩展时,可以设置警报。向 AWS 提出功能请求?
  • 我不确定绝对可用的 CPU/内存是否足够。您可能有一个实例有足够的可用内存,而另一个实例有足够的 cpu,但没有一个实例同时具有足够的内存和 cpu。然后还有其他可能使问题复杂化的约束条件,例如可用端口、主机标签等。您仍然会遇到放置错误,并且您仍然希望捕获它们并可能扩大集群的大小。
  • 现在可以吗?

标签: amazon-web-services amazon-ecs


【解决方案1】:

我可以通过 Cloudwatch 事件规则获取这些事件。我创建了一个带有目标的 Cloudwatch 事件规则,并使用具有以下模式的“匹配事件的一部分”来过滤这些事件。

$.detail.responseElements.service.events

这些事件在通过 Cloudtrail 的 AWS API 调用中。

步骤:

  1. 使用以下事件模式配置创建事件规则。

    服务名称:ECS 事件类型:通过 Cloudtrail 调用 AWS API

  2. 选择目标:SNS

  3. 配置输入 - 匹配事件的一部分 -> 在框中输入$.detail.responseElements.service.events

  4. 创建规则。

过滤事件后的JSON是这样的:

[
  {
    "id": "fb7dbb37-ff2a-443c-b414-1ead7276f550",
    "createdAt": "Oct 18, 2018 7:24:16 AM",
    "message": "(service sample) has reached a steady state."
  },
  {
    "id": "598dbdc0-e1b5-4673-8d5c-0b531d349789",
    "createdAt": "Oct 18, 2018 1:24:11 AM",
    "message": "(service sample) has reached a steady state."
  },
  {
    "id": "5aa89799-c661-4f6c-bbf0-8e7c93dfa31e",
    "createdAt": "Oct 17, 2018 7:24:04 PM",
    "message": "(service sample) has reached a steady state."
  },
  {
    "id": "db535112-786d-4090-9855-147a7301761b",
    "createdAt": "Oct 17, 2018 1:23:34 PM",
    "message": "(service sample) has reached a steady state."
  },
  {
    "id": "15e4b4d7-8cb7-4fd7-b616-bec0fdbc5e6c",
    "createdAt": "Oct 17, 2018 1:01:35 PM",
    "message": "(service sample) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 05016874-f518-4b7a-a817-eb32a4d387f1) has insufficient memory available. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide."
  },
  {
    "id": "f744736c-6213-40bc-aee4-9e928f9be263",
    "createdAt": "Oct 17, 2018 1:01:26 PM",
    "message": "(service sample) has started 1 tasks: (task 3af3f916-1d6f-4543-a179-c2b06da8487e)."
  },
  {
    "id": "3af31b15-1386-4fd5-be80-42b7e4cdce54",
    "createdAt": "Oct 17, 2018 12:51:35 PM",
    "message": "(service sample) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 05016874-f518-4b7a-a817-eb32a4d387f1) has insufficient memory available. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide."
  }
]

【讨论】:

  • 不幸的是,只有在该服务上有其他 AWS API 调用(例如删除)时,才会显示此事件的一部分。如果你只是做了一个创建并且服务放置失败,你将不会看到这个事件。如果您删除“部分匹配事件”,您可以自己查看。
猜你喜欢
  • 1970-01-01
  • 2017-01-08
  • 2019-10-24
  • 2016-07-24
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
相关资源
最近更新 更多