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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:27:49