在Terraform文档中使用remote exec进行实例设置,但在MacOS上不起作用。错误:超时

在Terraform文档中使用remote exec进行实例设置,但在MacOS上不起作用。错误:超时,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我一直在使用terraform文档来学习terraform,但是 在默认的5分钟后,我不断收到超时错误 aws_instance.example (remote-exec): Connecting to remote host via SSH... aws_instance.example (remote-exec): Host: 63.32.57.5 aws_instance.example (remote-exec): User: ec2-user aws_instance.exam

我一直在使用terraform文档来学习terraform,但是

在默认的5分钟后,我不断收到超时错误

aws_instance.example (remote-exec): Connecting to remote host via SSH...
aws_instance.example (remote-exec):   Host: 63.32.57.5
aws_instance.example (remote-exec):   User: ec2-user
aws_instance.example (remote-exec):   Password: false
aws_instance.example (remote-exec):   Private key: true
aws_instance.example (remote-exec):   Certificate: false
aws_instance.example (remote-exec):   SSH Agent: true
aws_instance.example (remote-exec):   Checking Host Key: false
aws_instance.example: Still creating... [5m10s elapsed]
aws_instance.example: Still creating... [5m20s elapsed]


Error: timeout - last error: dial tcp 63.32.57.5:22: i/o timeout
进入服务器的正常ssh返回超时

ssh -i ~/.ssh/terraform ec2-user@52.215.89.205
返回

ssh: connect to host 52.215.89.205 port 22: Operation timed out
很明显,问题在于安全组中不允许ssh。在terraform中,如何获得默认vpc

我在一些在线答案(例如)中发现,要消除此错误,我需要设置一个安全组,允许在端口22上进入ec2实例。但直到文档中的这一点,我们还没有创建或设置任何安全组、专有网络或子网

当然,在创建VPC后,您必须进行一些额外的配置,如创建自己的子网、路由表、弹性IP等

解决这个问题的简单方法是什么?我不能使用默认VPC的凭据,而不是创建新的VPC。如果这是可能的,那么如何实现呢

这是我的地形代码在文档中的这一点

provider "aws" {
  profile = "default"
  region  = "eu-west-1"
  version = "~> 2.49"
}

resource "aws_key_pair" "example" {
  key_name = "examplekey"
  public_key = file("~/.ssh/terraform.pub")
}

resource "aws_instance" "example" {
  key_name = aws_key_pair.example.key_name
  ami = "ami-0e61341fa75fcaa18"
  instance_type = "t2.micro"
  # vpc_security_group_ids = ["sg-0e8bcd72"]
  # subnet_id = "subnet-6f86e027"

  connection {
    type = "ssh"
    user = "ec2-user"
    private_key = file("~/.ssh/terraform")
    host = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "sudo amazon-linux-extras enable nginx1.12",
      "sudo yum -y install nginx",
      "sudo systemctl start nginx"
    ]
  }
}


resource "aws_eip" "ip" {
  vpc = true
  instance = aws_instance.example.id
}  

如何消除此超时错误

找到了添加安全组并允许从terraform脚本访问ec2实例的方法。此解决方案将允许对创建的ec2实例进行入口(入站)和出口(出站)访问

如果所有操作都成功运行,则当您在浏览器中访问所创建实例的公共IP时,应该会看到此页面

注意:请确保使用支持
AmazonLinuxExtras
的AMIforEC2实例,或将其添加到
RemoteExec
provisioner中的安装中

创建安全组 然后将其添加到aws_实例资源中,如下所示 我的完整地形代码现在如下所示:

provider "aws" {
  profile = "default"
  region  = "eu-west-1"
  version = "~> 2.49"
}

resource "aws_key_pair" "example" {
  key_name   = "examplekey"
  public_key = file("~/.ssh/terraform.pub")
}

