Terraform创建资源前能否向待引用文件插入动态配置值?
解决方案
不需要把整个联系流内容硬编码到content参数里,也不用放弃独立存储联系流配置文件的方式,两种方法都可以实现占位符动态替换:
方法1:使用templatefile函数(推荐)
这是Terraform原生支持的模板渲染方案,可维护性最好:
- 把原有联系流JSON文件改成模板格式(建议重命名为
contact_flow.tmpl.json方便区分),将占位符替换为Terraform模板变量格式:
"parameters":[ { "name":"FunctionArn", "value":"${lambda_arn}", "namespace":null }, { "name":"TimeLimit", "value":"3" } ],
- 修改联系流资源配置,用
templatefile动态渲染模板内容,同时自动计算内容哈希触发更新:
resource "aws_connect_contact_flow" "general" { instance_id = aws_connect_instance.dev.id name = "General" description = "General Flow routing customers to queues" content = templatefile("${path.module}/flows/contact_flow.tmpl.json", { lambda_arn = data.terraform_remote_state.remote.outputs.lambda_arn }) content_hash = base64sha256(content) }
方法2:使用replace函数静态替换
如果你不想修改原有占位符格式、不想改文件名,可以直接读取文件后做字符串替换:
locals { # 读取原始文件并替换占位符 rendered_contact_flow = replace( file("${path.module}/flows/contact_flow.json"), "<lambda function arn>", data.terraform_remote_state.remote.outputs.lambda_arn ) } resource "aws_connect_contact_flow" "general" { instance_id = aws_connect_instance.dev.id name = "General" description = "General Flow routing customers to queues" content = local.rendered_contact_flow content_hash = base64sha256(local.rendered_contact_flow) }
说明
原配置里的filename参数仅支持读取静态本地文件,无法做动态值注入,所以涉及动态参数时必须通过content传入最终渲染好的内容,但不需要把整段JSON硬写在Terraform配置中,上述两种方案都保留了联系流配置独立存储的结构,Terraform会在执行plan阶段自动完成替换,同时自动识别Lambda ARN的依赖关系,保证创建顺序正确。
内容的提问来源于stack exchange,提问作者Nick Triantafillou
相关产品推荐
相关产品推荐

