NAT Instance. Часть 1 – Subnets

Развертывание большинства сервисов в AWS начинается с настройки VPC. В большинстве своем это достаточно простая операция, но все же встречаются некоторые нюансы, о которых и поговорим в этой и последующих статьях. Конечная цель – сконфигурировать работающую сеть с публичными и частными подсетями и выходом в интернет через NAT Instance. Кроме того, не помешает лишняя отказоустойчивость на основе Auto Scaling group. Описывать инфраструктуру планируется из кода, используя Terraform.


UPD 22.09.2021: А вот и вторая статья – NAT Instance. Часть 2 — Auto Scaling group


NAT Instance. Часть 1 – Subnets

Сначала как всегда немного теории. Дело в том, что у AWS есть как минимум три сущности, так или иначе связанные с маршрутизацией трафика между сетями VPC и внешним миром. Речь идет про NAT Instance 1, NAT Gateway 2 и Internet Gateway 3.

С последним все просто – этот объект используется для маршрутизации интернет-трафика и трансляции адресов для тех EC2-инстансов, к которым прикреплен публичный адрес.

Примечание: говоря другими словами, мало, чтобы к EC2-инстансу был прикреплен публичный адрес и он находился в публичной подсети, должен быть ещё и маршрут до Internet Gateway, ведь публичные адреса не назначаются напрямую на интерфейс виртуальной машины и при выполнении изнутри ОС команды ip a вы их не увидите.

Между NAT Instance и NAT Gateway есть существенные различия 4, хоть и выполняют они одну и ту же функцию. NAT Gateway представляет из себя отказоустойчивый шлюз, управляемый полностью со стороны AWS. А NAT Instance по сути является его дешевой заменой – это обычный EC2-инстанс, для которого Амазон готовит специальный AMI 5.

Подготовка окружения

Окружение представляет из себя обычную линукс-машину с предустановленным Terraform. Проект имеет следующую структуру каталогов:

NAT Instance img 01

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

Переменные

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

Небольшие пояснения, если вдруг решите, что значения по умолчанию вам не подходят:

1. Вам нужно выбрать сеть и нарезать её на подсети в любой корректной конфигурации.

Примечание: в интернете широко представлены онлайн-калькуляторы для расчета подсетей, например https://www.calculator.net/ip-subnet-calculator.html .

2. Имена и количество зон доступности – Availability zones – будут отличаться в зависимости от региона.

3. Как я упоминал выше, для Nat Instance нужен свой специальный образ AMI. Найти их можно по префиксу amzn-ami-vpc-nat в имени. Не забудьте подобрать наиболее подходящий под ваши нужды тип EC2-инстанса, ведь пропускная способность сетевого интерфейса зависит от этого напрямую.

Переходим к следующему пункту.

Terraform

Теперь пришло время позаботиться об окружении и настройках провайдера, а это файл terraform.tf:

Конфигурация актуальна на момент написания статьи и в будущем устареет, обратите на это внимание.

Настройка подсетей

Переходим к описанию непосредственно самой инфраструктуры. Содержимое файла vpc.tf включает в себя ресурсы для создания подсетей, маршрутов и других объектов:

Дополнительные опции ресурса aws_vpc активируют разрешение имен со стороны Route 53 и автоматическое назначение ДНС-имен внешним и внутренним адресам интерфейсов соответственно 6 7.

Примечание: enable_dns_support и так по умолчанию имеет значение true, тут оно указано для наглядности. А вот enable_dns_hostnames по умолчанию false. Эта опция активирует автоматическое создание внутренних и внешних технических имен для частных и публичных адресов ipv4 соответственно (но не для ipv6). Больше информации в официальных документах – DNS support for your VPC.

Как я и упоминал ранее, EC2-инстансам из публичных сетей для выхода в интернет нужен маршрут до Internet Gateway. Ресурс aws_internet_gateway создает этот объект, а aws_route_table маршрут наружу по умолчанию.

Примечание: Count в данном случае является своеобразной реализацией псевдоциклов – The count Meta-Argument.

С частными подсетями все интереснее, а потому для них отдельная глава ниже.

Частные подсети

Отличаются от публичных они тем, что из них напрямую в интернет выйти не получится, только с использованием сетевой трансляции адресов – NAT. Эту функцию у нас будет выполнять отдельный EC2-инстанс. Это в некотором смысле “велосипед”, хоть и официально поддерживаемый со стороны AWS.

Примечание: велосипед потому, что вам самим придется думать об отказоустойчивости, надежности, пропускной способности и других моментах, но стоит NAT Instance разумеется дешевле. Тем не менее вы можете в любой момент перейти на NAT Gateway. Что больше вам подходит, решайте сами, а поможет в этом документация – Compare NAT gateways and NAT instances.

Основной параметр здесь это network_interface_id, который указывает на идентификатор сетевого интерфейса NAT-инстанса. Хитрость в том, что ASG будет пересоздавать сам EC2-инстанс, а вот интерфейс, заранее созданный нами (в следующей статье), будет оставаться всегда одним и тем же. Тем самым у нас не будет необходимости переделывать маршрут каждый раз при пересоздании EC2-инстанса.

Секция lifecycle с параметром ignore_changes у ресурса aws_route_table служит здесь для того, чтобы не пересоздавать EC2-инстанс, если вдруг он ранее уже был автоматически пересоздан autoscaling-группой (далее ASG).

Происходит это потому, что к объекту aws_route_table, помимо индекса интерфейса, привязывается также и идентификатор инстанса – instance_id. Если инстанс в будущем будет пересоздан, а произойти это может например по причине его неисправности, то и instance_id будет другой. В следующий раз при выполнении команды terraform plan это повлечет за собой изменение объекта (обратите внимание, что объект route пересоздается с одним изменением):

Эта проблема красиво решается игнорированием секции route у ресурса aws_route_table.

На это сегодня все. Ну а самым интересным – конфигурацией ASG – займемся уже в следующей статье.

Яндекс.Метрика