我正在尝试在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
}
}
答案 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支持来增加该限制,而事件模式大小的限制是不可谈判的