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

使用Terraform flatten函数时遭遇Invalid index错误求助

Terraform flatten函数使用报错:Invalid index

错误信息

Error: Invalid index
│
│   on helpers.tf line 11, in locals:
│   11:   ]) : "${x.app_region}_${x.app_environment}" => x }["${var.APP_REGION}_${var.APP_ENVIRONMENT}"]
│     ├────────────────
│     │ local.regions_defaults is object with 2 attributes
│     │ local.regions_manifest is object with 2 attributes
│     │ var.APP_ENVIRONMENT is "dv"
│     │ var.APP_REGION is "eastus"

相关代码文件

region_manifest.tf

locals {
  regions_defaults = {
    env_short_name = "uat"
    instance_number = "001"
  }
}

locals {
  regions_manifest = {
    euz = {
      azure_region        = "eastus"
      environments = {
        dv = {
            env_short_name = "dev"
            instance_number = "001"
        }
        tst = {
          env_short_name = "tst"
          instance_number = "002"
         }

      }

    }
    wuz = {
      azure_region        = "westus"
      environments = {
        dv = {
            env_short_name = "dev"
            instance_number = "001"
        }
        tst = {
          env_short_name = "tst"
          instance_number = "002"
         }

      }

    }

  }
}

helpers.tf

locals {
  region = { for x in flatten([
    for region_key, region in local.regions_manifest : [
      for environment_key, environment in region.environments : merge(local.regions_defaults, region, environment, {
        app_region                           = region_key
        app_environment                      = environment_key
        environments                         = null
        regions                              = null
      })
    ]
  ]) : "${x.app_region}_${x.app_environment}" => x }["${var.APP_REGION}_${var.APP_ENVIRONMENT}"]
}

variables.tf(关键部分)

variable "APP_ENVIRONMENT" {
  description = "Environment: dev, qa,test, prod,hub,spoke,stage"
  default = "dv" #配置Space-lift时移除该行
  validation {
    condition = contains(["dv","tst","qa","uat","prod","dr"],var.APP_ENVIRONMENT)
    error_message = "ENVIRONMENT的有效值为dv,tst,qa,uat,prod,dr"
  }
}

variable "APP_REGION" {
  description = "Azure区域"
  default = "eastus"  #配置Space-lift时移除该行
}

错误原因

你生成的映射表键为${x.app_region}_${x.app_environment},其中x.app_region对应regions_manifest里的区域键("euz"、"wuz"),因此映射表的实际键是euz_dv、euz_tst、wuz_dv、wuz_tst。但你用var.APP_REGION(值为"eastus")拼接成eastus_dv去索引该映射表,找不到对应键,从而触发索引无效错误。

解决方案

两种修复方式二选一即可:

方式1:调整变量值匹配区域键

将var.APP_REGION的默认值改为对应区域的键,比如"euz"对应eastus,"wuz"对应westus:

variable "APP_REGION" {
  description = "Azure区域键(euz对应eastus,wuz对应westus)"
  default = "euz"
}

方式2:修改映射表键的生成逻辑

用region.azure_region代替region_key作为键的一部分,让键与var.APP_REGION的值匹配:

locals {
  region = { for x in flatten([
    for region_key, region in local.regions_manifest : [
      for environment_key, environment in region.environments : merge(local.regions_defaults, region, environment, {
        app_region                           = region.azure_region  # 将此处改为azure_region
        app_environment                      = environment_key
        environments                         = null
        regions                              = null
      })
    ]
  ]) : "${x.app_region}_${x.app_environment}" => x }["${var.APP_REGION}_${var.APP_ENVIRONMENT}"]
}

或者直接在生成键时使用region.azure_region,无需修改app_region字段:

locals {
  region = { for region_key, region in local.regions_manifest : [
      for environment_key, environment in region.environments : merge(local.regions_defaults, region, environment, {
        app_region                           = region_key
        app_environment                      = environment_key
        environments                         = null
        regions                              = null
      })
    ]
  ]) : "${region.azure_region}_${environment_key}" => x }["${var.APP_REGION}_${var.APP_ENVIRONMENT}"]
}

内容的提问来源于stack exchange,提问作者Pallab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:16:09