Terraform自动化部署EC2实例SSH登录超时问题排查求助
分析Terraform EC2 SSH登录超时问题
看你提供的代码片段,几个常见的“坑”可能导致了这个超时问题,我帮你逐一排查:
1. PEM密钥文件的路径与格式问题
你用了file("PluralSight_Key_Pair3"),这里要确认几个点:
- 密钥文件的完整路径是否正确?如果文件不在Terraform工作目录下,得用相对路径(比如
./keys/PluralSight_Key_Pair3.pem)或者绝对路径,Terraform找不到密钥的话肯定连不上实例。 - 密钥是否真的转换为OpenSSH格式?你可以本地执行
ssh-keygen -p -f PluralSight_Key_Pair3 -m pem命令转换,确保文件开头是-----BEGIN RSA PRIVATE KEY-----,而不是PKCS#8格式。 - 密钥文件的权限是否合规?Linux/macOS下要把权限改成
chmod 400 PluralSight_Key_Pair3,权限太宽的话SSH会拒绝使用这个密钥。
2. EC2实例的网络与安全组配置
这是最容易导致超时的原因:
- 安全组是否允许**22端口(SSH)**从你的本地IP访问?如果安全组只开放了内网或其他IP范围,Terraform的
remote-exec根本无法连接到实例。 - 实例是否分配了公网IP?如果是私有子网的实例,要么给它绑定弹性公网IP(EIP),要么Terraform的运行环境处于VPC内网能访问实例,否则公网无法建立SSH连接。
- 实例的状态检查是否通过?可以去AWS控制台查看实例的系统状态和实例状态是否都是绿色,状态异常的话也会导致连接失败。
3. Connection块的必要配置缺失
你的connection块只指定了user和private_key,可能需要补充这些参数:
host:默认Terraform会用实例的公网IP,但显式指定更稳妥,比如host = self.public_ip或者host = aws_instance.your_instance.public_ip。timeout:默认超时时间可能不够,改成timeout = "5m"给实例足够的启动和SSH服务初始化时间。
修改后的connection块示例:
connection { user = "ec2-user" private_key = file("./PluralSight_Key_Pair3.pem") # 确保路径和后缀正确 host = self.public_ip timeout = "5m" }
4. Remote-exec的时机问题
有时候实例刚启动,SSH服务还没完全就绪,Terraform就开始尝试连接,导致超时。可以添加一个本地执行的provisioner来延迟:
provisioner "local-exec" { command = "sleep 30" # 给SSH服务启动留足时间 } provisioner "remote-exec" { inline = [ "sudo yum install nginx -y" ] }
你可以先从安全组配置和密钥文件这两个最容易出问题的点排查,应该能解决超时问题。
内容的提问来源于stack exchange,提问作者PsionTheory
相关产品推荐
相关产品推荐

