Ответ
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) и регионов, обеспечивая безопасность, отказоустойчивость и соответствие стандартам компании.