Terraform部署AWS EC2实例遇“host for provisioner cannot be empty”错误求助
解决Terraform Provisioner报错“host for provisioner cannot be empty”
问题核心原因
报错本质是self.public_ip未获取到有效值,大概率是你部署EC2的子网未启用自动分配公有IP,导致实例创建后没有公网IP,self.public_ip为空值,进而触发provisioner的host校验错误。
可行解决方案
方案1:强制实例分配公网IP
在aws_instance资源块中添加associate_public_ip_address = true参数,强制实例创建时自动获取公网IP:
resource "aws_instance" "dove-inst" { ami = var.AMIS[var.REGION] instance_type = "t2.micro" availability_zone = var.ZONE1 key_name = aws_key_pair.dove-key.key_name subnet_id = "subnet-00a20e364a10aed04" vpc_security_group_ids = ["sg-0ddc62a99b3e5d75d"] # 新增:强制分配公网IP associate_public_ip_address = true tags = { Name = "Dove-Instance" Project = "Dove" } # 后续provisioner代码保持不变 }
方案2:改用私有IP连接(适用于内网可访问场景)
如果你的Terraform执行环境(比如本地机器在VPC对等网络、或使用AWS云执行环境)能直接访问实例的私有IP,可以把host参数替换为self.private_ip:
provisioner "file" { source = "web.sh" destination = "/tmp/web.sh" connection { type = "ssh" user = var.USER private_key = file("dovekey") # 替换为私有IP host = self.private_ip } } provisioner "remote-exec" { inline = [ "chmod u+x /tmp/web.sh", "sudo /tmp/web.sh" ] connection { type = "ssh" user = var.USER private_key = file("dovekey") # 替换为私有IP host = self.private_ip } }
额外必查项
- 确认安全组
sg-0ddc62a99b3e5d75d的入站规则允许SSH(22端口)访问,测试阶段可临时开放来源为0.0.0.0/0,生产环境需限制为指定IP。 - 检查本地
dovekey私钥文件权限是否为600(执行chmod 600 dovekey),避免因权限过高被SSH拒绝。
内容的提问来源于stack exchange,提问作者Awodi
相关产品推荐
相关产品推荐

