Terraform部署AWS资源时如何将ELB DNS注入cloud config的nginx配置
解决方案
报错原因
报错的核心是模板变量未正确传递,同时不符合Terraform的内部引用规则:
template_file数据源未通过vars字段注入elb_dns_name参数,模板渲染时找不到占位符对应的取值- output.tf中定义的
output "elb_dns_name"是模块向外暴露值的出口,当前模块内部不能直接通过output.elb_dns_name引用,需要直接引用ELB资源属性或者对应自定义模块的输出值
修复步骤
方式1:继续使用template_file数据源
在data "template_file" "nginx"配置中新增vars块,传入ELB的DNS取值:
data "template_file" "nginx" { template = file("./template/nginx.yaml") vars = { # 如果ELB是当前模块内的资源,写法为:aws_lb.你的ELB资源名.dns_name # 如果ELB定义在自定义模块中,写法为:module.你的ELB模块名.elb_dns_name elb_dns_name = module.lb.elb_dns_name } }
渲染完成后,通过data.template_file.nginx.rendered即可拿到替换后的完整配置,直接传入EC2启动模板/启动配置的user_data参数即可。
方式2(推荐):使用内置templatefile函数
Terraform 0.12及以上版本官方已经弃用template_file数据源,推荐直接使用内置的templatefile函数,无需额外定义数据源,直接在user_data配置处渲染即可:
resource "aws_launch_template" "web" { # 其他启动模板配置 user_data = base64encode(templatefile("./template/nginx.yaml", { elb_dns_name = module.lb.elb_dns_name })) }
Terraform会自动处理依赖关系,等待ELB创建完成并拿到DNS值后再渲染模板,保证配置注入正确。
验证方法
执行terraform plan后可以查看启动模板的user_data渲染结果,确认server_name已被替换为正确的ELB DNS地址。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

