如何将我的 AWS EC2 密钥对 PEM 文件加载到我的 terratest 脚本以执行 AWS EC2 SSH 连接验证

How can I load my AWS EC2 Key pair PEM file to my terratest script to perform AWS EC2 SSH connection validation

我正在编写 Go terratest 脚本来验证 AWS EC2 实例的 SSH 连接

我的本地已经有 AWS EC2 密钥对 PEM 文件

我能够使用 terraform.TgApplyAll() 和 terraform.TgDestroyAll() 方法启动和销毁 EC2 实例,并使用 terraform.Output() 方法

获取输出变量

我的本地 AWS EC2 密钥对 PEM 文件用于在 AWS 中创建 EC2 实例

现在我正尝试从 terratest Go 脚本以编程方式验证 SSH 连接。

不能 能够将我的本地 AWS EC2 密钥对加载到 Go terratest 脚本中的 sshKeyPair 变量

我使用了下面的代码片段但没有用

https://github.com/gruntwork-io/module-asg/blob/067647b3aaeb24151badbc5a2d9a6b5381dd2041/test/server_group_test.go#L78

我也试过脚本出现在 https://github.com/gruntwork-io/terratest/blob/907c09f0696083a5ada580debb66bb5c00c19c32/modules/test-structure/save_test_data.go#L66 使用 LoadEc2KeyPair 加载我的本地 EC2 密钥对并使用 fmt.Sprintf("SSH to public host %s", publicIP) 测试 EC2 SSH 但是在 LoadTestData(t testing.TestingT, path string, value interface{}) 方法 json.Unmarshal( bytes, value) 内置调用

错误信息: 无法为值 D:\AWS\KeyPair\pandukeypair.pem 解析 JSON:数字文字中的无效字符“-” 我收到此错误,因为我正在尝试扩充 .pem 文件并且代码正在尝试对 .pem 文件执行 json.umarshal

github/terratest 模块中可用的所有代码片段都讨论了创建 密钥对和加载 AWS EC2 JSON密钥对,但我没有得到任何 approach/Logic 对于我的场景,其中已经存在 existing 密钥对 JSON 我只想加载和使用它。

完整代码如下link

https://www.dropbox.com/sh/dl2mpesidsxitdu/AAAOi4Nmp41CHMSPcyU7a2qva?dl=0

这可以通过使用下面的代码 snippet/functio ..

来实现

生成RSAKeyPairE: func RSAKeyPairFromFile(fpath string) (*terrassh.KeyPair, error) { // 导入 crypto/x509 // 导入 enter code hereio/ioutil // 导入 encoding/pem // 导入“golang.org/x/crypto/ssh” // terrassh "github.com/gruntwork-io/terratest/modules/ssh"

pemBytes, err := ioutil.ReadFile(fpath)
if err != nil {
    return nil, err
}
pemBlock, _ := pem.Decode(pemBytes)
if pemBlock == nil {
    return nil, fmt.Errorf("failed to decode PEM block containing private key")
}
privKey, err := x509.ParsePKCS1PrivateKey(pemBlock.Bytes)
if err != nil {
    return nil, err
}
sshPubKey, err := ssh.NewPublicKey(privKey.Public())
if err != nil {
    return nil, err
}
sshPubKeyBytes := ssh.MarshalAuthorizedKey(sshPubKey)
sshPubKeyStr := string(sshPubKeyBytes)
return &terrassh.KeyPair{PublicKey: sshPubKeyStr, PrivateKey: string(pemBytes)}, nil

}