Как запустить несколько инстансов AWS EC2 из одного VPC с помощью Terraform?

Можно ли запустить несколько экземпляров ec2 из terraform с помощью одного VPC? Я создаю что-то, что требует запуска нескольких экземпляров из одного региона, и все это я делаю с помощью Terraform. Но в AWS VPC есть ограничение: на регион разрешено только 5 VPC. Что я делал до сих пор, так это то, что каждый раз, когда мне нужно запустить инстанс, я создаю для него отдельный VPC в terraform. Ниже приведен код для справки:

      terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}
# Configure the AWS Provider
provider "aws" {
  region = "us-east-2"
  access_key = "XXXXXXXXXXXXXXXXX"
  secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

# 1. Create vpc

resource "aws_vpc" "prod-vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "production"
  }
}

# 2. Create Internet Gateway

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.prod-vpc.id


}

# 3. Create Custom Route Table

resource "aws_route_table" "prod-route-table" {
  vpc_id = aws_vpc.prod-vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.gw.id
  }

  route {
    ipv6_cidr_block = "::/0"
    gateway_id      = aws_internet_gateway.gw.id
  }

  tags = {
    Name = "Prod"
  }
}

# 4. Create a Subnet

resource "aws_subnet" "subnet-1" {
  vpc_id            = aws_vpc.prod-vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-2a"

  tags = {
    Name = "prod-subnet"
  }
}

# 5. Associate subnet with Route Table

resource "aws_route_table_association" "a" {
  subnet_id      = aws_subnet.subnet-1.id
  route_table_id = aws_route_table.prod-route-table.id
}

# 6. Create Security Group to allow port 22,80,443

resource "aws_security_group" "allow_web" {
  name        = "allow_web_traffic"
  description = "Allow Web inbound traffic"
  vpc_id      = aws_vpc.prod-vpc.id

  ingress {
    description = "HTTPS"
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
    ingress {
    description = "self"
    from_port   = 8000
    to_port     = 8000
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    description = "HTTP"
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    description = "SSH"
    from_port   = 22
    to_port     = 22
    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"]
  }

  tags = {
    Name = "allow_web"
  }
}

# 7. Create a network interface with an ip in the subnet that was created in step 4

resource "aws_network_interface" "web-server-nic" {
  subnet_id       = aws_subnet.subnet-1.id
  private_ips     = ["10.0.1.50"]
  security_groups = [aws_security_group.allow_web.id]

}

# 8. Assign an elastic IP to the network interface created in step 7

resource "aws_eip" "one" {
  vpc                       = true
  network_interface         = aws_network_interface.web-server-nic.id
  associate_with_private_ip = "10.0.1.50"
  depends_on                = [aws_internet_gateway.gw]
}

output "server_public_ip" {
  value = aws_eip.one.public_ip
}

# 9. Create Ubuntu server and install/enable apache2

resource "aws_instance" "web-server-instance" {
  ami               = var.AMI_ID
  instance_type     = "g4dn.xlarge"
  availability_zone = "us-east-2a"
  key_name          = "us-east-2"
  network_interface {
    device_index         = 0
    network_interface_id = aws_network_interface.web-server-nic.id
  }
  root_block_device {
    volume_size = "200"
  }
  iam_instance_profile = aws_iam_instance_profile.training_profile.name
  depends_on = [aws_eip.one]
  user_data = <<-EOF
                #!/bin/bash
                python3 /home/ubuntu/setting_instance.py
                EOF
  tags = {
    Name = var.INSTANCE_NAME
  }
}

Единственным недостатком этого кода является то, что он создает отдельный VPC каждый раз, когда я создаю экземпляр. Я прочитал в сообщении stackoverflow , что мы можем импортировать существующий VPC, используякоманда. Наряду с VPC мне также пришлось импортировать интернет-шлюз и таблицу маршрутов (иначе выдавало ошибку). Но тогда я не смог получить доступ к экземпляру с помощью SSH, а также команды в части user_data не выполнялись (setting_instance.py отправит уведомление Firebase после запуска экземпляра. Это единственная цель settings_instance.py)

Не только VPC. Я также хотел бы знать, могу ли я использовать другие ресурсы в максимально возможной степени.

Я новичок в терраформировании и AWS. Любые предложения в приведенном выше коде приветствуются.

РЕДАКТИРОВАТЬ: Экземпляры создаются по одному в соответствии с необходимостью, т.е. всякий раз, когда возникает необходимость создать новый экземпляр, я использую этот код. В текущем сценарии, если в регионе уже запущено 5 экземпляров, я не смогу использовать этот код для создания 6-го экземпляра в том же регионе, когда возникнет потребность.

1 ответ

Если, как вы говорите, они будут точно такими же, проще всего будет использовать count, который укажет, сколько экземпляров вы хотите иметь. Для этого вы можете ввести новую переменную:

      variable "number_of_instance" {
  default = 1
}

а потом

      
resource "aws_instance" "web-server-instance" {

  count = var.number_of_instance

  ami               = var.AMI_ID
  instance_type     = "g4dn.xlarge"
  availability_zone = "us-east-2a"
  key_name          = "us-east-2"
  network_interface {
    device_index         = 0
    network_interface_id = aws_network_interface.web-server-nic.id
  }
  root_block_device {
    volume_size = "200"
  }
  iam_instance_profile = aws_iam_instance_profile.training_profile.name
  depends_on = [aws_eip.one]
  user_data = <<-EOF
                #!/bin/bash
                python3 /home/ubuntu/setting_instance.py
                EOF
  tags = {
    Name = var.INSTANCE_NAME
  }
}

Все это должно управляться одним и тем же файлом состояния, а не полностью отдельными файлами состояния, иначе вы снова получите дубликаты VPC. Вы меняете толькоnumber_of_instanceк тому, что вы хотите. Для более устойчивого решения вам придется использовать группу автоматического масштабирования для экземпляров.

Другие вопросы по тегам