Terraform执行plan时报错:无效表达式令牌问题求助
Terraform 表达式错误修复方案
错误原因
你遇到的Invalid expression错误,是因为在local.api_sqs的列表推导式中,试图用字符串插值模拟对象结构,这不符合Terraform的HCL语法规范。Terraform无法解析这种字符串形式的伪对象,因此报错。
解决方案
根据你的需求(将队列列表转换为包含API路径与对应SQS ARN的结构),分两种场景提供正确写法:
场景1:生成一个Map(键值对集合)
如果需要将所有队列对应的API路径作为键,对应SQS配置作为值,使用Map推导式:
data "aws_caller_identity" "current" {} locals { sqs_arn_pattern = "arn:aws:apigateway:${var.region}:sqs:path/${data.aws_caller_identity.current.account_id}" api_gateway_name = "${var.Customer_Code}-${var.Environment_Code}-${var.Environment_ID_Code}-${var.Product_Code}-${var.Region_Code}-${var.Availability_Zone_Code}" sqs_lss = var.sqs_ls # 使用Map推导式生成键值对集合 api_sqs = { for ii in local.sqs_lss : "${var.base_path}/${ii}" => { post = "${local.sqs_arn_pattern}/${ii}" } } } output "ll" { value = local.api_sqs }
场景2:生成一个对象列表
如果需要每个队列对应一个独立的对象元素,组成列表:
data "aws_caller_identity" "current" {} locals { sqs_arn_pattern = "arn:aws:apigateway:${var.region}:sqs:path/${data.aws_caller_identity.current.account_id}" api_gateway_name = "${var.Customer_Code}-${var.Environment_Code}-${var.Environment_ID_Code}-${var.Product_Code}-${var.Region_Code}-${var.Availability_Zone_Code}" sqs_lss = var.sqs_ls # 列表推导式,每个元素是包含单个键值对的对象 api_sqs = [ for ii in local.sqs_lss : { "${var.base_path}/${ii}" = { post = "${local.sqs_arn_pattern}/${ii}" } } ] } output "ll" { value = local.api_sqs }
关键修正点
- 移除了原代码中错误的字符串模拟对象写法,直接使用Terraform原生的对象/Map语法
- 动态键名用
"${表达式}"包裹,符合HCL动态属性名的规范 - 简化了无用的索引变量
i,直接遍历队列元素
内容的提问来源于stack exchange,提问作者eksm27
相关产品推荐
相关产品推荐

