我想知道如何在错误消息中停止无限循环,以便它创建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
答案 0 :(得分:1)
如果要在使用Terraform创建EC2实例时将其附加到EC2实例,则需要首先在AWS控制台上创建一个密钥,下载.pem
文件,然后将密钥对名称复制到剪贴板。
Terraform脚本需要正确的密钥名称才能将其关联到ec2实例。
如果要从Terraform对实例执行任何远程操作,则需要执行以下操作。
所以连接是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,则它会显示以下消息。
如果由于某些其他错误或权限问题而导致执行命令失败,您可能仍然会看到错误。但是,如果您看到上述消息,则表示该地形已成功连接到实例。
这是terraform配置,它将创建ec2实例,通过SSH连接到该实例,并在其上执行远程执行任务。
.pem
文件还可用于在本地计算机上的实例上执行SSH。
这应该可以帮助您解决问题。
有关在地形中连接的更多信息,here
答案 1 :(得分:1)
以下内容对我有用,
chmod 400 myPrivateKey.pem
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"]
}