使用Terraform创建CloudWatch告警遇解析错误,求多变量传入方法
解决Terraform CloudWatch告警的解析错误与变量引用问题
嘿,这个parse error at 1:20: expected "}" but found invalid sequence "$"错误,十有八九是你变量引用的语法写错了——Terraform里引用变量得用var.变量名(Terraform 0.12+支持)或者${var.变量名}的格式,不能直接写$sfn_name这种裸的$开头写法。我来帮你把正确的配置写出来,搞定dimensions和alarm_actions里的变量传递问题:
第一步:补全变量定义(可选但推荐)
先把你的变量定义补全类型和描述,避免后续歧义:
variable "sfn_name" { type = string description = "状态机的名称或ARN,对应CloudWatch维度的标识值" } variable "sns_topic" { type = list(string) # 支持传入多个SNS主题ARN,单个主题也可以用string类型 description = "告警触发时要通知的SNS主题ARN列表" }
第二步:正确配置CloudWatch告警资源
下面是完整的aws_cloudwatch_metric_alarm配置示例,重点看dimensions和alarm_actions的变量引用方式:
resource "aws_cloudwatch_metric_alarm" "state_machine_failure_alarm" { alarm_name = "${var.sfn_name}-execution-failure-alarm" comparison_operator = "GreaterThanThreshold" evaluation_periods = 2 metric_name = "ExecutionsFailed" namespace = "AWS/States" period = 60 statistic = "Sum" threshold = 1 alarm_description = "当状态机${var.sfn_name}出现执行失败时触发告警" # 在dimensions中引用变量:如果sfn_name是状态机ARN直接使用,否则替换为对应资源的ARN dimensions = { StateMachineArn = var.sfn_name # 若需要多个维度,直接新增键值对即可,每个值都可引用不同变量: # Environment = var.deployment_env } # 传递多个SNS主题到alarm_actions:直接使用变量即可(因变量为list类型) alarm_actions = var.sns_topic # 可选:恢复正常时的通知动作,同样引用变量 ok_actions = var.sns_topic }
关键注意点
- 变量引用语法:把你之前写的
$sfn_name这类错误写法,全部替换成var.sfn_name或者${var.sfn_name},这是解决解析错误的核心。 - dimensions多变量传递:如果需要给dimensions添加多个维度,直接在dimensions块里新增键值对,每个值都可以单独引用不同的变量。
- alarm_actions多主题处理:如果要传入多个SNS主题,确保
variable "sns_topic"的类型是list(string),直接赋值var.sns_topic就能把所有主题ARN传入;如果是单个主题,也可以把变量类型设为string,然后用[var.sns_topic](因为alarm_actions要求是列表类型)。
内容的提问来源于stack exchange,提问作者Akshay Tilekar
相关产品推荐
相关产品推荐

