You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Terraform创建的EC2实例无法通过curl公网IP访问的问题

问题修复方案

你的curl连接失败核心原因是user_data中的Terraform变量引用语法错误,导致busybox未在指定的8080端口启动服务,同时补充几个细节优化确保服务稳定运行:

核心错误修正

在aws_instance的user_data块中,原代码用{var.server_port}引用变量,缺少Terraform插值语法必需的$符号,导致变量无法被正确解析,busybox启动时使用了无效的端口参数。需修改为${var.server_port}。

额外优化点

  1. 指定busybox的完整路径:部分AMI默认环境变量PATH不包含busybox路径,直接调用可能失败
  2. 明确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"
}

验证步骤

  1. 执行terraform apply重新部署资源
  2. 等待实例启动初始化完成(约1-2分钟)
  3. 使用输出的公网IP执行curl http://<public IP>:8080,应返回Hello, World

内容的提问来源于stack exchange,提问作者Hariharan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:57:38