为失败的 ECS 任务创建 CloudWatch 事件规则

Joe*_*ppy 5 amazon-ecs amazon-cloudwatch

我目前有一个 ECS 任务时常失败,并出现不同的错误代码。我想创建一个在此类故障时触发的 CloudWatch 事件规则。我目前有以下云监视事件规则,仅在退出代码 1 时触发。我希望收到所有非零错误退出代码的通知。

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "lastStatus": [
      "STOPPED"
    ],
    "stoppedReason": [
      "Essential container in task exited"
    ],
    "containers": {
      "exitCode": [
        "1"
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Ntw*_*ike 12

现在您可以在CW 规则中使用“anything-but” 。

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "lastStatus": [
      "STOPPED"
    ],
    "containers": {
      "exitCode": [
        {
          "anything-but": 0
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 1

事件模式中没有否定函数。它只是完全匹配。从这里

请务必记住有关事件模式匹配的以下几点:

  • 对于与事件匹配的模式,事件必须包含模式中列出的所有字段名称。字段名称必须以相同的嵌套结构出现在事件中。

  • 模式中未提及的事件的其他字段将被忽略;实际上,对于未提及的字段有一个“ ”:“ ”通配符。

  • 匹配是精确的(逐个字符),没有大小写折叠或任何其他字符串规范化。

  • 匹配的值遵循 JSON 规则:用引号括起来的字符串、数字以及不带引号的关键字 true、false 和 null。

  • 数字匹配是在字符串表示级别上进行的。例如,300、300.0 和 3.0e2 不被视为相等。

如果您有已知数量的退出代码,从此处,您可以在规则中包含一组退出代码。就像是:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "lastStatus": [
      "STOPPED"
    ],
    "stoppedReason": [
      "Essential container in task exited"
    ],
    "containers": {
      "exitCode": [1, 2, 3, and so on...]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

由于退出代码的数量有限 (0-255),因此您可以将它们全部输入到数组中。

显然,这看起来非常愚蠢。对于更优雅(并且可以说更强大)的解决方案,您需要修改事件规则以触发任何“STOPPED”事件,并创建自定义 lambda 函数。

  1. 创建 lambda 函数以使用 negation 询问事件代码exitCode != 0。如果为 true,则发送通知(SNS、SES,无论您使用什么......)。
  2. 重新配置事件模式以在任何 STOPPED 事件上触发。
  3. 重新配置事件规则以发送到在步骤 1 中创建的 lambda 函数。