User_data в terraform не удается получить переменную ключа pem

#amazon-web-services #amazon-ec2 #terraform

#amazon-web-services #amazon-ec2 #terraform

Вопрос:

При создании экземпляра ec2 с помощью Terraform я хочу ввести в скрипт весь файл ключа pem.

 resource "aws_instance" "myinstance" {
  ...
  user_data = base64encode(templatefile(
    "${path.module}/userdata.sh", {
       conf_tls_private_key = tls_private_key.mykey.private_key_pem
       conf_tls_self_signed_cert = tls_self_signed_cert.mykey2.cert_pem
    }
  ))
}
 

Реализация файла terraform такая же, как указано выше. При использовании terraform console я протестировал tls_private_key.mykey.private_key_pem выражение, и оно дает мне обычный формат ЗАКРЫТОГО КЛЮЧА OPENSSH.

 ❯ tf console
> tls_private_key.boundary.private_key_pem
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAql5ImjYHynOkQGWL0DGT/3FGCIM6gouUi57MllyZCztzrBwp
FtWe zJNWWjAu WeyESqSnzmdFRnUiIqqo4Fq98yvF3 pjsbSMsC9s4H4wz/gp4o
ZzYXja4u7fBWGFMUKfU53M6zZS0FL0QQ/Tgt9u p9q6HlyhtxiNKY0e3aX4xdCMH
QSrBLBIHLlpapkl/bvWk1xkSPEPNkNHbTvBd 3z2iWtxANEqO6ARItCCI DcGyWP
W1FIwwKFBftNQAgxfs2pxdSnqpoaHSi4M9XjY7r7bADUItf9zpAy PbqJr F3Bzc
 

Однако, когда userdata.sh выполняется в ec2, выдается ошибка, подобная приведенной ниже.

 /var/lib/cloud/instance/scripts/part-001: line 8: RSA: command not found
/var/lib/cloud/instance/scripts/part-001: line 9: MIIEogIBAAKCAQEAql5ImjYHynOkQGWL0DGT/3FGCIM6gouUi57MllyZCztzrBwp: No such file or directory
/var/lib/cloud/instance/scripts/part-001: line 10: FtWe zJNWWjAu WeyESqSnzmdFRnUiIqqo4Fq98yvF3 pjsbSMsC9s4H4wz/gp4o: No such file or directory
/var/lib/cloud/instance/scripts/part-001: line 11: ZzYXja4u7fBWGFMUKfU53M6zZS0FL0QQ/Tgt9u p9q6HlyhtxiNKY0e3aX4xdCMH: No such file or directory
/var/lib/cloud/instance/scripts/part-001: line 12: QSrBLBIHLlpapkl/bvWk1xkSPEPNkNHbTvBd 3z2iWtxANEqO6ARItCCI DcGyWP: No such file or directory
/var/lib/cloud/instance/scripts/part-001: line 13: W1FIwwKFBftNQAgxfs2pxdSnqpoaHSi4M9XjY7r7bADUItf9zpAy PbqJr F3Bzc: command not found
 

Кажется, что каждая строка в файле интерпретируется как команда, чего я не предполагал.

Код userdata.sh , вызвавший проблему, приведен ниже.

 echo $conf_tls_private_key | sudo tee "/etc/pki/tls/boundary/boundary.key"
 

Есть ли что-нибудь, о чем я не знаю, или что-нибудь, что я могу исправить эту проблему? Большое спасибо!

Ответ №1:

Если вы можете, я бы рекомендовал проверить следующую версию userdata.sh , которая использует heredoc:

 #!/bin/bash

tee /etc/pki/tls/boundary/boundary.key << END
${conf_tls_private_key}
END
 

Это должен быть более естественный способ tee записи многострочных строк /etc/pki/tls/boundary/boundary.key , а также вывода их в стандартный вывод.