Сеть
Добавляем в :
## Public subnet resource "aws_subnet" "aws-subnet-public" { vpc_id = "${aws_vpc.MyVPC.id}" cidr_block = "${var.vpc_cidr_public}" availability_zone = "${var.aws_region}a" tags = { Name = "Public subnet" } } ## Private subnet resource "aws_subnet" "aws-subnet-private" { vpc_id = "${aws_vpc.MyVPC.id}" cidr_block = "${var.vpc_cidr_private}" availability_zone = "${var.aws_region}b" tags = { Name = "Private subnet" } }
Тут переменных немного больше, но они практически все понятны. Опишу не самые очевидные вещи:
availability_zone — зона доступности от региона отличается наличием индекса (a, b и т.п.)
После этого можно применить изменения и посмотреть, что будет:
$ terraform apply -var-file=terraform.tfvars
Роутинг
Здесь будет немного сложнее понять, но я надеюсь, что вы разберетесь.
Создаем файл с такими блоками:
## Default route to Internet resource "aws_route" "internet_access" { route_table_id = "${aws_vpc.MyVPC.main_route_table_id}" destination_cidr_block = "0.0.0.0/0" gateway_id = "${aws_internet_gateway.gateway.id}" } ## Routing table resource "aws_route_table" "private_route_table" { vpc_id = "${aws_vpc.MyVPC.id}" tags { Name = "Private route table" } } resource "aws_route" "private_route" { route_table_id = "${aws_route_table.private_route_table.id}" destination_cidr_block = "0.0.0.0/0" nat_gateway_id = "${aws_nat_gateway.gateway.id}" } resource "aws_route_table" "public" { vpc_id = "${aws_vpc.MyVPC.id}" tags { Name = "Public route table" } route { cidr_block = "0.0.0.0/0" gateway_id = "${aws_internet_gateway.gateway.id}" } } ## Route tables associations # Associate subnet public_subnet to public route table resource "aws_route_table_association" "public_subnet_association" { subnet_id = "${aws_subnet.aws-subnet-public.id}" route_table_id = "${aws_vpc.MyVPC.main_route_table_id}" } # Associate subnet private_subnet to private route table resource "aws_route_table_association" "private_subnet_association" { subnet_id = "${aws_subnet.aws-subnet-private.id}" route_table_id = "${aws_route_table.private_route_table.id}" }
Я предупреждал, что тут немного более запутано, но те, кто хорошо знает сети и маршрутизацию — легко заметит, что сначала мы создаем маршрут по умолчанию в таблице маршрутизации по умолчанию.
Дальше мы создаем внутреннюю таблицу маршрутизации и маршруты для приватной и публичной частей сети.
И наконец мы делаем привязку подсетей и таблиц маршрутизации.
Мой вам совет — перечитайте и нарисуйте связи на листе бумаги. Так будет проще понять. Расписывать подробно я тут не буду, оставлю это вам для домашнего задания.
Применяем, как мы делали это раньше.
Чтоб уничтожить все созданные ресурсы надо сделать :
$ terraform destroy -var-file=terraform.tfvars
Исходники, как всегда, на GitHub.
Гейт в большой Интернет
Добавляем в :
## Internet gateway resource "aws_internet_gateway" "gateway" { vpc_id = "${aws_vpc.MyVPC.id}" } ## Elastic IP for NAT GW resource "aws_eip" "eip" { vpc = true depends_on = } ## NAT gateway resource "aws_nat_gateway" "gateway" { allocation_id = "${aws_eip.eip.id}" subnet_id = "${aws_subnet.aws-subnet-public.id}" depends_on = } output "NAT_GW_IP" { value = "${aws_eip.eip.public_ip}" }
Итак, что тут происходит. Пройдем по блокам.
- первый блок создает тот самый виртуальный шлюз в интернет внутри VPC
- второй блок резервирует статический внешний IP адрес, чтоб наши сервера выходили в интернет всегда с одного адреса
- третий блок создает NAT шлюз, который будет NAT’ить исходящие соединения (идет привязка к публичной подсети и внешнему IP, он будет создан только после интернет шлюза из первого блока, о чем говорится в )
- четвертый блок известен уже из прошлой статьи — вывод IP адреса для шлюза
Почти закончили. Остается настроить таблицы маршрутизации.
Настройка
Приступим к конфигурации VPC.
В файл добавляем блоки IP адресов, которые мы будем использовать внутри нашей VPC:
variable "vpc_cidr" { description = "CIDR for the whole VPC" default = "172.20.0.0/16" } variable "vpc_cidr_public" { description = "CIDR for the Public subnet" default = "172.20.0.0/24" } variable "vpc_cidr_private" { description = "CIDR for the Private subnet" default = "172.20.1.0/24" }
- vpc_cidr — это блок для использования внутри всей VPC
- vpc_cidr_public — блок для публичных сервисов (например, для ssh proxy AKA bastion host или балансировщика)
- vpc_cidr_private — это блок для внутренних сервисов (например сервер БД или воркеры с приложениями)
Создаем файл с содержимым:
resource "aws_vpc" "MyVPC" { cidr_block = "${var.vpc_cidr}" enable_dns_hostnames = true tags { Name = "TF:VPC", Owner = "", Environment = "Production", Description = "Custom VPC" } }
В cidr_block мы указываем переменную из vpc_cidr.
Ну и тэги — очень удобный инструмент для работы и выборки через АПИ нужных ресурсов.
Теперь нам необходимо описать конфигурацию сети и доступ в интернет из нашего VPC.