Terraform中remote-exec Provisioner超时问题:EC2实例命令执行成功后仍卡在创建状态
解决Terraform EC2实例创建卡在
Still creating...的问题 我一眼就看出问题出在你remote-exec里的最后一条命令——sudo systemctl status apache2!这条命令默认会进入一个交互式的终端界面,一直停留在那里显示Apache的状态,不会自动退出。Terraform的remote-exec provisioner会等着所有命令执行完才会标记实例创建完成,所以它就一直卡在那儿了。
快速修复方案
把那条阻塞的命令换成非交互式的检查方式就行,比如用systemctl is-active来验证服务是否正常运行,它会返回退出码而且自动结束:
provisioner "remote-exec" { inline = [ "sudo apt update -y", "sudo apt upgrade -y", "sudo apt install apache2 -y", "sudo systemctl is-active --quiet apache2 && echo 'Apache is up and running!' || echo 'Apache failed to start'" ] }
如果你还是想看到Apache的状态输出,也可以给systemctl status加--no-pager参数让它输出后自动退出:
"sudo systemctl status apache2 --no-pager"
更可靠的初始化方式:用user_data替代remote-exec
其实用remote-exec依赖SSH连接,有时候会因为网络延迟或者SSH初始化慢导致问题。更推荐用EC2的user_data来做初始化,它是实例启动时由cloud-init自动执行的,不需要等待外部SSH连接,稳定性更高:
修改你的EC2实例资源配置,添加user_data并可以移除remote-exec(如果只是做初始化的话):
resource "aws_instance" "web_server_instance" { ami = data.aws_ami.ubuntu.id instance_type = "t2.micro" vpc_security_group_ids = [aws_security_group.web_server_security_group.id] key_name = aws_key_pair.web_server_public_key.key_name associate_public_ip_address = true # 添加user_data做初始化 user_data = <<-EOF #!/bin/bash apt update -y apt upgrade -y apt install apache2 -y # 设置Apache开机自启 systemctl enable apache2 # 确保服务启动 systemctl start apache2 EOF connection { user = "ubuntu" private_key = tls_private_key.web_server_key_pair_gen.private_key_pem host = self.public_ip } provisioner "local-exec" { command = "chmod 600 ${local_file.web_server_private_key.filename}" } tags = { Name = "${local.application_name}_instance" } }
这样修改后,实例启动时会自动完成Apache的安装和启动,Terraform也不会因为SSH命令阻塞而卡住了。
内容的提问来源于stack exchange,提问作者keemahs
相关产品推荐
相关产品推荐

