无法使用现有的Pem文件通过Terraform创建EC2实例

时间:2019-02-27 13:10:02

标签: amazon-ec2 terraform-provider-aws

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

以下Terraform代码:

 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
}

出现错误并显示以下消息:

* 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

我的笔记本电脑上有一个pem文件,可以在AWS Build服务器上获取它,因此我可以在创建EC2实例时使用key_name吗?我拥有的Pem文件名“ test.pem”是私钥吗?

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

Terraform EC2实例文档在下面的链接中: https://www.terraform.io/docs/providers/aws/r/instance.html

2 个答案:

答案 0 :(得分:1)

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

SampleKey on AWS Console

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

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

  1. 实例应具有terraform可以连接的IP。
  2. Terraform需要通过SSH或RDP连接到实例。
  3. 两种方法都要求在连接时使用较早下载的密钥文件(.pem文件)。

所以连接是terraform配置中缺少的部分。

请考虑遵循terraform配置,以创建一个具有关联密钥的t1.micro实例,然后通过对它进行SSH对该实例创建文件。

网络要求(例如vpc,子网,路由表,Internet网关,安全组等)已经在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
}

运行terraform apply命令时,如果terraform能够对实例执行SSH,则它会显示以下消息。

enter image description here

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

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

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

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

有关在地形中连接的更多信息,here

答案 1 :(得分:1)

以下内容对我有用,

  1. 创建一个安全组,并确保在入站规则中添加了 SSH(端口22)和源 0.0.0.0/0
  2. 复制安全组的ID并将其添加到terraform配置中的键 vpc_security_group_ids 列表
  3. 转到AWS控制台,然后创建新的密钥对或找到要使用的现有密钥。
  4. 从控制台获取密钥对的名称,并在terraform配置中将其引用为密钥 key_name
  5. 如果您创建了新密钥,请确保下载了pem文件并将权限更改为chmod 400 myPrivateKey.pem
  6. 应用terraform配置后,只需以ssh -i myPrivateKey.pem ec2-user@<public-ip>的身份连接

您的ec2资源的Terraform配置看起来像

resource "aws_instance" "my-sample" {
  ami                         = "ami-xxxxx"
  instance_type               = "t2.micro"
  associate_public_ip_address = true
  key_name                    = "MyPrivateKey"
  vpc_security_group_ids      = ["sg-0f073685ght54lkm"]
}