Предоставление экземпляра с удаленным exe c в документах Terraform, не работающих на MacOS. Ошибка: тайм-аут - PullRequest
0 голосов
/ 18 февраля 2020

Я использовал документацию terraform для изучения terraform, но Я застрял на этом этапе, где мне нужно S SH в экземпляр ec2.

I ' m постоянно получает сообщение об ошибке по истечении 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

normal s sh на сервере возвращает время ожидания.

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

возвращает

ssh: connect to host 52.215.89.205 port 22: Operation timed out

очевидно, что проблема в том, что s sh не разрешен в группе безопасности. В terraform, как вы получаете по умолчанию vp c?

Я нашел в некоторых онлайн-ответах (например, здесь ), что для устранения этой ошибки go мне нужно настроить группа безопасности, которая позволяет входить через порт 22 в экземпляр ec2. Но до этого момента в документации мы не создавали и не настраивали какую-либо группу безопасности, VP C или su bnet.

Я также пытался изучить дальнейшую документацию, чтобы попытаться создать свою собственную группу безопасности. Вот где я узнал, что группа безопасности также зависит от создания ресурса VP C. И, конечно же, после создания VP C вам придется выполнить некоторые дополнительные настройки, такие как создание собственного su bnet. , таблица маршрутизации, эласт c IP, эт c.

Какой самый простой способ это исправить? Вместо создания нового VP C, я не могу использовать учетные данные по умолчанию VP C. Если это возможно, то как?

Вот мой код terraform до этого момента в do c.

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
}  

Как я могу сделать эту ошибку тайм-аута go прочь?

1 Ответ

0 голосов
/ 18 февраля 2020

Найден способ добавить группу безопасности и разрешить доступ к экземпляру ec2 из скрипта terraform. Это решение разрешит входящий (входящий) и выходной (исходящий) доступ к созданному экземпляру ec2.

Если все работает успешно, вы должны увидеть эту страницу при посещении общедоступного c IP созданного экземпляра в Ваш браузер.

enter image description here

Примечание: убедитесь, что вы используете экземпляр ami для EC2, который поддерживает amazon-linux-extras, или добавьте его в установку в remote-exec provisioner

Создать группу безопасности

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

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

И затем добавить ее к ресурсу aws_instance, например, так:

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"
    ]
  }
}

Мой полный код terraform теперь выглядит следующим образом:

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
}

Решением группы безопасности является отрывок из: Евгений Брикман. «Terraform: Up & Running, 2-е издание». Apple Books.

...