使用Terraform for ECS在CloudWatch中包括退出代码1事件

Yu *_*hen 3 amazon-web-services amazon-cloudwatch terraform

我一直在ECS上运行容器,并使用AWS Cloudwatch事件在任务完成时通知我。所有基础结构都是使用Terraform创建的。但是,我无法在事件模式中获得正确的语法,因此仅通知我非零退出代码。

以下资源很好用,每当我的一个容器退出时,它就会向SNS发送通知:

resource "aws_cloudwatch_event_rule" "container-stopped-rule" {
  name        = "container-stopped"
  description = "Notification for containers that exit for any reason. (error)."

  event_pattern = <<PATTERN
{
  "source": [
    "aws.ecs"
    ],
  "detail-type": [
    "ECS Task State Change"
    ],
  "detail": {

    "lastStatus": [
      "STOPPED"
    ],
"stoppedReason" : [
    "Essential container in task exited"
  ]
}
}
PATTERN
}
Run Code Online (Sandbox Code Playgroud)

但是,我正在尝试略微修改模式,以便仅在容器退出并显示错误代码时通知我-由于我们收到的通知太多,我们已经开始调出电子邮件,有时不会注意到容器错误退出的电子邮件通知:

resource "aws_cloudwatch_event_rule" "container-stopped-rule" {
  name        = "container-stopped"
  description = "Notification for containers with exit code of 1 (error)."

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

当我时,这将引发以下错误terraform apply

aws_cloudwatch_event_rule.container-stopped-rule:更新CloudWatch事件规则失败:InvalidEventPatternException:事件模式无效。原因:匹配值必须为[来源:(String)“ {” detail“:{” containers“:[{” exitCode“:1}],” lastStatus“:[”处的String,number,true,false或null。 STOPPED“],” stoppedReason“:[”退出任务中的基本容器“]},”详细类型“:[” ECS任务状态更改“],”源“:[” aws.ecs“]}”“; 行:1,列:27]状态码:400

这让我感到困惑,因为我遵循的是AWS CloudWatch文档中容器的确切结构。我什至尝试用双引号引起来1,以防Terraform需要字符串而不是数字。

我还尝试使用AWS Console手动编辑事件模式JSON,但收到此错误:

验证错误。详细信息:事件模式包含无效值(只能是非空数组或非空对象)

老实说,在这一点上我很困惑,不胜感激我的语法不正确的任何提示。

Osc*_*ett 6

事件模式语法很奇怪,我遇到了同样的问题。以下将起作用:

{
  "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)

$.detail.group在Input Transformer中使用了通知消息中的任务族名称。

  • 我不确定是否可能,但是`“” exitCode“:[!= 0]`会更安全吗?还是确保退出代码为0或1。 (2认同)
  • 现在可以 `"exitCode": [ { "anything-but": 0 } ]` 应该可以工作。 (2认同)
  • @zoph 这里是文档的链接,如果有帮助的话 https://docs.aws.amazon.com/eventbridge/latest/userguide/content-filtering-with-event-patterns.html#filtering-anything-but (2认同)