如何修复Terraform创建的EC2实例无法通过curl公网IP访问的问题
问题修复方案
你的curl连接失败核心原因是user_data中的Terraform变量引用语法错误,导致busybox未在指定的8080端口启动服务,同时补充几个细节优化确保服务稳定运行:
核心错误修正
在aws_instance的user_data块中,原代码用{var.server_port}引用变量,缺少Terraform插值语法必需的$符号,导致变量无法被正确解析,busybox启动时使用了无效的端口参数。需修改为${var.server_port}。
额外优化点
- 指定busybox的完整路径:部分AMI默认环境变量PATH不包含busybox路径,直接调用可能失败
- 明确httpd服务的根目录:避免nohup执行时工作目录不确定,导致无法找到index.html文件
修改后的完整代码
provider "aws" { region = "ap-southeast-2" } variable "server_port"{ type = number description = "the port for HTTP" default = 8080 } resource "aws_instance" "name" { ami = "ami-0dfb78957e4edea0c" instance_type = "t2.large" vpc_security_group_ids = [aws_security_group.instance.id] user_data = <<-EOF #!/bin/bash # 创建专属目录作为http服务根目录 mkdir -p /tmp/http_root echo "Hello, World" > /tmp/http_root/index.html # 使用完整路径启动busybox httpd,指定端口和根目录 nohup /bin/busybox httpd -f -p ${var.server_port} -h /tmp/http_root & EOF user_data_replace_on_change = true tags={ Name="terraform-example" } } resource "aws_security_group" "instance"{ name="terraform-example-security-instance" ingress { from_port = var.server_port to_port = var.server_port protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } tags={ Name="terraform-example" } } output "public_ip" { value = aws_instance.name.public_ip description ="The public IP address of EC2" }
验证步骤
- 执行
terraform apply重新部署资源 - 等待实例启动初始化完成(约1-2分钟)
- 使用输出的公网IP执行
curl http://<public IP>:8080,应返回Hello, World
内容的提问来源于stack exchange,提问作者Hariharan
相关产品推荐
相关产品推荐

