使用 Terraform 时从实例获取 EC2 Windows 密码

Posted

技术标签:

【中文标题】使用 Terraform 时从实例获取 EC2 Windows 密码【英文标题】:Getting EC2 Windows Password from instances when using Terraform 【发布时间】:2019-10-05 16:14:38 【问题描述】:

在使用 terraform 时,我很难从几个新的 ec2 实例中获取密码。一直在阅读一些帖子,并认为我有它但没有得到任何地方。

这是我的配置:

resource "aws_instance" "example" 
  ami = "ami-06f9d25508c9681c3"
  count         = "2"
  instance_type = "t2.small"
  key_name = "mykey"
  vpc_security_group_ids =["sg-98d190fc","sg-0399f246d12812edb"]
  get_password_data = "true"


output "public_ip" 
    value = "$aws_instance.example.*.public_ip"


output "public_dns" 
    value = "$aws_instance.example.*.public_dns"


output "Administrator_Password" 
    value = "$rsadecrypt(aws_instance.example.*.password_data, 
file("mykey.pem"))"

设法清除所有语法错误,但现在运行时出现以下错误:

PS C:\tf> terraform apply
aws_instance.example[0]: Refreshing state... (ID: i-0e087e3610a8ff56d)
aws_instance.example[1]: Refreshing state... (ID: i-09557bc1e0cb09c67)

Error: Error refreshing state: 1 error(s) occurred:

* output.Administrator_Password: At column 3, line 1: rsadecrypt: argument 1 
should be type string, got type list in:

$rsadecrypt(aws_instance.example.*.password_data, file("mykey.pem"))

【问题讨论】:

我猜你可能需要 2 个 Administrator_Password 输出,识别列表中的每个 value = "$rsadecrypt(aws_instance.example.*.password_data[0], file("mykey.pem"))" 将其放到一个实例中以保持简单并使其正常工作。使用此 config output "Administrator_Password" value = "$rsadecrypt(aws_instance.example.password_data,file("C:/TF/mykey.pem"))" 但最终得到以下响应 - Error: Error refreshing state: 1 error(s) occurred: * output.Administrator_Password: rsadecrypt: crypto/rsa: decryption error in: $rsadecrypt(aws_instance.example.password_data,file("C:/TF/mycert.pem")) 能够从 aws cli 中使用密钥获取密码所以知道密钥是正确的aws ec2 get-password-data --instance-id i-09557bc1e0cb09c67 --priv-launch-key mykey.pem 只需要弄清楚 terraform 设置 【参考方案1】:

返回此错误是因为 aws_instance.example.*.password_data 是来自每个 EC2 实例的 password_data 结果列表。每一个都必须用rsadecrypt单独解密。

要在 Terraform v0.11 中执行此操作,需要使用 null_resource 作为解决方法来实现“for each”操作:

resource "aws_instance" "example" 
  count = 2

  ami                    = "ami-06f9d25508c9681c3"
  instance_type          = "t2.small"
  key_name               = "mykey"
  vpc_security_group_ids = ["sg-98d190fc","sg-0399f246d12812edb"]
  get_password_data      = true


resource "null_resource" "example" 
  count = 2

  triggers = 
    password = "$rsadecrypt(aws_instance.example.*.password_data[count.index], file("mykey.pem"))"
  


output "Administrator_Password" 
    value = "$null_resource.example.*.triggers.password"

从 Terraform v0.12.0 开始,这可以使用新的 for 表达式构造来简化:

resource "aws_instance" "example" 
  count = 2

  ami                    = "ami-06f9d25508c9681c3"
  instance_type          = "t2.small"
  key_name               = "mykey"
  vpc_security_group_ids = ["sg-98d190fc","sg-0399f246d12812edb"]
  get_password_data      = true


output "Administrator_Password" 
  value = [
    for i in aws_instance.example : rsadecrypt(i.password_data, file("mykey.pem"))
  ]

【讨论】:

感谢您的反馈,但仍然遇到错误。 '错误:刷新状态错误:发生 1 个错误:* null_resource.example:发生 2 个错误:* null_resource.example[1]:索引 1 超出列表 aws_instance.example.*.password_data 的范围(最大值1) 在:$rsadecrypt(aws_instance.example.*.password_data[count.index], file("mycert.pem")) * null_resource.example[0]:rsadecrypt:crypto/rsa:解密错误:$ rsadecrypt(aws_instance.example.*.password_data[count.index], file("mycert.pem"))' 我也尝试将它放到一个实例中,但仍然遇到与证书相同的问题,因为我怀疑我可能试图用 2 个实例使其复杂化。 执行上述表达式时出现此错误错误:尝试从空值获取属性││在 ec2.tf 第 18 行,在输出“Administrator_Password”中:│ 18:for i in aws_instance。 windowstest : rsadecrypt(i.password_data, file("/home/qDownloads/terraform-key.pem")) │ │ 这个值为空,所以它没有任何属性。 ╵╷│错误:不支持的属性││在ec2.tf第18行,在输出“Administrator_Password”中:│18:for i in aws_instance.windowstest:rsadecrypt(i.password_data,fi

以上是关于使用 Terraform 时从实例获取 EC2 Windows 密码的主要内容,如果未能解决你的问题,请参考以下文章

新AMI发布时,Terraform重新创建EC2实例

使用 terraform 启动 EC2 实例时出错

Terraform 重新部署 EC2 实例

如何通过 Terraform 部署 Open*** EC2 实例? [关闭]

如何通过 Terraform 启动没有密钥对的 EC2 实例?

如何使用 terraform 将负载均衡器添加到 ec2 实例