为失败的ECS任务创建CloudWatch Event Rule

时间:2019-03-15 05:37:50

标签: 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"
      ]
    }
  }
}

2 个答案:

答案 0 :(得分:0)

事件模式中没有否定功能。仅完全匹配。来自here

  

记住有关事件模式的以下内容很重要   匹配:

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

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

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

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

  •   
  • 数字匹配在字符串表示形式级别。例如,300、300.0和3.0e2被认为不相等。

  •   

如果您知道here中的退出代码数量,则规则中可以包含一组退出代码。像这样:

{
  "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...]
    }
  }
}

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

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

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

答案 1 :(得分:0)

现在您可以在CW rules中使用“除了”。

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "lastStatus": [
      "STOPPED"
    ],
    "containers": {
      "exitCode": [
        {
          "anything-but": 0
        }
      ]
    }
  }
}