amazon-web-services - 使用 Terraform for ECS 在 CloudWatch 中包含退出代码 1 事件

标签 amazon-web-services terraform amazon-cloudwatch

我一直在 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: Updating CloudWatch Event Rule failed: InvalidEventPatternException: Event pattern is not valid. Reason: Match value must be String, number, true, false, or null at [Source: (String)"{"detail":{"containers":[{"exitCode":1}],"lastStatus":["STOPPED"],"stoppedReason":["Essential container in task exited"]},"detail-type":["ECS Task State Change"],"source":["aws.ecs"]}"; line: 1, column: 27] status code: 400



这让我感到困惑,因为我遵循 AWS CloudWatch documentation for containers 中列出的确切结构。我什至尝试在 1 周围加上双引号,以防 Terraform 需要字符串而不是数字。

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

Validation error. Details: Event pattern contains invalid value (can only be a nonempty array or nonempty object)



老实说,我在这一点上有点难住,如果我的语法不正确,我将不胜感激。

最佳答案

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

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

我在输入转换器中使用 $.detail.group 来获取通知消息中的任务系列名称。

关于amazon-web-services - 使用 Terraform for ECS 在 CloudWatch 中包含退出代码 1 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53015242/

相关文章:

google-cloud-platform - 是否可以在 Terraform 中更新 GCP Cloud Functions 的源代码?

amazon-web-services - DynamoDb 查询仅通过主键

terraform - 调试 Terraform 时如何查看对象值

google-cloud-platform - 如何在没有容器 URL 的情况下创建一个空的 Cloud Run 服务?

amazon-web-services - 配置 CloudWatch Events 以使用 Terraform 将输入发送到 Lambda 函数

amazon-web-services - 云信息 : ECS TaskDefinition CloudWatch logs retention policy

amazon-web-services - 一种自动化云信息模板部署的方法

amazon-web-services - 如何防止 terraform 询问在 AWS Secrets Manager 上设置的变量的值?

amazon-web-services - 如何读取 S3 存储桶中每个项目的元数据?

amazon-web-services - Terraform 多个 cloudwatch 事件触发相同的 lambda 函数