Получение пароля Windows EC2 из экземпляров при использовании Terraform

Я изо всех сил пытаюсь получить пароль от пары новых экземпляров ec2 при использовании terraform. Прочитал пару сообщений и подумал, что у меня это есть, но ничего не получилось.

Вот мой конфиг:

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"))}

person John Fox    schedule 18.05.2019    source источник
comment
Думаю, вам может понадобиться 2 Administrator_Password выхода, каждый из которых будет указан в списке value = "${rsadecrypt(aws_instance.example.*.password_data[0], file("mykey.pem"))}"   -  person Helder Sepulveda    schedule 19.05.2019
comment
Снизили его до одного экземпляра, чтобы он оставался простым и работал. Используем это 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"))   -  person John Fox    schedule 19.05.2019
comment
Возможность получить пароль с ключом от aws cli, поэтому знайте, что ключ правильный aws ec2 get-password-data --instance-id i-09557bc1e0cb09c67 --priv-launch-key mykey.pem Просто нужно выяснить настройку terraform   -  person John Fox    schedule 20.05.2019


Ответы (1)


Эта ошибка возвращается, потому что aws_instance.example.*.password_data - это список результатов password_data для каждого из экземпляров EC2. Каждый из них должен быть расшифрован отдельно с помощью rsadecrypt.

Для этого в Terraform v0.11 требуется использовать null_resource в качестве обходного пути для выполнения "для каждой" операции:

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"))
  ]
}
person Martin Atkins    schedule 20.05.2019
comment
Спасибо за отзыв, но ошибки по-прежнему возникают. 'Ошибка: Состояние обновления ошибки: Произошла 1 ошибка: * null_resource.example: 2 ошибки: * null_resource.example [1]: индекс 1 вне диапазона для списка aws_instance.example. *. Password_data (max 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))} ' - person John Fox; 21.05.2019
comment
Я также попытался свести его к одному экземпляру и по-прежнему столкнулся с той же проблемой, связанной с сертификатом, поскольку подозревал, что я могу усложнить его двумя экземплярами. - person John Fox; 21.05.2019
comment
Я получаю эту ошибку при выполнении вышеуказанных выражений Ошибка: попытка получить атрибут из нулевого значения │ │ в строке 18 ec2.tf, в выводе Administrator_Password: │ 18: для i в aws_instance.windowstest: rsadecrypt (i.password_data, file ( /home/qDownloads/terraform-key.pem)) │ │ Это значение пустое, поэтому у него нет атрибутов. ╵ ╷ │ Ошибка: неподдерживаемый атрибут │ │ в строке 18 ec2.tf, в выводе Administrator_Password: │ 18: для i в aws_instance.windowstest: rsadecrypt (i.password_data, fi - person nikhil; 01.06.2021