如何在AWS ECS服务中侦听"CPU或内存不足"事件?

Fre*_*end 12 amazon-web-services amazon-ecs

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

"服务X无法放置任务,因为没有容器实例满足其所有要求.最接近的匹配容器 - 实例Y没有足够的CPU单元.有关更多信息,请参阅"故障排除"部分.

集群中的容器实例在AutoScalingGroup中进行管理,因此适当的操作是通过在另一个实例中进行扩展来响应此事件,然后允许计划任务运行.现在,我的问题是,我如何应对这一事件?

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

  • 在/ var /日志/ dmesg的
  • 在/ var/log/messages中
  • 在/ var /日志/泊坞窗
  • /var/log/ecs/ecs-init.log.*
  • /var/log/ecs/ecs-agent.log.*

(EC2实例基于amazon-ecs优化图像)

最初,我认为"服务X无法放置任务......"消息将出现在其中一个日志文件中(更具体地说,在ecs-agent.log或ecs-init.log中),但那是不是这样的.

然后我意识到"ECS Evenets"是一件事(请参阅http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html).但不幸的是,这个特定的事件并不是"ECS事件"支持的事件.仅: 容器实例状态更改事件任务状态更改事件.不是"服务状态变更事件".即使有人会认为服务中"事件"选项卡中的事件也会流式传输,但事实并非如此.我开始意识到文档甚至说:

"您可以使用Amazon ECS事件流为CloudWatch Events接收有关Amazon ECS群集中两个容器实例的当前状态的近实时通知,以及在这些容器实例上运行的所有任务的当前状态."

因此,"用于CloudWatch事件的Amazon ECS事件流"不是蒸汽服务事件(因此也不是用于阻止运行的任务的事件).我真的希望将来能够包含"服务状态变更事件",这样我就可以制作匹配此事件的CloudWatch事件规则,触发Lambda函数,然后确定该事件是否为"服务X"类型的事件无法放置任务...",并基于此,操纵AutoScalingGroup以在群集的其他实例中扩展.

但如上所述,目前不支持这一点.有没有其他方式可以"倾听"这个事件?我甚至考虑过每2-3分钟运行一次lambda,它使用CLI来调用"aws ecs describe-services --service X"来输出事件列表,然后匹配"服务X无法放置任务......"事件.但这似乎错了......

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

Eth*_*hit 4

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

$.detail.responseElements.service.events
Run Code Online (Sandbox Code Playgroud)

这些事件位于通过 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."
  }
]
Run Code Online (Sandbox Code Playgroud)