Terragrunt执行fmt时merge函数入参为string类型报错如何解决
问题根因
overrides.yaml语法不符合YAML规范:YAML的键值对需使用冒号+空格分隔,你当前使用了HCL的等号=语法,导致yamldecode解析后local.overrides.base_s3被识别为普通字符串,而非预期的map/object对象,触发merge函数的类型校验失败。merge函数使用逻辑错误:merge的作用是合并多个map/object对象,仅传入单个参数属于无效调用,没有实际意义。
修复步骤
- 修正
overrides.yaml的语法,将等号替换为冒号+空格:
base_s3: team: "staging-one" aws_region: "us-east-1"
- 修正terragrunt.hcl中
overridden变量的定义,移除冗余的merge调用,直接取值即可:
local { team = "testing-env" environment = "test-one" aws_region = "us-east-1" overrides_path = "${get_terragrunt_dir()}/overrides.yaml" overrides = yamldecode(fileexists(local.overrides_path) ? file(local.overrides_path) : "{}") # 修正后逻辑:文件存在时直接取base_s3对象,否则返回空map overridden = fileexists(local.overrides_path) ? local.overrides.base_s3 : {} }
如果你确实需要将覆盖配置和默认S3配置合并,可以按照merge的正确用法传入多个参数,示例如下:
# 假设存在默认S3配置 default_s3 = { team = "testing-env" aws_region = "us-east-1" enable_versioning = true } # 合并默认配置和覆盖配置,覆盖配置优先级更高 overridden = fileexists(local.overrides_path) ? merge(local.default_s3, local.overrides.base_s3) : local.default_s3
内容的提问来源于stack exchange,提问作者dcloud
相关产品推荐
相关产品推荐

