使用 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 密码的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Terraform 部署 Open*** EC2 实例? [关闭]