Terraform同资源Provisioner引用自身Output报错,求解决方案
问题与解决方案
问题场景
创建AWS EC2实例时,尝试将实例公网IP设为output,并在实例创建后的local-exec provisioner中调用bash脚本时使用该IP,代码如下:
output "public_ip" { value = aws_instance.example.public_ip } resource "aws_instance" "example" { ami = "ami-0a606d8395a538502" instance_type = "t2.micro" vpc_security_group_ids = [aws_security_group.sg.id] user_data = "${data.template_file.user_data.rendered}" provisioner "local-exec" { command = "bash utility.sh ${output.public_ip.value}" } }
执行时收到错误:
Error: Reference to undeclared resource │ │ on main.tf line 23, in resource "aws_instance" "example": │ 23: command = "bash /utility.sh ${output.public_ip.value}" │ │ A managed resource "output" "public_ip" has not been declared in the root module.
目录结构:
Terrastuff | +main.tf | +py_exec.sh | +utility.sh
怀疑是在output生成前就引用它,想知道是否需要创建模块及解决办法。
解决办法
不需要创建模块,问题核心及修复方式如下:
- output不能在Terraform配置内部引用:output是用来在整个配置执行完成后对外暴露值的,不属于资源类型,无法用
${output.public_ip.value}这种语法在resource内部调用。 - 直接引用EC2实例的public_ip属性:在
local-exec执行时,EC2实例已经创建完成,其public_ip属性已经可用,直接引用资源本身的属性即可。
修改后的local-exec部分代码:
provisioner "local-exec" { # 注意路径:如果utility.sh在当前目录,用./utility.sh或直接utility.sh,避免写绝对路径/utility.sh command = "bash ./utility.sh ${aws_instance.example.public_ip}" }
另外,原有的output配置可以保留,用来在Terraform执行完成后输出公网IP,不影响配置执行。
内容的提问来源于stack exchange,提问作者parmeni4
相关产品推荐
相关产品推荐

