创建EC2时如何将aws_instance的public_dns传入Terraform的user_data
解决方案
报错原因
你遇到的报错是两个问题共同导致的:
self引用语法错误:在资源块内部用self引用自身属性时不需要加资源名,正确写法是self.public_dns,但仅修正语法还是会报错- 核心逻辑冲突:
user_data是aws_instance资源的输入参数,需要在实例创建前就确定值并提交给AWS;而public_dns是实例创建完成后才会返回的输出属性,在输入参数中引用同资源的输出属性会触发Terraform的循环依赖校验,直接写aws_instance.app_server.public_dns也会触发同样的问题。
最优解决方法
因为user_data是实例启动后内部执行的脚本,你不需要在Terraform侧提前拿到public_dns的值,直接在脚本中调用EC2实例默认提供的元数据服务获取即可,修正后的代码如下:
resource "aws_instance" "app_server" { ami = "ami-04ad2567c9e3d7893" instance_type = "t2.micro" vpc_security_group_ids = [aws_security_group.web-sg.name] user_data = <<-EOF #!/bin/bash sudo su # 调用EC2元数据接口获取公网DNS PUBLIC_DNS=$(curl -s http://169.254.169.254/latest/meta-data/public-hostname) echo "<p> The Public DNS of instance: $PUBLIC_DNS </p>" >> index.html python -m SimpleHTTPServer 80 EOF tags = { Name = "web_instance" } }
169.254.169.254是EC2实例内置的元数据服务地址,所有EC2实例启动后都可以直接访问,不需要额外配置权限。
内容的提问来源于stack exchange,提问作者madmax80
相关产品推荐
相关产品推荐

