amazon-web-services - 如何在 AWS ECS 服务中监听 "Insufficient cpu/memory"事件?

标签 amazon-web-services amazon-ecs

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

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

集群中的容器实例在 AutoScalingGroup 中进行管理,因此适当的操作是对这个事件使用react,通过扩展一个额外的实例,然后允许任务被调度运行。现在,我的问题是,我如何应对此事件?

我有一个 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 Eventets”是一个东西(更多信息见 http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html)。但不幸的是,这一特定事件并非“ECS 事件”支持的事件。仅有的:
    容器实例状态更改事件 任务状态更改事件 . 不是“服务状态更改事件” .尽管人们会认为服务中“事件”选项卡中的事件也会被流式传输,但事实并非如此。我开始意识到文档甚至说:

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

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

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

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

    最佳答案

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

    $.detail.responseElements.service.events
    

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

    脚步:
  • 使用以下事件模式配置创建事件规则。

    服务名称:ECS
    事件类型:通过 Cloudtrail 调用 AWS API
  • 选择目标:SNS
  • 配置输入-匹配事件的一部分->输入$.detail.responseElements.service.events进盒子里。
  • 创建规则。

  • 过滤事件后的 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."
      }
    ]
    

    关于amazon-web-services - 如何在 AWS ECS 服务中监听 "Insufficient cpu/memory"事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394656/

    相关文章:

    php - 如何在 Laravel 5.1 中使用 AWS SNS 将推送通知从 Web 发送到 iOS 和 Android 设备?

    amazon-web-services - 无法生长,因为没有剩余空间

    aws-cloudformation - EcsService 下类后不稳定

    amazon-web-services - 登录私有(private)注册表时出现 aws ecs 403 错误

    amazon-web-services - 当我尝试运行 Docker 文件时抛出错误 "AH00111: Config variable ${APACHE_RUN_DIR} is not defined"

    node.js - fs.createWriteStream 停顿

    amazon-web-services - 使用 ecs-cli 时出现 IAM 错误

    amazon-web-services - 具有 Auto Scaling EC2 实例的统一 Cloudwatch 代理

    database - DynamoDB 主键和索引表设计

    c# - 拦截 AWS Lambda 对 AWS Lex 查询的响应