Terraform配置aws_cloudwatch_log_metric_filter遇语法错误求助
问题排查与修复方案
你遇到的Terraform解析错误和后续的"invalid or unknown key"错误,核心问题出在CloudWatch日志过滤器表达式的语法上,同时还有Terraform字符串转义的细节需要调整,具体修复如下:
1. 修复过滤器表达式的语法错误
CloudWatch日志的JSON格式过滤器要求字符串值必须用双引号包裹,你原来的表达式里$.eventName = ConsoleLogin中的ConsoleLogin没有加引号,这是不符合语法要求的。正确的逻辑应该是匹配eventName等于字符串"ConsoleLogin",且errorMessage等于"Failed authentication"。
2. 修正Terraform中的字符串转义
在Terraform的双引号包裹的字符串中,内部的双引号需要用\"来转义,否则Terraform会把内部引号当作字符串的结束标记,导致解析混乱。
3. 完整的修正后代码
把这两处问题修复后,你的resource配置应该是这样的:
resource "aws_cloudwatch_log_metric_filter" "AWS_Console_Login" { name = "${var.aws_account_id}_Console_Login_Failure" pattern = "{ ($.eventName = \"ConsoleLogin\") && ($.errorMessage = \"Failed authentication\") }" log_group_name = var.aws_cloudtrail_name # Terraform 0.12+推荐直接引用变量,也可以保留原插值语法 metric_transformation { name = "${var.aws_account_id}_Console_Login_Failure" namespace = "AccountMonitoring${var.aws_account_id}" value = "1" } }
补充说明
- 你第一次遇到的
nested object expected: LBRACE got: ASSIGN错误,其实是pattern的语法错误导致Terraform无法正确解析整个配置块,错误提示指向log_group_name行属于误报,根源在pattern的写法上。 - 移除
log_group_name后出现的"invalid or unknown key: Failed"错误,同样是因为pattern的语法错误,让Terraform错误地将表达式中的部分内容解析为配置块的键值对,从而抛出异常。
内容的提问来源于stack exchange,提问作者StevieHyperB
相关产品推荐
相关产品推荐

