【问题标题】:Terraform - SSH Provisioner Failing to ConnectTerraform - SSH 配置程序无法连接
【发布时间】:2019-09-04 00:41:21
【问题描述】:

我正在创建 aws_instance 资源并运行配置程序,但 SSH 连接永远不会成功。

这是我的资源代码:

resource "aws_instance" "pos" {
  ami           = "ami-c58c1dd3"
  instance_type = "m4.xlarge"
  subnet_id = "${var.subnet_id_1}"
  key_name        = "${var.key_name}"

  connection {
    type = "ssh"
    user        = "ec2-user"
    private_key = "${file(var.private_key_path)}"
    host = "aws_instance.instance.private_ip"
  } 

  provisioner "remote-exec" {
    inline = [
      "sudo yum install nginx -y",
      "sudo service nginx start"
    ]
  }
}

在创建过程中,我一遍又一遍地重复以下输出:

aws_instance.pos (remote-exec): Connecting to remote host via SSH...
aws_instance.pos (remote-exec):   Host: aws_instance.insance.private_ip
aws_instance.pos (remote-exec):   User: ec2-user
aws_instance.pos (remote-exec):   Password: false
aws_instance.pos (remote-exec):   Private key: true
aws_instance.pos (remote-exec):   Certificate: false
aws_instance.pos (remote-exec):   SSH Agent: false
aws_instance.pos (remote-exec):   Checking Host Key: false
aws_instance.pos: Still creating... [40s elapsed]

SSH 连接永远不会成功,最终我必须终止该命令。但是,EC2 实例已成功创建,我可以使用私钥(PEM 文件)从本地机器 SSH 进入。

我也尝试在主机字段中使用self.public_ip,但产生了相同的结果。如何连接到 EC2 实例并在创建期间对其进行配置?

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    您没有正确插入 IP 地址输出,因此只使用了 "aws_instance.insance.private_ip" 的字符串文字。

    相反,您想通过将其包装在 ${} 中来插入它。不幸的是,如果你这样做了,你会从 Terraform 收到一个错误,说它找不到资源 aws_instance.instance,因为你还没有定义它。相反,您应该使用 self 关键字直接访问资源中的属性:

    resource "aws_instance" "pos" {
      ami           = "ami-c58c1dd3"
      instance_type = "m4.xlarge"
      subnet_id = "${var.subnet_id_1}"
      key_name        = "${var.key_name}"
    
      connection {
        type = "ssh"
        user        = "ec2-user"
        private_key = "${file(var.private_key_path)}"
        host = "${self.private_ip}"
      } 
    
      provisioner "remote-exec" {
        inline = [
          "sudo yum install nginx -y",
          "sudo service nginx start"
        ]
      }
    }
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用以下代码。它对我有用。 Terraform 在创建实例并运行命令后能够连接到实例。

      resource "aws_instance" "pos" {
        ami           = "ami-c58c1dd3"
        instance_type = "m4.xlarge"
        subnet_id = "${var.subnet_id_1}"
        key_name = "XYZ"
      
        provisioner "remote-exec" {
        connection {
          type = "ssh"
          user = "ec2-user"
          host = "${aws_instance.pos.public_ip}"
          private_key = "${file("<Absolute-Path-to-file>/XYZ.pem")}"
          agent = false
          timeout = "2m"
        }
      
          inline = [
            "sudo yum install nginx -y",
            "sudo service nginx start"
          ]
        }
      }
      

      确保 key_name 应该与 private_key 文件匹配。这是为了确保您在连接创建实例时使用的实例时使用相同的密钥。

      还有一件事,在您的实例使用的安全组中允许端口 22。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 2019-02-24
        • 1970-01-01
        • 2017-11-27
        相关资源
        最近更新 更多