Terraform创建aws_cloudwatch_log_metric_filter遇参数缺换行报错
问题根因
报错是pattern字段内的双引号未做转义导致的。Terraform解析双引号包裹的字符串时,会将第一个未转义的双引号识别为字符串结束位置,你写的pattern里内部的双引号没有转义,Terraform会把"{($.errorCode="判定为完整字符串,后面的*UnauthorizedOperation等内容被识别为参数外的非法语法,最终抛出“参数定义必须以换行结尾”的错误。
注意Terraform原生字符串语法仅支持双引号包裹,不支持单引号定义字符串,所以替换单引号必然触发语法报错。
修复方案
你可以任选以下两种方式修复:
- 转义内部双引号:在pattern内部的所有双引号前加反斜杠
\做转义,修正后的配置如下:
resource "aws_cloudwatch_log_metric_filter" "name_resource" { name = "MetricName" pattern = "{($.errorCode=\"*UnauthorizedOperation\") || ($.errorCode=\"AccessDenied*\")}" log_group_name = var.log_group_cloudtrail_name metric_transformation { name = "MetricName" namespace = "MetricNameSpace" value = "1" default_value = "0" } }
- 使用Heredoc语法编写规则:如果过滤规则较长、内部特殊字符多,可以用Terraform支持的Heredoc格式定义pattern,这种写法下内部双引号不需要额外转义,可读性更高,配置示例如下:
resource "aws_cloudwatch_log_metric_filter" "name_resource" { name = "MetricName" pattern = <<-EOT {($.errorCode="*UnauthorizedOperation") || ($.errorCode="AccessDenied*")} EOT log_group_name = var.log_group_cloudtrail_name metric_transformation { name = "MetricName" namespace = "MetricNameSpace" value = "1" default_value = "0" } }
两种写法最终生成的CloudWatch指标过滤器规则完全一致,修改完成后重新执行terraform plan即可通过语法校验。
内容的提问来源于stack exchange,提问作者Javier Esteban
相关产品推荐
相关产品推荐

