Terraform使用插值时无法读取远程状态安全组ID问题
问题原因
第二种写法报错的核心原因是写法逻辑错误,和参数类型无关:
- 你把完整的远程状态数据源引用整体放在了双引号内,Terraform会将双引号包裹的内容识别为普通字符串,仅会解析
${}包裹的局部变量片段,其余文本会原样输出,根本不会去读取远程状态里的对应属性值 - 最终传给
security_group_ids的是形如data.terraform_remote_state.sg.outputs.sg_paris_id的纯文本,自然不符合安全组ID以sg-开头的格式要求,用toset()做类型转换只是把错误的字符串值包装成了集合,值本身不合法当然不会解决问题。
正确复用写法
不需要把整个引用放在引号里,通过output映射的动态键取值即可,单模块即可适配不同城市的配置,无需重复编写模块:
security_group_ids = [data.terraform_remote_state.sg.outputs["sg_${local.city}_id"]]
该写法会先拼接出目标安全组对应的output键名,再从远程状态输出中读取真实的安全组ID值,和你第一种硬编码写法的执行效果完全一致。
版本适配说明
你当前使用的Terraform 0.12.28、Terragrunt 0.23.24版本原生支持上述动态键取值语法,无需升级版本即可正常运行。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

