无法利用现有的 pem 文件通过 terraform 创建 EC2 实例

lea*_*ner 6 amazon-ec2 terraform-provider-aws

我想知道如何停止错误消息中的无限循环,以便它创建 AWS EC2 实例?

地形代码如下:

 provider "aws" {
  region = "${var.location}"
}

resource "aws_instance" "ins1_ec2" {
  ami           = "${var.ami}"
  instance_type = "${var.inst_type}"

  tags = {
    Name = "cluster"
  }
  provisioner "remote-exec" {
    inline = [
      "hostnamectl set-hostname centos-76-1",
    ]
  }
}

resource "aws_eip" "ins1_eip" {
  instance = "${aws_instance.ins1_ec2.id}"
  vpc      = false
}

resource "aws_instance" "ins2_ec2" {
  ami           = "${var.ami}"
  instance_type = "${var.inst_type}"

 provisioner "remote-exec" {
    inline = [
      "hostnamectl set-hostname centos-76-2",
    ]
  }

  tags = {
    Name = "cluster"
  }
}

resource "aws_eip" "ins2_eip" {
  instance = "${aws_instance.ins2_ec2.id}"
  vpc      = false
}
Run Code Online (Sandbox Code Playgroud)

出错并显示以下消息:

* aws_instance.ins2_ec2: timeout - last error: ssh: handshake failed: agent: failed to list keys
* aws_instance.ins1_ec2: timeout - last error: ssh: handshake failed: agent: failed to list keys
Run Code Online (Sandbox Code Playgroud)

我的笔记本电脑上有一个 pem 文件,我可以在 AWS 构建服务器上获取该文件,这样我就可以在 EC2 实例创建中使用 key_name 吗?我的pem文件名“test.pem”是私钥?

我不知道如何使用我已有的 key_name (test.pem) 或用户名/密码登录虚拟机。似乎没有在 aws_instance 块中创建用户名和密码的规定。

Terraform EC2 实例文档位于以下链接: https ://www.terraform.io/docs/providers/aws/r/instance.html

Che*_*iya 5

如果您想在使用 terraform 创建 EC2 实例时将密钥附加到 EC2 实例,则需要首先在 AWS 控制台上创建密钥,下载文件.pem并将密钥对名称复制到剪贴板。

AWS 控制台上的 SampleKey

Terraform 脚本需要正确的键名称才能将其关联到 ec2 实例。

如果您想从 terraform 对实例执行任何远程操作,则需要执行以下操作。

  1. 该实例应该具有 terraform 可以连接的 IP。
  2. Terraform 需要通过 SSH 或 RDP 连接到实例。
  3. 这两种方式都需要在建立连接时使用之前下载的密钥文件(.pem 文件)。

因此,连接是 terraform 配置中缺少的部分。

考虑遵循 terraform 配置来创建一个t1.micro具有与其关联的密钥的实例,然后通过 SSH 访问该实例来在该实例上创建一个文件。

网络要求(例如 vpc、子网、路由表、互联网网关、安全组等)已在 AWS 控制台中创建,并且它们各自的 ID 正在下面的 terraform 配置中使用。

provider "aws" {
    region = "<<region>>",
    access_key="<<access_key>>",
    secret_key="<<secret_key>>"
}

resource "aws_instance" "ins1_ec2" {
    ami           = "<<ami_id>>"
    instance_type = "<<instance_type>>"
    //id of the public subnet so that the instance is accessible via internet to do SSH
    subnet_id = "<<subnet_id>>"

    //id of the security group which has ports open to all the IPs
    vpc_security_group_ids=["<<security_group_id>>"]

    //assigning public IP to the instance is required.
    associate_public_ip_address=true
    key_name = "<<key_name>>"
    tags = {
       Name = "cluster"
    }

    provisioner "remote-exec" {
        inline = [
            //Executing command to creating a file on the instance
            "echo 'Some data' > SomeData.txt",
        ]

        //Connection to be used by provisioner to perform remote executions
        connection {
            //Use public IP of the instance to connect to it.
            host          = "${aws_instance.ins1_ec2.public_ip}"
            type          = "ssh"
            user          = "ec2-user"
            private_key   = "${file("<<pem_file>>")}"
            timeout       = "1m"
            agent         = false
        }
    }
}

resource "aws_eip" "ins1_eip" {
    instance = "${aws_instance.ins1_ec2.id}"
    vpc      = true
}
Run Code Online (Sandbox Code Playgroud)

当您运行terraform apply命令时,如果 terraform 能够通过 SSH 连接到实例,它应该显示以下消息。

在此输入图像描述

如果由于某些其他错误或权限问题而执行的命令失败,您可能仍然会看到错误。但如果您看到如上消息,则表示 terraform 已成功连接到实例。

这是 terraform 配置,它将创建一个 ec2 实例,通过 SSH 连接到它并在其上执行远程执行任务。

.pem文件还可用于从本地计算机在实例上执行 SSH。

这应该可以帮助您解决问题。

有关terraform连接的更多信息,请参见此处