如果我尝试在Terraform中循环事件则报错

时间:2019-12-15 09:53:11

标签: terraform aws-glue

我正在尝试在cloudwatch中循环事件模式,但出现错误。不知道我是否以正确的方式进行操作。

try
{
    // Some database-related activities that might throw errors
}
catch (SqlException e) 
{
    // SqlException
}
catch (DbException e)
{
    // DbException
}
catch (Exception e)
{
    // Exception
}

我遇到的错误-

错误:无效的块定义

在cloudwatch.tf第8行中,在资源“ aws_cloudwatch_event_rule”“ failed_event”中:    8:用于范围内的值(长度(可变值)):

为什么我要循环播放此内容-

由于代码中的“ jobname”属性,我试图循环它。我有50多个工作名称,我想将此名称应用于所有工作名称。最初它工作正常,但是列表越来越大,我遇到了

的错误

错误:“事件模式”不能超过2048个字符:

所以我试图循环这个。

在上述错误之前,我的早期代码可以正常工作(错误:“ event_pattern”不能超过2048个字符:):

resource "aws_cloudwatch_event_rule" "failed_event" {
name        = "failed-event"
description = "failed event"


for value in range(length(var.values)):
{
event_pattern = <<PATTERN
{
"source": [
"aws.glue"
],
"detail-type": [
"Glue Job State Change"
],
"detail": {
"state": [
  "FAILED"
],    

"jobName": ${value}
}
}
PATTERN
}

}

1 个答案:

答案 0 :(得分:0)

对于您的原始示例,我们可以重写它以使用jsonencode生成JSON,我认为(主观上)该JSON更易于阅读和维护:

resource "aws_cloudwatch_event_rule" "failed_event" {
  name        = "failed-event"
  description = "failed event"

  event_pattern = jsonencode({
    source      = ["aws.glue"]
    detail_type = ["Glue Job State Change"]
    detail = {
      state    = ["FAILED"]
      job_name = aws_glue_job.example[*].name
    }
  })
}

但是,听起来您的原始问题是event_pattern JSON的长度受到限制。尽管jsonencode会生成缩小的JSON,因此会缩小一些,但我怀疑这是否会对您有很大帮助。相反,您尝试采用的路径似乎是为每个作业创建一个事件规则。这是一种方法:

resource "aws_cloudwatch_event_rule" "failed_event" {
  # This for expression constructs a map from name to job object.
  for_each = { for j in aws_glue_job.example : j.name => j }

  name        = "failed-event-${each.key}"
  description = "${each.key} job failed"

  event_pattern = jsonencode({
    source      = ["aws.glue"]
    detail_type = ["Glue Job State Change"]
    detail = {
      state    = ["FAILED"]
      job_name = each.key
    }
  })
}

以上内容将使用每个作业的名称作为实例键为每个aws_cloudwatch_event_rule.failed_event实例声明一个aws_glue_job.example实例。这意味着您的事件规则将具有aws_cloudwatch_event_rule.failed_event["job_name"]之类的地址,例如name = "job_name"是否有工作。

仅当作业名称是在计划时知道的恒定值时,上述方法才有效,因为Terraform要求在计划期间知道for_each映射键,以便它可以生成有关将要实例多少个实例的准确计划。创建和他们将被称为。特别是,如果您在name_prefix配置中使用name而不是aws_glue_job.example,则此策略将不起作用;在这种情况下,您需要使用name_prefix作为地图键,而不是name才能获得在规划期间已知的键。


请注意,CloudWatch事件规则有每个区域的限制,在撰写本文时默认为100。如果您有50个以上的工作,那么通过为每个工作创建一条规则的策略,达到该限制将已经超过一半,尽管显然可以通过联系AWS支持来增加该限制,而事件模式大小的限制是不可谈判的