resource "aws_security_group" "instance" {
  name = "terraform-example-instance"

  ingress {
    from_port   = 0
    to_port     = 8080
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "example" {
  key_name               = aws_key_pair.example.key_name
  ami                    = "ami-099a8245f5daa82bf"
  instance_type          = "t2.micro"
  vpc_security_group_ids = [aws_security_group.instance.id]
  # subnet_id = "subnet-6f86e027"

  # user_data = <<-EOF
  #             #!/bin/bash
  #             echo "Hello, World" > index.html
  #             nohup busybox httpd -f -p 8080 &
  #             EOF

  connection {
    type        = "ssh"
    user        = "ec2-user"
    private_key = file("~/.ssh/terraform")
    host        = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "sudo amazon-linux-extras enable nginx1.12",
      "sudo yum -y install nginx",
      "sudo systemctl start nginx"
    ]
  }

  tags = {
    Name = "terraform-example"
  }
}

resource "aws_eip" "ip" {
  vpc      = true
  instance = aws_instance.example.id
}
提供程序“aws”{
profile=“默认值”
region=“eu-west-1”
version=“~>2.49”
}
资源“aws\U密钥对”示例{
key\u name=“examplekey”
公钥=文件(“~/.ssh/terraform.pub”)
}
资源“aws\U安全组”实例{
name=“terraform示例实例”
入口{
从_端口=0
至_端口=8080
协议=“tcp”
cidr_块=[“0.0.0.0/0”]
}
出口{
从_端口=0
至_端口=0
协议=“-1”
cidr_块=[“0.0.0.0/0”]
}
}
资源“aws_实例”“示例”{
key\u name=aws\u key\u pair.example.key\u name
ami=“ami-099a8245f5daa82bf”
实例_type=“t2.micro”
vpc_security_group_id=[aws_security_group.instance.id]
#子网\u id=“子网-6f86e027”

#user_data=如果创建EC2实例(将使用TF创建)从控制台手动,然后尝试telnet到EC2实例的公共IP的端口22,你能从实例获得连接响应吗?或者ssh-i~/.ssh/terraform$EC2_publiic_IP如何?你能用ssh连接到吗?如果不能,那么没有必要尝试让TF脚本工作。谢谢,我现在就尝试一下,并用结果进行更新。还有请仔细检查“chmod 400~/.ssh/terraform”部分,EC2操作系统是Amazon Linux,可以使用“EC2用户”(我相信CentOS也是EC2用户)登录。啊,ssh命令是ssh-v-I~/.ssh/terraform EC2 user@${AWS控制台中的EC2公共ip}。老实说,如果目标是学习terraform,我将删除“连接”和“供应器”部分来保持简单。我没有亲自使用过它们,尽管它可能对测试目的很有用,以确保aws_实例脚本正常工作。稍后,一旦您熟悉Terraform,实现它们就会容易得多。是的,我只是在遵循文档,如果我不能通过此步骤,我将无法继续博士。
resource "aws_instance" "example" {
  key_name = aws_key_pair.example.key_name
  ami = "ami-0e61341fa75fcaa18"
  instance_type = "t2.micro"
  vpc_security_group_ids = [aws_security_group.instance.id]
  # subnet_id = "subnet-6f86e027"

  connection {
    type = "ssh"
    user = "ec2-user"
    private_key = file("~/.ssh/terraform")
    host = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "sudo amazon-linux-extras enable nginx1.12",
      "sudo yum -y install nginx",
      "sudo systemctl start nginx"
    ]
  }
}
provider "aws" {
  profile = "default"
  region  = "eu-west-1"
  version = "~> 2.49"
}

resource "aws_key_pair" "example" {
  key_name   = "examplekey"
  public_key = file("~/.ssh/terraform.pub")
}

resource "aws_security_group" "instance" {
  name = "terraform-example-instance"

  ingress {
    from_port   = 0
    to_port     = 8080
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "example" {
  key_name               = aws_key_pair.example.key_name
  ami                    = "ami-099a8245f5daa82bf"
  instance_type          = "t2.micro"
  vpc_security_group_ids = [aws_security_group.instance.id]
  # subnet_id = "subnet-6f86e027"

  # user_data = <<-EOF
  #             #!/bin/bash
  #             echo "Hello, World" > index.html
  #             nohup busybox httpd -f -p 8080 &
  #             EOF

  connection {
    type        = "ssh"
    user        = "ec2-user"
    private_key = file("~/.ssh/terraform")
    host        = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "sudo amazon-linux-extras enable nginx1.12",
      "sudo yum -y install nginx",
      "sudo systemctl start nginx"
    ]
  }

  tags = {
    Name = "terraform-example"
  }
}

resource "aws_eip" "ip" {
  vpc      = true
  instance = aws_instance.example.id
}