You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:39:19