首页 > 解决方案 > 使用 Terraform for ECS 在 CloudWatch 中包含退出代码 1 事件

问题描述

我一直在 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
}

但是,我正在尝试稍微修改模式,以便仅在容器以错误代码退出时才收到通知 - 因为我们收到如此多的通知,我们已经开始调出电子邮件,有时不会注意到容器因错误退出的电子邮件通知:

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
}

这会在我触发以下错误terraform apply

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

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

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

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

老实说,在这一点上我有点难过,如果我的语法不正确,我会很感激任何提示。

标签: amazon-web-servicesterraformamazon-cloudwatch

解决方案


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

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

$.detail.group在 Input Transformer 中使用来获取通知消息中的任务系列名称。


推荐阅读