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

如何在Terraform的remote-exec中运行Node.js应用?超时崩溃求助

Terraform remote-exec 卡住超时:Node.js应用启动导致provisioner无法完成

问题根源

你的Terraform remote-exec 持续显示「Still creating...」直至崩溃,核心原因是启动Node.js应用的命令在前台执行,阻塞了provisioner的会话。Terraform会等待remote-exec中所有命令执行完毕才会标记EC2实例创建完成,而前台运行的Node进程会一直占用SSH会话,最终触发超时。

脚本中的问题点

  1. npm run dev / node src/index.js 是前台运行命令,会一直阻塞会话,不会自动返回
  2. 后续的nohup ./app.sh用法存在缺陷:脚本内的命令没有正确后台运行,且非交互式SSH会话可能无法加载nvm环境变量,导致Node命令找不到

修正后的Terraform代码

resource "aws_instance" "server_1" {
  ami                     = "ami-<id>"
  instance_type           = "t3.micro"
  associate_public_ip_address = true
  key_name = "server_1_kp"
  iam_instance_profile = aws_iam_instance_profile.ec2_access_profile.name
  
  root_block_device {
    volume_size = 25
  }

  connection {
      type        = "ssh"
      user        = "centos"
      private_key = file("server_1_kp.pem")
      host        = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "echo 'Installing Git'",
      "sudo yum -y install git",
      "sudo yum install awscli -y",
      "git config --global credential.helper '!aws codecommit credential-helper $@'",
      "git config --global credential.UseHttpPath true",
      "git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/server-1",
      "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash",
      # 手动加载nvm环境,避免非交互式shell无法读取bashrc
      "export NVM_DIR=\"$HOME/.nvm\"",
      "[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\"",
      "nvm install 16.18.1",
      "cd server-1-app",
      "npm install",
      # 后台启动Node应用,完全脱离SSH会话
      "nohup node src/index.js > /dev/null 2>&1 &",
      # 若使用npm run dev,需确保dev脚本是后台运行(同样加nohup和&)
      # "nohup npm run dev > /dev/null 2>&1 &",
      "echo 'Node应用已后台启动'"
    ]
  }
}

关键修正说明

  • 手动加载nvm环境:非交互式SSH会话不会自动执行~/.bashrc,因此直接导出NVM_DIR并加载nvm.sh,确保nvm和Node命令能正常调用
  • 正确后台启动应用:
    • nohup:让进程忽略挂起信号,即使SSH会话关闭也能持续运行
    • > /dev/null 2>&1:将标准输出和错误输出全部重定向到空设备,避免生成nohup.out文件
    • 末尾的&:让进程在后台运行,立即返回命令提示符,provisioner可继续执行后续命令并正常结束
  • 简化启动步骤:移除多余的app.sh脚本,直接用一行命令完成后台启动,减少中间环节的出错概率

额外注意事项

  • 确保EC2实例安全组允许SSH(22端口)访问,以及Node应用所需端口的外部访问(若需要)
  • 验证IAM实例配置文件权限,确保能正常拉取CodeCommit仓库代码
  • 若npm install速度过慢,可临时切换国内npm镜像源加速安装

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:02:48