Что такое VPC (Virtual Private Cloud)?

«Что такое VPC (Virtual Private Cloud)?» — вопрос из категории Облачные платформы, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

VPC (Virtual Private Cloud) — это фундаментальный сетевой строительный блок в облачных провайдерах (AWS, GCP, Azure), который позволяет создавать логически изолированные секции облака для развертывания ресурсов. С точки зрения DevOps, VPC — это программно-определяемая сеть, которой мы управляем как кодом.

Ключевые компоненты и их назначение в DevOps:

  • CIDR-блок: Определяет диапазон приватных IP-адресов для всей VPC (например, 10.0.0.0/16).
  • Подсети (Subnets): Логическое разделение VPC на сегменты, часто по зонам доступности (AZ) и назначению (публичные/приватные).
    • Публичные подсети: Имеют маршрут напрямую в Интернет через Internet Gateway (IGW). Размещаем балансировщики нагрузки, bastion-хосты.
    • Приватные подсеты: Не имеют прямого выхода в Интернет. Размещаем серверы приложений, базы данных. Выход в сеть — через NAT Gateway в публичной подсети.
  • Таблицы маршрутизации (Route Tables): Контролируют, куда направляется трафик из подсети.
  • Шлюзы (Gateways):
    • Internet Gateway (IGW): Для доступа в публичный Интернет.
    • NAT Gateway: Позволяет ресурсам в приватных подсетях инициировать исходящие соединения в Интернет (для обновлений, вызовов API), но блокирует входящие.
    • VPN Gateway / Direct Connect: Для гибридной архитектуры, соединения с локальным дата-центром.
  • Меры безопасности:
    • Security Groups (SG): Stateful-файрвол на уровне ресурса (EC2, RDS).
    • Network ACLs (NACL): Stateless-файрвол на уровне подсети, дополнительный уровень контроля.

Пример инфраструктуры как кода (Terraform) для базовой VPC:

# main.tf
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  tags = { Name = "prod-vpc" }
}

resource "aws_subnet" "public" {
  count             = 2
  vpc_id            = aws_vpc.main.id
  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index) # 10.0.0.0/24, 10.0.1.0/24
  availability_zone = data.aws_availability_zones.available.names[count.index]
  map_public_ip_on_launch = true
  tags = { Name = "public-subnet-${count.index}", Tier = "public" }
}

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id
  tags = { Name = "main-igw" }
}

resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.igw.id
  }
  tags = { Name = "public-rt" }
}

resource "aws_route_table_association" "public" {
  count          = length(aws_subnet.public)
  subnet_id      = aws_subnet.public[count.index].id
  route_table_id = aws_route_table.public.id
}

В моих проектах мы используем модульный подход к созданию VPC, чтобы тиражировать одинаковую сетевую топологию для разных сред (dev/staging/prod) и регионов, обеспечивая безопасность, отказоустойчивость и соответствие стандартам компании.