Windows10环境Terraform执行apply报错无法读取SSH私钥:未找到密钥
问题根因
你遇到的Failed to read ssh private key: no key found报错主要由以下几类原因导致:
- Windows路径转义异常:Terraform的
file()函数对Windows系统的反斜杠路径转义处理容易出错 - 密钥路径不一致:你提供的两份配置中私钥的文件路径、用户名、文件名存在差异,可能指向不存在的文件
- 私钥权限不符合SSH要求:SSH客户端默认拒绝权限开放度过高的私钥文件
- 基础连通性问题:未提前验证私钥、安全组规则的有效性
可行解决方案
按以下步骤逐一排查修改即可解决:
- 统一并修正路径写法
Terraform在Windows环境下优先使用正斜杠作为路径分隔符,避免反斜杠转义错误,同时确保路径中的用户名、文件名和实际存储的私钥文件完全一致:
private_key = file("C:/Users/asdfsd/Downloads/asdfsd-ubuntu.pem")
如果将私钥文件放在Terraform配置文件(main.tf)同级目录,可以直接使用内置路径变量path.module简化写法,该变量指代当前配置文件所在的本地目录(你之前看到的${module.path}为错误写法,正确内置变量为path.module):
private_key = file("${path.module}/asdfsd-ubuntu.pem")
若你偏好使用local变量存储私钥内容,只要保证local中读取的文件路径和实际路径一致即可正常生效。
- 调整私钥文件权限
Windows系统下需要限制私钥文件的访问权限,仅保留当前用户的读取权限:
- 右键点击pem文件→选择「属性」→切换到「安全」标签页→点击「高级」
- 点击「禁用继承」→选择「从此对象中删除所有已继承的权限」
- 点击「添加」→选择当前Windows登录用户→仅勾选「读取」权限→保存所有配置
- 提前验证基础连通性
先手动通过SSH工具验证私钥和网络连通性,排除非Terraform层面的问题:
ssh -i C:/Users/asdfsd/Downloads/asdfsd-ubuntu.pem ubuntu@<你的EC2实例公网IP>
如果手动连接失败,先检查EC2实例关联的安全组是否开放了22端口的入站规则,以及你的本地公网IP是否在允许访问的范围内。
- 补充connection块超时配置
避免EC2实例刚启动未完成SSH初始化导致的连接失败,在connection块中添加超时配置:
connection { type = "ssh" host = self.public_ip user = "ubuntu" private_key = file("C:/Users/asdfsd/Downloads/asdfsd-ubuntu.pem") timeout = "5m" }
内容的提问来源于stack exchange,提问作者Amit Joshi
相关产品推荐
相关产品推荐

