Terraform AWS报错:执行provisioner时提示host不能为空
解决Terraform部署AWS时"host for provisioner cannot be empty"报错
报错原因
这个报错的核心是你的EC2实例没有被分配公网IP,导致module.ec2_instance.public_ip返回空值,进而让两个null_resource中connection块的host参数为空。具体触发点有两个:
- 你使用的
terraform-aws-modules/ec2-instance模块默认不会自动为实例分配公网IP,即便子网关联了公网路由表也无效。 - 你的公网子网未配置
map_public_ip_on_launch = true,导致在该子网启动的实例不会自动获取公网IP。
解决方法
你可以通过以下两种方式中的任意一种(或同时配置)解决问题:
方法1:在EC2模块中显式开启公网IP分配
修改module.ec2_instance的配置,添加associate_public_ip_address = true参数,强制为实例分配公网IP:
module "ec2_instance" { source = "terraform-aws-modules/ec2-instance/aws" ami = var.ami name = var.instance_name instance_type = var.instance_type key_name = aws_key_pair.key_pair.key_name monitoring = true subnet_id = aws_subnet.blog_public_subnet.id vpc_security_group_ids = [aws_security_group.blogSG.id] # 新增:强制分配公网IP associate_public_ip_address = true user_data = <<-EOF #!/bin/bash -xe sudo yum update -y sudo yum install docker -y sudo systemctl enable docker.service sudo systemctl start docker.service sleep 15 EOF tags = { Terraform = "true" Environment = "dev" Name = var.instance_name } }
方法2:配置公网子网自动分配公网IP
修改aws_subnet.blog_public_subnet的配置,添加map_public_ip_on_launch = true,让所有在该子网启动的实例自动获取公网IP:
resource "aws_subnet" "blog_public_subnet" { vpc_id = aws_vpc.blog_vpc.id cidr_block = "10.0.1.0/24" availability_zone = var.availability_zone # 新增:实例启动时自动分配公网IP map_public_ip_on_launch = true tags = { Name = "Blog Public Subnet" } }
额外验证点
- 确认你的安全组
aws_security_group.blogSG已经开放22端口(你已配置),确保SSH连接能正常访问实例。 - 执行
terraform apply前,可先运行terraform plan,检查module.ec2_instance.public_ip是否会被正确输出。
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

