• DevOps
  • Защита информации
  • ИТ-поддержка
  • Создание виртуальной сети через terraform

    Виртуальная сеть у каждого из облачных провайдеров (AWS, AZURE , GCP) настраивается по-разному, но принцип очень похож. Мы рассмотрим создание виртуальной сети на основе Amazon VPC.

    Amazon Virtual Private Cloud – это логически изолированный раздел облака AWS, в котором можно запускать ресурсы AWS в созданной пользователем виртуальной сети. Полностью можно контролировать свою среду виртуальной сети: выбирать собственный диапазон IP-адресов, создавать подсети, настраивать таблицы маршрутизации и сетевые шлюзы.

    Создаем файл variables.tf. В нем мы прописываем наши переменные:

    variable "aws_region" {
      default = "eu-central-1"
    }
    
    variable "vpc_cidr" {
        description = " all subnets”
        default = "10.20.0.0/16"
    }
    
    
    variable "vpc_cidr_public" {
        description = "Public subnet"
        default = "10.20.0.0/24"
    }
    
    variable "vpc_cidr_private" {
        description =  “Private subnet"
        default = "10.20.1.0/24"
    }
    

    aws_region - регион где будут находится сети.

    vpc_cidr - это все адреса, которые мы можем использовать в нашей VPC.

    vpc_cidr_public - подсеть для публичных сервисов (ssh-jump, proxy, балансировщик).

    vpc_cidr_private - подсеть для внутренних сервисов (воркеров, БД и т.п.).

    Создаем файл vpc.tf и вписываем следующий код:

    resource "aws_vpc" "DemoVPC" {
        cidr_block           = var.vpc_cidr
        enable_dns_hostnames = true
        tags {
            Name        = "DemoVPC",
             }
    }
    

    В cidr_block мы указываем переменную из variables.tf vpc_cidr.

    Далее описываем конфигурацию сети для доступа из сети интернет, а также между сетями. Добавляем далее:

    ## Public 
    resource "aws_subnet" "demo-subnet-public" {
      vpc_id            = aws_vpc.DemoVPC.id
      cidr_block        = var.vpc_cidr_public
      availability_zone = var.aws_region}a"
      tags = {
        Name            = "Public network"
      }
    }
    
    
    ## Private 
    resource "aws_subnet" "demo-subnet-private" {
      vpc_id            = aws_vpc.DemoVPC.id
      cidr_block        = var.vpc_cidr_private
      availability_zone = var.aws_region}b"
      tags = {
        Name            = "Private network"
      }
    }
    

    Здесь мы создаем две подсети demo-subnet-public и demo-subnet-private в зонах доступности a и b нашего региона.

    Создадим шлюз:

    #Internet  GW
    resource "aws_internet_gateway" "DemoGW" {
        vpc_id = aws_vpc.DemoVPC.id
    }
    
    
    #Elastic IP for GW
    resource "aws_eip" "DemoEIP" {
      vpc        = true
      depends_on = ["aws_internet_gateway.DemoGW"]
    }
    
    
    #NAT gateway
    resource "aws_nat_gateway" "DemoNatGW" {
        allocation_id = aws_eip.DemoEIP.id
        subnet_id     = aws_subnet.demo-subnet-public.id
        depends_on    = ["aws_internet_gateway.DemoGW"]
    }
    #Output 
    output "GW_IP" {
      value = aws_eip.DemoEIP.public_ip
    }
    
    • Раздел #Internet GW создает виртуальный шлюз в интернет внутри VPC.
    • Раздел #Elastic IP for GW резервирует статический внешний IP-адрес. Это позволит выходить всем нашим внутренним сервисам через один внешний IP.
    • В разделе #NAT gateway создаем NAT-шлюз, который будет NAT-ить исходящие соединения. Привязка depends_on указывает на то, что он будет создан только после того, как создастся интернет-шлюз.
    • Раздел #Output используется для вывода ip-адреса.

    Вставляем следующий код:

    #Default route to Internet
    resource "aws_route" "internet_access" {
      route_table_id         = aws_vpc.DemoVPC.main_route_table_id
      destination_cidr_block = "0.0.0.0/0"
      gateway_id             = aws_internet_gateway.DemoGW.id
    }
    
    #Routing table for private subnet
    resource "aws_route_table" "private" {
        vpc_id   = aws_vpc.DemoVPC.id
    }
    
    resource "aws_route" "private_route" {
        route_table_id  = aws_route_table.private.id
        destination_cidr_block = "0.0.0.0/0"
        nat_gateway_id = aws_nat_gateway.DemoNatGW.id
    }
    
    #Routing table for public subnet
    resource "aws_route_table" "public" {
      vpc_id = aws_vpc.DemoVPC.id
     
      route {
            cidr_block = "0.0.0.0/0"
            gateway_id = aws_internet_gateway.DemoGW.id
        }
    }
    
    
    
    #Associate  public subnet to public route table
    resource "aws_route_table_association" "public_subnet_association" 
    {
        subnet_id = aws_subnet.demo-subnet-public.id
        route_table_id = aws_vpc.DemoVPC.main_route_table_id
    }
    
    #Associate  private subnet to private route table
    resource "aws_route_table_association" "private_subnet_association" {
        subnet_id = aws_subnet.demo-subnet-private.id
        route_table_id = aws_route_table.private_route_table.id
    }
    
    • В блоке #Default route to Internet создаем маршрут по умолчанию в таблице маршрутизации по умолчанию.
    • В блоке #Routing table for private subnet создаем внутреннюю таблицу маршрутизации и маршруты для приватной сети.
    • В блоке #Routing table for public subnet создаем внутреннюю таблицу маршрутизации и маршруты для публичной сети.
    • В блоке #Associate public subnet to public route table делаем привязку подсетей и таблиц маршрутизации для публичной сети.
    • В блоке #Associate private subnet to private route table делаем привязку подсетей и таблиц маршрутизации для частной сети.

    На этом подготовка конфигурации закончена. Далее необходимо выполнить #terraform plan и #terraform apply из консоли в папке проекта.

    После выполнения - в аккаунте AWS будет создана новая VPC с подсетями, которые мы указали.

    Нужно администрирование сервисов AWS? Обращайтесь к нам!

    Не нашли ответа на свой вопрос?
    Содержание