如何在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会话,最终触发超时。
脚本中的问题点
npm run dev / node src/index.js是前台运行命令,会一直阻塞会话,不会自动返回- 后续的
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
相关产品推荐
相关产品推荐

