使用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
相关产品推荐
相关产品推荐

