Terraform配置CloudWatch Event Rule事件模式异常如何解决
核心错误说明
你对event_pattern的作用理解完全错了:
- 这个字段是事件匹配过滤器,只负责筛选“哪些事件能触发当前规则”,语法要求所有字段值必须是数组或对象,用来枚举对应字段可匹配的取值,它的内容完全不会作为事件载荷传给下游的Lambda。
- 你把字段值改成数组后能创建成功,只是符合了匹配语法的要求,但你配置的是定时调度规则,触发时根本不存在带
who/message_part字段的来源事件,自然拿不到自定义内容。 - 另外
schedule_expression(定时触发)和event_pattern(事件匹配触发)是互斥配置项,一个规则只能选一种触发方式,同时写两个本身就是错误用法。
正确配置方法
定时触发规则要给Lambda传固定格式的自定义内容,不需要写event_pattern,只需要在绑定目标(也就是关联Lambda)的时候,通过input参数指定要传入的固定事件内容即可,完整配置参考如下:
# 1. 定义定时触发规则,移除错误的event_pattern配置 resource "aws_cloudwatch_event_rule" "send_hello" { name = "say-hi" schedule_expression = "cron(0/5 * * * ? *)" is_enabled = true } # 2. 绑定Lambda为规则目标,在这里配置传入的自定义事件 resource "aws_cloudwatch_event_target" "send_hello_lambda" { rule = aws_cloudwatch_event_rule.send_hello.name target_id = "lambda_hello_target" arn = aws_lambda_function.your_lambda_resource.arn # 替换为你自己的Lambda ARN # 传入你需要的固定JSON格式事件,用jsonencode避免格式转义错误 input = jsonencode({ who = "Peter" message_part_1 = "hello" message_part_2 = "this is the world" }) } # 3. 给EventBridge配置调用Lambda的权限,否则触发时会报权限错误 resource "aws_lambda_permission" "allow_eventbridge_invoke" { statement_id = "AllowEventBridgeInvokeHelloFunc" action = "lambda:InvokeFunction" function_name = aws_lambda_function.your_lambda_resource.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.send_hello.arn }
额外提醒:你原来写的cron表达式
cron(0/5 * * * *)不符合AWS CloudWatch Events的语法要求,AWS的cron表达式为6位结构(分、时、日、月、周、年),日和周字段不能同时指定具体值,其中一个必须填?,因此每5分钟触发的正确表达式为cron(0/5 * * * ? *),直接用原来的表达式部署会报格式错误。
内容的提问来源于stack exchange,提问作者peter cooke
相关产品推荐
相关产品推荐

