Итоговый проект — инфраструктура учебного сервиса кодом

Стенд, который любой в команде поднимает с нуля одной командой и удаляет, не оставив ни одного тома

Прогресс курса Модуль 9 из 9

Что покажет проект

01

Постановка

Сервису цен нужны два стенда — dev и prod. Каждый поднимается из пустого Docker одной командой terraform apply в каталоге окружения:

  127.0.0.1:PORT ─▶ price-ENV-proxy   nginx: балансировщик, единственный опубликованный порт
                        ├─▶ price-ENV-app-1 ┐  экземпляры приложения: страница
                        └─▶ price-ENV-app-N ┘  «Сервис цен ВЕРСИЯ, экземпляр …, база …»
                    price-ENV-db      PostgreSQL 17, данные на томе
                    сеть price-ENV-net — все контейнеры

Различия окружений: в dev один экземпляр и порт 8080, в prod — два экземпляра и 8090. Новая версия сервиса — правка одной переменной; балансировщик при этом не пересоздаётся и сам находит новые экземпляры.

02

Что должно получиться

ТребованиеМодуль
Версии Terraform и провайдеров в required_version и required_providers каждого модуля; .terraform.lock.hcl в репозитории; .gitignore01, 02, 06, 08
Модули app, postgres, proxy: переменные с типами, описаниями и validation, выходы, README04, 06
Пароль базы не в коде и не в tfvars: генерируется или приходит из TF_VAR_; выход со строкой подключения — sensitive04, 05
Экземпляры приложения — for_each по именам, их число — переменная окружения с проверкой07
Конфигурация балансировщика из шаблона templatefile со списком экземпляров04, 07
Наружу опубликован только порт балансировщика, и только на 127.0.0.102
Окружения — каталоги envs/dev и envs/prod; состояние — backend pg, у каждого окружения своя схема; строка подключения не в коде05, 08
Повторный plan после apply — без изменений03
Тесты terraform test хотя бы для двух модулей: проверка результата и отказ на неверном значении08
Тот же код работает в OpenTofu01

Порядок работы

  • Сначала всё в одном каталоге с локальным состоянием: сеть, база, один экземпляр, балансировщик. Добейтесь, чтобы страница открывалась, а повторный план был пустым.
  • Разнесите код по модулям. Чтобы не пересоздавать ресурсы, перенесите адреса блоками moved — план после переноса должен быть пустым.
  • Сделайте число экземпляров переменной и for_each; проверьте, что удаление одного экземпляра не трогает остальные.
  • Заведите envs/dev и envs/prod, перенесите состояние в PostgreSQL (init -migrate-state).
  • Напишите тесты модулей, выпустите версию 1.1.0 и проверьте, что балансировщик отдаёт новую страницу. Удалите оба стенда и убедитесь, что не осталось ни контейнеров, ни томов.
nginx определяет адреса серверов upstream один раз при запуске, и после пересоздания экземпляров балансировщик будет ходить по старым адресам. Начиная с nginx 1.27.3 у server в upstream есть параметр resolve: вместе с директивой resolver 127.0.0.11 (DNS Docker) и zone в блоке upstream адреса обновляются сами. Чтобы apply завершался, когда сервис уже отвечает, у контейнеров есть healthcheck и аргумент wait = true.

Подробные требования, что сдаётся и критерии оценивания — в задании на портале.

Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.

Курс пройден

Вы прошли курс «Основы Terraform». Дальше — «Основы Ansible» (настраивать то, что создал Terraform), «Основы CI/CD» (plan в merge request и apply по кнопке) и «Kubernetes».

Модуль 08: Terraform в команде Все модули Все курсы