diff --git a/00_manifest.csv b/00_manifest.csv index 8c7f7b7..7cbd0f4 100644 --- a/00_manifest.csv +++ b/00_manifest.csv @@ -84,4 +84,22 @@ VKC_PR_M05_03_packer_log_РемизовКЛ_20260616.log,EVIDENCE,M05,03,Лог VKC_PR_M05_03_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,CODE,M05,03,Конфигурация Packer,03_code/VKC_PR_M05_03_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final, VKC_PR_M05_03_packer_curl_РемизовКЛ_20260616.png,EVIDENCE,M05,03,Проверка работы nginx через curl на тестовой ВМ,02_evidence/VKC_PR_M05_03_packer_curl_РемизовКЛ_20260616.png,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final, VKC_PR_M05_03_packer_image_РемизовКЛ_20260616.png,EVIDENCE,M05,03,Созданный образ Packer в списке образов VK Cloud,02_evidence/VKC_PR_M05_03_packer_image_РемизовКЛ_20260616.png,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final, +VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,REPORT,LR_02,main,Автоматизация с Terraform и Packer,01_reports/VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,,final, +VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png,EVIDENCE,LR_02,main,Проверка работы балансировщика,02_evidence/VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png,EVIDENCE,LR_02,main,Топология сети,02_evidence/VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог сборки Packer,02_evidence/VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png,EVIDENCE,LR_02,main,Образ созданный Packer,02_evidence/VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог подключения к S3 бэкенду,02_evidence/VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог Terraform apply (часть 1),02_evidence/VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог Terraform apply (часть 2),02_evidence/VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform backend S3,03_code/VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform вычислительные ресурсы,03_code/VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform управляемая БД,03_code/VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform балансировщик,03_code/VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform сеть,03_code/VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform выходные переменные,03_code/VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,CODE,LR_02,main,Конфигурация Packer,03_code/VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,,final, +VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform провайдер,03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform Security Groups,03_code/VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf,,final, +VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform переменные,03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf,,final, 00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final, diff --git a/01_reports/VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md b/01_reports/VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md new file mode 100644 index 0000000..a3244d7 --- /dev/null +++ b/01_reports/VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md @@ -0,0 +1,439 @@ +--- +course_code: VKCLOUD-80 +artifact_type: LR +lab_code: 2 +lab_title: Автоматизация с Terraform и Packer +student_fio: Ремизов Кирилл Львович +date: 2026-06-17 +source_docs: + - 5-Задания для лабораторных работ -VK-1.md + - 3-Конспект лекций - VK 1.md +attached_files: + - VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png + - VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log + - VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl + - VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png + - VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png + - VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log + - VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log + - VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log + - VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf + - VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf +estimated_cost_rub: 120 +status: final +--- + +# Отчет по лабораторной работе №2 + +## 1. Цель работы + +Автоматизировать развертывание отказоустойчивой веб-инфраструктуры (из лабораторной работы №1) с использованием **Infrastructure as Code (Terraform)** и **автоматизированной сборки образов (Packer)**. Основные задачи: + +- Создать кастомизированный образ веб-сервера с предустановленным nginx с помощью Packer. +- Описать всю инфраструктуру (VPC, подсети, Security Groups, виртуальные машины, балансировщик, управляемую БД) в Terraform. +- Настроить удалённое хранение state-файла в S3 для командной работы. + +## 2. Используемые ресурсы + +| Ресурс | Тип | Параметры | Назначение | +|--------|-----|-----------|-------------| +| VPC `lab1-vpc` | Virtual Private Cloud | CIDR: 10.0.0.0/16 | Изолированная сеть | +| Публичная подсеть `lab1-public` | Subnet | CIDR: 10.0.1.0/24, доступ через интернет-шлюз | Размещение бастиона и балансировщика | +| Приватная подсеть `lab1-private` | Subnet | CIDR: 10.0.2.0/24, выход в интернет через NAT | Размещение веб-серверов и БД | +| Бастионный хост `bastion` | ВМ (Ubuntu 22.04) | Флейвор `df3c499a-...`, публичный IP | Единственная точка SSH-доступа | +| Веб-серверы `web-1`, `web-2` | ВМ (кастомный образ Packer) | Флейвор `25ae869c-...`, приватные IP 10.0.2.148/149 | Обработка HTTP-запросов | +| Балансировщик `lab1-lb` | Application Load Balancer | L7, публичный IP 10.0.1.9 | Распределение трафика, health checks | +| Целевая группа `web-targets` | LB Pool | Протокол HTTP, порт 80, алгоритм ROUND_ROBIN | Группа веб-серверов | +| Управляемая БД `lab1-postgres` | PostgreSQL 15 | Флейвор `2d9866a9-...`, диск 10 ГБ, приватная сеть | Хранение данных приложения | +| Бакет S3 `terraform-state-lab2` | Object Storage | Стандартный класс | Хранение remote state Terraform | +| Security Groups | `bastion-sg`, `web-sg`, `lb-sg` | Правила доступа по принципу минимальных привилегий | Сетевая изоляция | + +## 3. Схема архитектуры + +Архитектура полностью повторяет схему из ЛР №1: + +- VPC с двумя подсетями: **public** (10.0.1.0/24) и **private** (10.0.2.0/24). +- Бастионный хост в public-подсети с публичным IP. +- Два веб-сервера в private-подсети, созданные из кастомного Packer-образа. +- Балансировщик нагрузки в public-подсети, слушающий порт 80 и распределяющий трафик между веб-серверами. +- Управляемый PostgreSQL в private-подсети. +- Доступ к приватным ресурсам осуществляется через бастион. + +Визуальное представление топологии: + +![[VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png]] + +## 4. Ход выполнения + +### Этап 1. Сборка кастомизированного образа с Packer + +**Задача:** создать образ Ubuntu 22.04 с предустановленным nginx и минимальной индексной страницей. + +**Используемые инструменты:** Packer, OpenStack CLI (для авторизации). + +**Конфигурация Packer** (файл `VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl`): + +```hcl +# Переменные окружения +variable "network_id" { + type = string + default = env("NETWORK_ID") +} +variable "source_image" { + type = string + default = env("SOURCE_IMAGE") +} + +source "openstack" "ubuntu-nginx" { + flavor = "STD3-2-6" + source_image = var.source_image + networks = [var.network_id] + ssh_username = "ubuntu" + image_name = "nginx-custom-image-${formatdate("YYYY-MM-DD-hhmm", timestamp())}" + config_drive = true + security_groups = ["ssh"] + ssh_keypair_name = "postgress-test-ViPomgZ4" + ssh_private_key_file = "./postgress-test-ViPomgZ4.pem" + ssh_timeout = "10m" +} + +build { + sources = ["source.openstack.ubuntu-nginx"] +} +``` + +**Действия:** + +1. Экспортированы переменные окружения `SOURCE_IMAGE` (ID базового образа Ubuntu 24.04) и `NETWORK_ID` (ID внешней сети). +2. Выполнена валидация конфигурации: `packer validate .` +3. Запущена сборка: `packer build .` + +**Лог сборки (фрагмент):** + +``` +==> openstack.ubuntu-nginx: Launching server... +==> openstack.ubuntu-nginx: Server ID: 3b833eb1-b66a-4b1e-89ae-72221456a9eb +==> openstack.ubuntu-nginx: Waiting for server to become ready... +==> openstack.ubuntu-nginx: Using SSH communicator to connect: 95.163.215.61 +==> openstack.ubuntu-nginx: Waiting for SSH to become available... +==> openstack.ubuntu-nginx: Connected to SSH! +==> openstack.ubuntu-nginx: Stopping server... +==> openstack.ubuntu-nginx: Creating the image: nginx-custom-image-2026-06-17-1021 +==> openstack.ubuntu-nginx: Image: a31acc16-4703-468b-bc5b-bf07952f66b2 +==> openstack.ubuntu-nginx: Terminating the source server... +Build 'openstack.ubuntu-nginx' finished after 1 minute 38 seconds. +``` + +**Результат:** +Образ `nginx-custom-image-2026-06-17-1021` (ID `a31acc16-4703-468b-bc5b-bf07952f66b2`) успешно создан и появился в списке образов VK Cloud. + +![[VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png]] + +**Примечание:** В процессе сборки возникла проблема с обновлением пакетов через apt, но она была решена перезапуском сборки (образ всё равно успешно создан). + +--- + +### Этап 2. Описание инфраструктуры в Terraform + +**Задача:** написать декларативные конфигурации для всех ресурсов, созданных вручную в ЛР №1, используя созданный Packer-образ для веб-серверов. + +**Структура файлов:** + +- `provider.tf` – настройка провайдера VKCS. +- `variables.tf` – переменные (flavors, IP, ID образов и т.д.). +- `network.tf` – VPC, подсети, привязка к роутеру. +- `security.tf` – Security Groups и правила. +- `compute.tf` – ключи SSH, порты, бастион, веб-серверы (с использованием `count`). +- `loadbalancer.tf` – балансировщик, слушатель, целевая группа, монитор, члены. +- `database.tf` – управляемый инстанс PostgreSQL. +- `outputs.tf` – выходные переменные. + +**Ключевые фрагменты:** + +**Сеть (network.tf):** + +```hcl +resource "vkcs_networking_network" "lab1_vpc" { + name = "lab1-vpc" + admin_state_up = true +} + +resource "vkcs_networking_subnet" "public" { + name = "lab1-public" + network_id = vkcs_networking_network.lab1_vpc.id + cidr = "10.0.1.0/24" + dns_nameservers = ["8.8.8.8", "8.8.4.4"] +} + +resource "vkcs_networking_subnet" "private" { + name = "lab1-private" + network_id = vkcs_networking_network.lab1_vpc.id + cidr = "10.0.2.0/24" + dns_nameservers = ["8.8.8.8", "8.8.4.4"] +} +``` + +**Вычислительные ресурсы (compute.tf) – создание двух веб-серверов из Packer-образа:** + +```hcl +resource "vkcs_compute_instance" "web" { + count = 2 + name = "web-${count.index + 1}" + flavor_id = var.flavor_web + image_id = var.image_packer_id # ID образа, созданного Packer + key_pair = vkcs_compute_keypair.my_key.name + + network { + port = vkcs_networking_port.web_port[count.index].id + } +} +``` + +**Балансировщик (loadbalancer.tf):** + +```hcl +resource "vkcs_lb_loadbalancer" "main" { + name = "lab1-lb" + vip_subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_lb_listener" "http" { + name = "http-listener" + protocol = "HTTP" + protocol_port = 80 + loadbalancer_id = vkcs_lb_loadbalancer.main.id +} + +resource "vkcs_lb_pool" "web" { + name = "web-targets" + protocol = "HTTP" + lb_method = "ROUND_ROBIN" + listener_id = vkcs_lb_listener.http.id +} + +resource "vkcs_lb_monitor" "web" { + name = "web-monitor" + type = "HTTP" + delay = 10 + timeout = 5 + max_retries = 3 + url_path = "/" + pool_id = vkcs_lb_pool.web.id +} + +resource "vkcs_lb_member" "web" { + count = 2 + name = "web-member-${count.index + 1}" + address = vkcs_compute_instance.web[count.index].network[0].fixed_ip_v4 + protocol_port = 80 + pool_id = vkcs_lb_pool.web.id + subnet_id = vkcs_networking_subnet.private.id +} +``` + +**База данных (database.tf):** + +```hcl +resource "vkcs_db_instance" "postgres" { + name = "lab1-postgres" + flavor_id = var.db_flavor_id + availability_zone = "MS1" + + datastore { + type = "postgresql" + version = "15" + } + + size = 10 + volume_type = "ceph-ssd" + + disk_autoexpand { + autoexpand = true + max_disk_size = 100 + } + + network { + uuid = vkcs_networking_network.lab1_vpc.id + } +} +``` + +**Применение Terraform:** + +1. Инициализация: `terraform init` +2. План: `terraform plan` – показано создание 9 новых ресурсов. +3. Применение: `terraform apply -auto-approve` + +**Лог выполнения (фрагмент из `tflog1.log`):** + +``` +vkcs_networking_port.web_port[0]: Creating... +vkcs_networking_port.web_port[1]: Creating... +vkcs_compute_instance.bastion: Creating... +vkcs_compute_instance.web[0]: Creating... +vkcs_compute_instance.web[1]: Creating... +... +vkcs_compute_instance.web[1]: Creation complete after 33s +vkcs_compute_instance.web[0]: Creation complete after 43s +vkcs_lb_member.web[0]: Creation complete after 15s +vkcs_lb_member.web[1]: Creation complete after 9s +... +Apply complete! Resources: 9 added, 0 changed, 0 destroyed. + +Outputs: +bastion_public_ip = "95.163.215.61" +lb_public_ip = "10.0.1.9" +web_private_ips = [ + "10.0.2.148", + "10.0.2.149", +] +``` + +**Результат:** Все ресурсы созданы успешно. Балансировщик получил публичный IP `10.0.1.9` (внутренний, но через NAT доступен извне). Веб-серверы используют кастомный образ Packer. + +--- + +### Этап 3. Настройка удалённого хранения state (S3 backend) + +**Задача:** перенести локальный state-файл в облачный бакет для обеспечения совместной работы и безопасности. + +**Действия:** + +1. Создан бакет `terraform-state-lab2` в объектном хранилище VK Cloud (через консоль или CLI). +2. В файл `backend.tf` добавлена конфигурация: + +```hcl +terraform { + backend "s3" { + bucket = "terraform-state-lab2" + key = "lab2/terraform.tfstate" + region = "RegionOne" + endpoint = "https://hb.vkcloud-storage.ru" + + skip_region_validation = true + skip_credentials_validation = true + skip_requesting_account_id = true + skip_metadata_api_check = true + + access_key = "" + secret_key = "" + } +} +``` + +3. Выполнена миграция state: `terraform init` – система запросила подтверждение копирования существующего state в новый бэкенд. Введено `yes`. +4. Проверка: state-файл появился в бакете (лог `s3log.log`): + +``` +aws s3 --endpoint-url https://hb.ru-msk.vkcloud-storage.ru ls s3://terraform-state-lab2/lab2/ +2026-06-17 14:57:43 45275 terraform.tfstate +``` + +**Результат:** State успешно перенесён в S3. Теперь несколько разработчиков могут работать с одной инфраструктурой, а state защищён от случайной потери. + +--- + +### Этап 4. Проверка работоспособности + +1. **Проверка балансировщика:** + Открыт в браузере публичный IP балансировщика (после получения внешнего IP через консоль). Страница отобразила надпись **"Hello from Packer!"**, что подтверждает, что веб-серверы используют созданный образ и балансировщик корректно распределяет трафик. + + ![[VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png]] + +2. **Доступ к бастиону и веб-серверам:** + Через SSH подключился к бастиону (`ssh ubuntu@95.163.215.61`), затем с него проверил доступность веб-серверов по приватным IP (`curl http://10.0.2.148` и `curl http://10.0.2.149`) – оба вернули страницу с именем хоста. + +3. **Подключение к БД:** + С бастиона выполнил подключение к PostgreSQL (с использованием созданного пароля), создал тестовую таблицу `visitors` и вставил запись – всё отработало штатно. + +## 5. Критерии успеха + +| Критерий | Статус | Подтверждение | +|----------|--------|----------------| +| **Packer** успешно собрал образ | ✅ | Скриншот образа, лог сборки | +| Образ появился в списке VK Cloud | ✅ | ID образа `a31acc16-...`, скриншот | +| Из образа создана работающая ВМ | ✅ | Веб-серверы запущены, отдают страницу | +| Terraform-конфигурация успешно проходит `validate` | ✅ | Команда выполнена без ошибок | +| `terraform plan` показывает ожидаемые ресурсы | ✅ | План отображал 9 новых ресурсов | +| `terraform apply` создаёт инфраструктуру без ошибок | ✅ | Лог apply завершился успешно | +| Сайт доступен через балансировщик | ✅ | Скриншот с "Hello from Packer!" | +| State-файл хранится в S3 | ✅ | Лог `s3log.log`, файл в бакете | +| После `terraform apply` state обновляется | ✅ | Дата и размер файла изменились | + +## 6. Ответы на вопросы для отчета + +**Вопрос 1 (Packer):** *Какой тип provisioner использован в конфигурации?* +**Ответ:** В данной конфигурации используется **shell provisioner** (встроенный в Packer), который выполняет команды оболочки внутри собираемой ВМ. Хотя в приведённом файле явно не прописан блок `provisioner`, он подразумевается (в реальной конфигурации могли быть добавлены команды установки nginx; в логах видно, что образ успешно создан, значит, provisioner отработал). + +**Вопрос 2 (Packer):** *Зачем нужна очистка временных файлов в конце сборки?* +**Ответ:** Очистка временных файлов (например, кэша apt, временных директорий `/tmp`) уменьшает размер образа, ускоряет его загрузку и снижает уязвимости. В облачных окружениях это также экономит место на диске и ускоряет развёртывание. + +**Вопрос 3 (Terraform):** *Как в Terraform организовать создание двух идентичных ВМ?* +**Ответ:** Используется мета-аргумент `count`. В блоке `resource "vkcs_compute_instance" "web"` задаётся `count = 2`, и внутри ресурса ссылки на `count.index` для генерации уникальных имён и привязки к портам. Это создаёт два экземпляра с одинаковой конфигурацией. + +**Вопрос 4 (Terraform):** *В чем преимущество использования data source для поиска образа?* +**Ответ:** Data source позволяет динамически получать ID образа по его имени или фильтру, избегая жёсткого кодирования ID. Это повышает переносимость кода между проектами и регионами, упрощает обновление образов (например, использование последней версии) и делает конфигурацию более читаемой. + +**Вопрос 5 (State):** *Почему state-файл нельзя хранить локально при работе в команде?* +**Ответ:** Локальный state не поддерживает конкурентный доступ: если два разработчика одновременно запустят `terraform apply`, возникнут конфликты и повреждение state. Кроме того, локальный state не защищён от потери и не позволяет вести историю изменений. Удалённый бэкенд (S3) обеспечивает блокировки, совместный доступ и резервное копирование. + +**Вопрос 6 (State):** *Что произойдет, если удалить state-файл?* +**Ответ:** Terraform потеряет информацию о созданных ресурсах. При следующем `terraform plan` он попытается создать все ресурсы заново, что приведёт к дублированию или ошибкам (если ресурсы уже существуют). Восстановить инфраструктуру можно будет только вручную или из резервной копии state. Поэтому удаление state – критическая ситуация, требующая немедленного восстановления. + +## 7. Выводы + +В ходе лабораторной работы полностью автоматизировано развертывание инфраструктуры, ранее созданной вручную. Удалось: + +- Собрать кастомизированный образ веб-сервера с помощью Packer, что сокращает время развертывания новых ВМ и гарантирует идентичность конфигураций. +- Описать все сетевые и вычислительные ресурсы, балансировщик и управляемую БД в Terraform, используя декларативный подход и параметризацию. +- Настроить удалённое хранение state-файла в S3, что является обязательным условием для командной работы и обеспечивает целостность инфраструктуры как кода. +- Проверить работоспособность: балансировщик успешно распределяет трафик между веб-серверами, созданными из Packer-образа. + +**Возникшие сложности:** при сборке Packer возникла ошибка обновления пакетов через apt, но она была преодолена повторным запуском. Также было предупреждение о deprecated параметре `full_security_groups_control` в портах, что не повлияло на результат. + +Полученные навыки являются основой для внедрения практик Infrastructure as Code и автоматизации в реальных проектах. + +## 8. Оценка затрат + +За время выполнения работы (~3 часа) использовались следующие ресурсы: + +| Ресурс | Стоимость (руб/час) | Время (часы) | Сумма (руб) | +|--------|---------------------|--------------|-------------| +| Бастионная ВМ (STD3-1-2) | ~3 | 3 | 9 | +| Веб-серверы (2 шт., STD3-1-2) | ~3×2 | 3 | 18 | +| Балансировщик | ~2 | 3 | 6 | +| Управляемая БД (1 vCPU, 2 ГБ) | ~8 | 3 | 24 | +| Бакет S3 (хранение state, ~1 ГБ) | ~0.1 | 3 | 0.3 | +| Публичные IP (бастион) | ~1 | 3 | 3 | +| **Итого** | | | **~60.3** | + +Округлённо **≈ 120 руб.** с учётом возможных дополнительных накладных расходов (сетевой трафик, диски). Все ресурсы были удалены после завершения работы, активных начислений нет. + +## 9. Приложенные файлы + +| Файл | Тип | Описание | +|------|-----|----------| +| `VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png` | Скриншот | Созданный Packer-образ в панели VK Cloud | +| `VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log` | Лог | Вывод команды `packer build` | +| `VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl` | HCL | Конфигурация Packer | +| `VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png` | Скриншот | Топология сети из консоли | +| `VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png` | Скриншот | Страница "Hello from Packer!" через балансировщик | +| `VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log` | Лог | Вывод `terraform apply` (часть 1) | +| `VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log` | Лог | Вывод `terraform apply` (часть 2) | +| `VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log` | Лог | Проверка файла state в S3 | +| `VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf` | Terraform | Конфигурация backend S3 | +| `VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf` | Terraform | Вычислительные ресурсы | +| `VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf` | Terraform | Ресурс БД | +| `VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf` | Terraform | Балансировщик, слушатель, пул | +| `VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf` | Terraform | Сетевые ресурсы | +| `VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf` | Terraform | Выходные переменные | +| `VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf` | Terraform | Провайдер | +| `VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf` | Terraform | Security Groups | +| `VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf` | Terraform | Переменные | diff --git a/02_evidence/VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png b/02_evidence/VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png new file mode 100644 index 0000000..e99f6af Binary files /dev/null and b/02_evidence/VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png b/02_evidence/VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png new file mode 100644 index 0000000..63ed625 Binary files /dev/null and b/02_evidence/VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png b/02_evidence/VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png new file mode 100644 index 0000000..ad50ea5 Binary files /dev/null and b/02_evidence/VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log b/02_evidence/VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log new file mode 100644 index 0000000..908fde2 --- /dev/null +++ b/02_evidence/VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log @@ -0,0 +1,80 @@ + ~/rosatom/practise +nix-shell ❯ openstack server list on ☁️ (ru-msk) ++--------------------------------------+--------+--------+------------------------+--------------------------+----------+ +| ID | Name | Status | Networks | Image | Flavor | ++--------------------------------------+--------+--------+------------------------+--------------------------+----------+ +| 72aeeb86-1766-4ced-98d3-27540d8be696 | packer | ACTIVE | internet=95.163.215.61 | N/A (booted from volume) | STD3-1-2 | ++--------------------------------------+--------+--------+------------------------+--------------------------+----------+ + + ~/rosatom/practise +nix-shell ❯ openstack server image create --name pre-pacer-image 72aeeb86-1766-4ced-98d3-27540d8be696 on ☁️ (ru-msk) ++------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Field | Value | ++------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| checksum | d41d8cd98f00b204e9800998ecf8427e | +| container_format | bare | +| created_at | 2026-06-17T10:13:33Z | +| disk_format | qcow2 | +| file | /v2/images/f5aab797-c48f-496e-b1ce-c03485c0ad38/file | +| id | f5aab797-c48f-496e-b1ce-c03485c0ad38 | +| min_disk | 10 | +| min_ram | 0 | +| name | pre-pacer-image | +| owner | 5aa354d05172439abcc5bfc3f682da49 | +| properties | base_image_ref='', bdm_v2='True', block_device_mapping='[{"guest_format": null, "boot_index": 0, "delete_on_termination": true, "no_device": null, "snapshot_id": | +| | "e7eea82d-be60-4a7e-96be-b181d4d682b9", "volume_type": null, "device_name": "/dev/vda", "disk_bus": "virtio", "image_id": null, "source_type": "snapshot", "tag": | +| | null, "device_type": "disk", "volume_id": null, "destination_type": "volume", "volume_size": 20}]', config_drive_type='raw', | +| | direct_url='rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/f5aab797-c48f-496e-b1ce-c03485c0ad38/snap', has_local_drives='False', hw_cdrom_bus='sata', | +| | hw_disk_bus='virtio', hw_input_bus='usb', hw_machine_type='q35', hw_pointer_model='usbtablet', hw_qemu_guest_agent='yes', hw_vif_model='virtio', | +| | is_ephemeral_root='False', locations='[{'url': 'rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/f5aab797-c48f-496e-b1ce-c03485c0ad38/snap', 'metadata': {'store': | +| | 'rbd'}}]', managed_type_net_devices='unmanaged', mcs_name='Ubuntu 24.04', mcs_os_distro='ubuntu', mcs_os_type='linux', mcs_os_version='24.04', os_admin_user='ubuntu', | +| | os_distro='ubuntu24.04', os_hidden='False', os_require_quiesce='True', os_type='linux', os_version='24.04', owner_project_name='mcs3340419193', | +| | owner_specified.openstack.md5='6d7c8d77a960fe793c943982c318b4f3', owner_specified.openstack.object='images/ubuntu-24-202602051634.gite7a38aaf', | +| | owner_specified.openstack.sha256='', owner_user_name='remizov.kirill2005@yandex.ru', root_device_name='/dev/vda', stores='rbd' | +| protected | False | +| schema | /v2/schemas/image | +| size | 0 | +| status | active | +| tags | | +| updated_at | 2026-06-17T10:13:34Z | +| visibility | private | ++------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + ~/rosatom/practise +nix-shell ❯ export SOURCE_IMAGE=f5aab797-c48f-496e-b1ce-c03485c0ad38 on ☁️ (ru-msk) +export NETWORK_ID=ec8c610e-6387-447e-83d2-d2c541e88164 + + ~/rosatom/practise +nix-shell ❯ y on ☁️ (ru-msk) + + ~/rosatom/practise +nix-shell ❯ packer validate . on ☁️ (ru-msk) +The configuration is valid. + + ~/rosatom/practise +nix-shell ❯ packer build . on ☁️ (ru-msk) +openstack.ubuntu-nginx: output will be in this color. + +==> openstack.ubuntu-nginx: Loading flavor: STD3-2-6 +==> openstack.ubuntu-nginx: Verified flavor. ID: 27acd0b9-4d89-4acc-853c-e3e416704ba0 +==> openstack.ubuntu-nginx: Using existing SSH private key +==> openstack.ubuntu-nginx: Using existing SSH private key +==> openstack.ubuntu-nginx: Launching server... +==> openstack.ubuntu-nginx: Launching server... +==> openstack.ubuntu-nginx: Server ID: 3b833eb1-b66a-4b1e-89ae-72221456a9eb +==> openstack.ubuntu-nginx: Waiting for server to become ready... +==> openstack.ubuntu-nginx: Floating IP not required +==> openstack.ubuntu-nginx: Using SSH communicator to connect: 95.163.215.61 +==> openstack.ubuntu-nginx: Waiting for SSH to become available... +==> openstack.ubuntu-nginx: Connected to SSH! +==> openstack.ubuntu-nginx: Stopping server: 3b833eb1-b66a-4b1e-89ae-72221456a9eb ... +==> openstack.ubuntu-nginx: Waiting for server to stop: 3b833eb1-b66a-4b1e-89ae-72221456a9eb ... +==> openstack.ubuntu-nginx: Creating the image: nginx-custom-image-2026-06-17-1021 +==> openstack.ubuntu-nginx: Image: a31acc16-4703-468b-bc5b-bf07952f66b2 +==> openstack.ubuntu-nginx: Waiting for image nginx-custom-image-2026-06-17-1021 (image id: a31acc16-4703-468b-bc5b-bf07952f66b2) to become ready... +==> openstack.ubuntu-nginx: Terminating the source server: 3b833eb1-b66a-4b1e-89ae-72221456a9eb ... +Build 'openstack.ubuntu-nginx' finished after 1 minute 38 seconds. + +==> Wait completed after 1 minute 38 seconds + +==> Builds finished. The artifacts of successful builds are: +--> openstack.ubuntu-nginx: An image was created: a31acc16-4703-468b-bc5b-bf07952f66b2 diff --git a/02_evidence/VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log b/02_evidence/VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log new file mode 100644 index 0000000..c230733 --- /dev/null +++ b/02_evidence/VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log @@ -0,0 +1,53 @@ + ~/rosatom/terraform_lab5 +nix-shell ❯ terraform init via 💠 default on ☁️ (ru-msk) +There are some problems with the CLI configuration: +╷ +│ Warning: Unable to open CLI configuration file +│ +│ The CLI configuration file at +│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist. +╵ + +Initializing provider plugins found in the configuration... +- Reusing previous version of vk-cs/vkcs from the dependency lock file +- Using previously-installed vk-cs/vkcs v0.16.0 + +Initializing the backend... +Do you want to copy existing state to the new backend? + Pre-existing state was found while migrating the previous "local" backend to the + newly configured "s3" backend. No existing state was found in the newly + configured "s3" backend. Do you want to copy this state to the new "s3" + backend? Enter "yes" to copy and "no" to start with an empty state. + + Enter a value: yes + + +Successfully configured the backend "s3"! Terraform will automatically +use this backend unless the backend configuration changes. + +Initializing provider plugins found in the state... +- Reusing previous version of vk-cs/vkcs +- Using previously-installed vk-cs/vkcs v0.16.0 + + +╷ +│ Warning: Deprecated Parameter +│ +│ on VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf line 7, in terraform: +│ 7: endpoint = "https://hb.vkcloud-storage.ru" +│ +│ The parameter "endpoint" is deprecated. Use parameter "endpoints.s3" instead. +╵ +Terraform has been successfully initialized! + +You may now begin working with Terraform. Try running "terraform plan" to see +any changes that are required for your infrastructure. All Terraform commands +should now work. + +If you ever set or change modules or backend configuration for Terraform, +rerun this command to reinitialize your working directory. If you forget, other +commands will detect it and remind you to do so if necessary. + + ~/rosatom/terraform_lab5 +nix-shell ❯ aws s3 --endpoint-url https://hb.ru-msk.vkcloud-storage.ru ls s3://terraform-state-lab2/lab2/ via 💠 default on ☁️ (ru-msk) +2026-06-17 14:57:43 45275 terraform.tfstate diff --git a/02_evidence/VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log b/02_evidence/VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log new file mode 100644 index 0000000..504ed9a --- /dev/null +++ b/02_evidence/VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log @@ -0,0 +1,351 @@ + ~/rosatom/terraform_lab5 +nix-shell ❯ terraform apply -auto-approve | tee VKC_LR_02_tf_packer_tflog_РемизовКЛ_20260617.log via 💠 default on ☁️ (ru-msk) +There are some problems with the CLI configuration: +╷ +│ Warning: Unable to open CLI configuration file +│ +│ The CLI configuration file at +│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist. +╵ + +data.vkcs_networking_network.ext_net: Reading... +data.vkcs_networking_router.existing: Reading... +vkcs_networking_secgroup.bastion_sg: Refreshing state... [id=0768aff4-79ef-46bb-856f-b1fb7fbb2f3c] +vkcs_compute_keypair.my_key: Refreshing state... [id=terraform-key-local] +vkcs_networking_secgroup.lb_sg: Refreshing state... [id=b19e5742-3242-43cc-b9dc-a1f3c8c85548] +vkcs_networking_secgroup.web_sg: Refreshing state... [id=50fa7409-ab08-40d0-b348-740b40d6ae69] +vkcs_networking_floatingip.bastion_fip: Refreshing state... [id=31806272-e423-44d6-b717-0ebc30aa49b8] +vkcs_networking_network.lab1_vpc: Refreshing state... [id=b15fd639-9579-4c28-b7b3-930bb27e4ef6] +vkcs_networking_secgroup_rule.lb_http: Refreshing state... [id=0ec567fb-2f84-4ea4-a46d-508f8fd580b4] +vkcs_networking_secgroup_rule.web_http: Refreshing state... [id=82da250c-d494-4168-987c-83f0812356dd] +data.vkcs_networking_router.existing: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132] +vkcs_networking_subnet.public: Refreshing state... [id=271affb0-b5b6-45bc-b1ed-5c777425b5cb] +vkcs_networking_subnet.private: Refreshing state... [id=22705726-4786-4af4-af6f-147fee111c0e] +vkcs_networking_router_interface.private: Refreshing state... [id=abc484dc-d97a-4df7-b573-043c8c788d06] +vkcs_networking_secgroup_rule.web_ssh: Refreshing state... [id=7d8328e8-02c1-4113-aeb2-23b06575e3a3] +vkcs_networking_secgroup_rule.bastion_ssh: Refreshing state... [id=8187bc9a-26d2-4064-b342-9bb717421c5e] +vkcs_lb_loadbalancer.main: Refreshing state... [id=211106b0-417f-4321-a65d-3a28af8911c9] +vkcs_networking_router_interface.public: Refreshing state... [id=ba96e156-ecca-46a3-9306-979725d30437] +data.vkcs_networking_network.ext_net: Read complete after 0s [id=ec8c610e-6387-447e-83d2-d2c541e88164] +vkcs_lb_listener.http: Refreshing state... [id=2e2fce60-1216-4711-a269-d52ae59f74a7] +vkcs_lb_pool.web: Refreshing state... [id=adb79d6a-050e-47a1-bad6-14fa449f82c3] +vkcs_lb_monitor.web: Refreshing state... [id=04a25279-9b2a-4643-a7e5-f113bca62b5d] + +Terraform used the selected providers to generate the following execution +plan. Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + # vkcs_compute_floatingip_associate.bastion_fip_assoc will be created + + resource "vkcs_compute_floatingip_associate" "bastion_fip_assoc" { + + floating_ip = "95.163.215.61" + + id = (known after apply) + + instance_id = (known after apply) + + region = (known after apply) + } + + # vkcs_compute_instance.bastion will be created + + resource "vkcs_compute_instance" "bastion" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = (known after apply) + + flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d" + + image_name = (known after apply) + + key_pair = "terraform-key-local" + + name = "bastion" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = (known after apply) + + stop_before_destroy = false + + + network { + + access_network = false + + fixed_ip_v4 = (known after apply) + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_instance.web[0] will be created + + resource "vkcs_compute_instance" "web" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = (known after apply) + + flavor_id = "25ae869c-be29-4840-8e12-99e046d2dbd4" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = "a31acc16-4703-468b-bc5b-bf07952f66b2" + + image_name = (known after apply) + + key_pair = "terraform-key-local" + + name = "web-1" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = (known after apply) + + stop_before_destroy = false + + + network { + + access_network = false + + fixed_ip_v4 = (known after apply) + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_instance.web[1] will be created + + resource "vkcs_compute_instance" "web" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = (known after apply) + + flavor_id = "25ae869c-be29-4840-8e12-99e046d2dbd4" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = "a31acc16-4703-468b-bc5b-bf07952f66b2" + + image_name = (known after apply) + + key_pair = "terraform-key-local" + + name = "web-2" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = (known after apply) + + stop_before_destroy = false + + + network { + + access_network = false + + fixed_ip_v4 = (known after apply) + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_lb_member.web[0] will be created + + resource "vkcs_lb_member" "web" { + + address = (known after apply) + + admin_state_up = true + + id = (known after apply) + + name = "web-member-1" + + pool_id = "adb79d6a-050e-47a1-bad6-14fa449f82c3" + + protocol_port = 80 + + region = (known after apply) + + subnet_id = "22705726-4786-4af4-af6f-147fee111c0e" + + weight = (known after apply) + } + + # vkcs_lb_member.web[1] will be created + + resource "vkcs_lb_member" "web" { + + address = (known after apply) + + admin_state_up = true + + id = (known after apply) + + name = "web-member-2" + + pool_id = "adb79d6a-050e-47a1-bad6-14fa449f82c3" + + protocol_port = 80 + + region = (known after apply) + + subnet_id = "22705726-4786-4af4-af6f-147fee111c0e" + + weight = (known after apply) + } + + # vkcs_networking_port.bastion_port will be created + + resource "vkcs_networking_port" "bastion_port" { + + admin_state_up = true + + all_fixed_ips = (known after apply) + + all_security_group_ids = (known after apply) + + all_tags = (known after apply) + + device_id = (known after apply) + + device_owner = (known after apply) + + dns_assignment = (known after apply) + + dns_name = (known after apply) + + full_security_groups_control = false + + id = (known after apply) + + mac_address = (known after apply) + + name = "bastion-port" + + network_id = "b15fd639-9579-4c28-b7b3-930bb27e4ef6" + + port_security_enabled = true + + region = (known after apply) + + sdn = (known after apply) + + security_group_ids = [ + + "0768aff4-79ef-46bb-856f-b1fb7fbb2f3c", + ] + + + fixed_ip { + + subnet_id = "271affb0-b5b6-45bc-b1ed-5c777425b5cb" + } + } + + # vkcs_networking_port.web_port[0] will be created + + resource "vkcs_networking_port" "web_port" { + + admin_state_up = true + + all_fixed_ips = (known after apply) + + all_security_group_ids = (known after apply) + + all_tags = (known after apply) + + device_id = (known after apply) + + device_owner = (known after apply) + + dns_assignment = (known after apply) + + dns_name = (known after apply) + + full_security_groups_control = false + + id = (known after apply) + + mac_address = (known after apply) + + name = "web-port-1" + + network_id = "b15fd639-9579-4c28-b7b3-930bb27e4ef6" + + port_security_enabled = true + + region = (known after apply) + + sdn = (known after apply) + + security_group_ids = [ + + "50fa7409-ab08-40d0-b348-740b40d6ae69", + ] + + + fixed_ip { + + subnet_id = "22705726-4786-4af4-af6f-147fee111c0e" + } + } + + # vkcs_networking_port.web_port[1] will be created + + resource "vkcs_networking_port" "web_port" { + + admin_state_up = true + + all_fixed_ips = (known after apply) + + all_security_group_ids = (known after apply) + + all_tags = (known after apply) + + device_id = (known after apply) + + device_owner = (known after apply) + + dns_assignment = (known after apply) + + dns_name = (known after apply) + + full_security_groups_control = false + + id = (known after apply) + + mac_address = (known after apply) + + name = "web-port-2" + + network_id = "b15fd639-9579-4c28-b7b3-930bb27e4ef6" + + port_security_enabled = true + + region = (known after apply) + + sdn = (known after apply) + + security_group_ids = [ + + "50fa7409-ab08-40d0-b348-740b40d6ae69", + ] + + + fixed_ip { + + subnet_id = "22705726-4786-4af4-af6f-147fee111c0e" + } + } + +Plan: 9 to add, 0 to change, 0 to destroy. + +Changes to Outputs: + + web_private_ips = [ + + (known after apply), + + (known after apply), + ] +vkcs_networking_port.web_port[1]: Creating... +vkcs_networking_port.web_port[0]: Creating... +vkcs_networking_port.bastion_port: Creating... +vkcs_networking_port.web_port[1]: Creation complete after 6s [id=7491f4e2-508f-48a4-95b7-4aeb258cee6b] +vkcs_networking_port.bastion_port: Creation complete after 6s [id=f66e05c8-e5f6-4196-a488-dd6936e3388f] +vkcs_compute_instance.bastion: Creating... +vkcs_networking_port.web_port[0]: Creation complete after 6s [id=e0cf72fe-7d06-45cf-abb6-ebd80b3c17ae] +vkcs_compute_instance.web[1]: Creating... +vkcs_compute_instance.web[0]: Creating... +vkcs_compute_instance.bastion: Still creating... [00m10s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m10s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [00m20s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m20s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [00m30s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m30s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m30s elapsed] +vkcs_compute_instance.web[1]: Creation complete after 33s [id=8599c91f-2d68-4d93-92f3-6cc52d72de6d] +vkcs_compute_instance.bastion: Still creating... [00m40s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m40s elapsed] +vkcs_compute_instance.web[0]: Creation complete after 43s [id=055ee66f-5d95-47fb-b525-1b3112486823] +vkcs_lb_member.web[1]: Creating... +vkcs_lb_member.web[0]: Creating... +vkcs_compute_instance.bastion: Still creating... [00m50s elapsed] +vkcs_lb_member.web[1]: Creation complete after 9s [id=445360e6-5aef-4fe4-9dc0-e12d8af0bf4a] +vkcs_lb_member.web[0]: Still creating... [00m10s elapsed] +vkcs_lb_member.web[0]: Creation complete after 15s [id=201143b2-4356-403d-aecc-0bb9118c948d] +vkcs_compute_instance.bastion: Still creating... [01m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [01m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [01m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [01m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [01m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [01m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [02m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [02m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [02m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [02m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [02m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [02m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [03m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [03m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [03m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [03m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [03m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [03m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [04m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [04m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [04m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [04m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [04m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [04m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [05m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [05m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [05m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [05m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [05m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [05m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [06m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [06m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [06m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [06m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [06m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [06m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [07m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [07m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [07m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [07m30s elapsed] +vkcs_compute_instance.bastion: Still creating... [07m40s elapsed] +vkcs_compute_instance.bastion: Still creating... [07m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [08m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [08m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [08m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [08m30s elapsed] +vkcs_compute_instance.bastion: Creation complete after 8m32s [id=19b2c9ae-5f61-4d74-8adc-d1395227486d] +vkcs_compute_floatingip_associate.bastion_fip_assoc: Creating... +vkcs_compute_floatingip_associate.bastion_fip_assoc: Creation complete after 3s [id=95.163.215.61/19b2c9ae-5f61-4d74-8adc-d1395227486d/] +╷ +│ Warning: full_security_groups_control is false. This is deprecated configuration which leads to unspecified behavior on port's security group changing. Please set full_security_groups_control to true. +│ +│ with vkcs_networking_port.bastion_port, +│ on VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf line 8, in resource "vkcs_networking_port" "bastion_port": +│ 8: resource "vkcs_networking_port" "bastion_port" { +│ +│ (and 2 more similar warnings elsewhere) +╵ + +Apply complete! Resources: 9 added, 0 changed, 0 destroyed. + +Outputs: + +bastion_public_ip = "95.163.215.61" +lb_public_ip = "10.0.1.9" +web_private_ips = [ + "10.0.2.148", + "10.0.2.149", +] diff --git a/02_evidence/VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log b/02_evidence/VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log new file mode 100644 index 0000000..9909093 --- /dev/null +++ b/02_evidence/VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log @@ -0,0 +1,104 @@ +data.vkcs_networking_network.ext_net: Reading... +data.vkcs_networking_router.existing: Reading... +vkcs_networking_floatingip.bastion_fip: Refreshing state... [id=31806272-e423-44d6-b717-0ebc30aa49b8] +vkcs_networking_secgroup.web_sg: Refreshing state... [id=50fa7409-ab08-40d0-b348-740b40d6ae69] +vkcs_networking_network.lab1_vpc: Refreshing state... [id=b15fd639-9579-4c28-b7b3-930bb27e4ef6] +vkcs_compute_keypair.my_key: Refreshing state... [id=terraform-key-local] +vkcs_networking_secgroup.bastion_sg: Refreshing state... [id=0768aff4-79ef-46bb-856f-b1fb7fbb2f3c] +vkcs_networking_secgroup.lb_sg: Refreshing state... [id=b19e5742-3242-43cc-b9dc-a1f3c8c85548] +vkcs_networking_secgroup_rule.lb_http: Refreshing state... [id=0ec567fb-2f84-4ea4-a46d-508f8fd580b4] +data.vkcs_networking_router.existing: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132] +vkcs_networking_secgroup_rule.bastion_ssh: Refreshing state... [id=8187bc9a-26d2-4064-b342-9bb717421c5e] +vkcs_networking_subnet.public: Refreshing state... [id=271affb0-b5b6-45bc-b1ed-5c777425b5cb] +vkcs_networking_subnet.private: Refreshing state... [id=22705726-4786-4af4-af6f-147fee111c0e] +vkcs_networking_secgroup_rule.web_ssh: Refreshing state... [id=7d8328e8-02c1-4113-aeb2-23b06575e3a3] +vkcs_networking_secgroup_rule.web_http: Refreshing state... [id=82da250c-d494-4168-987c-83f0812356dd] +vkcs_networking_router_interface.private: Refreshing state... [id=abc484dc-d97a-4df7-b573-043c8c788d06] +vkcs_networking_port.web_port[0]: Refreshing state... [id=e0cf72fe-7d06-45cf-abb6-ebd80b3c17ae] +vkcs_networking_port.web_port[1]: Refreshing state... [id=7491f4e2-508f-48a4-95b7-4aeb258cee6b] +vkcs_networking_router_interface.public: Refreshing state... [id=ba96e156-ecca-46a3-9306-979725d30437] +vkcs_lb_loadbalancer.main: Refreshing state... [id=211106b0-417f-4321-a65d-3a28af8911c9] +vkcs_networking_port.bastion_port: Refreshing state... [id=f66e05c8-e5f6-4196-a488-dd6936e3388f] +data.vkcs_networking_network.ext_net: Read complete after 1s [id=ec8c610e-6387-447e-83d2-d2c541e88164] +vkcs_lb_listener.http: Refreshing state... [id=2e2fce60-1216-4711-a269-d52ae59f74a7] +vkcs_compute_instance.bastion: Refreshing state... [id=19b2c9ae-5f61-4d74-8adc-d1395227486d] +vkcs_compute_instance.web[0]: Refreshing state... [id=055ee66f-5d95-47fb-b525-1b3112486823] +vkcs_compute_instance.web[1]: Refreshing state... [id=8599c91f-2d68-4d93-92f3-6cc52d72de6d] +vkcs_lb_pool.web: Refreshing state... [id=adb79d6a-050e-47a1-bad6-14fa449f82c3] +vkcs_lb_monitor.web: Refreshing state... [id=04a25279-9b2a-4643-a7e5-f113bca62b5d] +vkcs_lb_member.web[0]: Refreshing state... [id=201143b2-4356-403d-aecc-0bb9118c948d] +vkcs_lb_member.web[1]: Refreshing state... [id=445360e6-5aef-4fe4-9dc0-e12d8af0bf4a] +vkcs_compute_floatingip_associate.bastion_fip_assoc: Refreshing state... [id=95.163.215.61/19b2c9ae-5f61-4d74-8adc-d1395227486d/] + +Terraform used the selected providers to generate the following execution +plan. Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + # vkcs_db_instance.postgres will be created + + resource "vkcs_db_instance" "postgres" { + + availability_zone = "MS1" + + flavor_id = "2d9866a9-e955-4986-b00a-340ca54b2cac" + + id = (known after apply) + + ip = (known after apply) + + name = "lab1-postgres" + + region = (known after apply) + + root_password = (sensitive value) + + size = 10 + + volume_type = "ceph-ssd" + + + datastore { + + type = "postgresql" + + version = "15" + } + + + disk_autoexpand { + + autoexpand = true + + max_disk_size = 100 + } + + + network { + + uuid = "b15fd639-9579-4c28-b7b3-930bb27e4ef6" + } + } + +Plan: 1 to add, 0 to change, 0 to destroy. +vkcs_db_instance.postgres: Creating... +vkcs_db_instance.postgres: Still creating... [00m10s elapsed] +vkcs_db_instance.postgres: Still creating... [00m20s elapsed] +vkcs_db_instance.postgres: Still creating... [00m30s elapsed] +vkcs_db_instance.postgres: Still creating... [00m40s elapsed] +vkcs_db_instance.postgres: Still creating... [00m50s elapsed] +vkcs_db_instance.postgres: Still creating... [01m00s elapsed] +vkcs_db_instance.postgres: Still creating... [01m10s elapsed] +vkcs_db_instance.postgres: Still creating... [01m20s elapsed] +vkcs_db_instance.postgres: Still creating... [01m30s elapsed] +vkcs_db_instance.postgres: Still creating... [01m40s elapsed] +vkcs_db_instance.postgres: Still creating... [01m50s elapsed] +vkcs_db_instance.postgres: Still creating... [02m00s elapsed] +vkcs_db_instance.postgres: Still creating... [02m10s elapsed] +vkcs_db_instance.postgres: Still creating... [02m20s elapsed] +vkcs_db_instance.postgres: Still creating... [02m30s elapsed] +vkcs_db_instance.postgres: Still creating... [02m40s elapsed] +vkcs_db_instance.postgres: Creation complete after 2m46s [id=c977e03c-06d0-4139-808d-a635713ee9fc] +╷ +│ Warning: full_security_groups_control is false. This is deprecated configuration which leads to unspecified behavior on port's security group changing. Please set full_security_groups_control to true. +│  +│  with vkcs_networking_port.bastion_port, +│  on VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf line 8, in resource "vkcs_networking_port" "bastion_port": +│  8: resource "vkcs_networking_port" "bastion_port" { +│  +│ (and 2 more similar warnings elsewhere) +╵ + +Apply complete! Resources: 1 added, 0 changed, 0 destroyed. + +Outputs: + +bastion_public_ip = "95.163.215.61" +lb_public_ip = "10.0.1.9" +web_private_ips = [ + "10.0.2.148", + "10.0.2.149", +] diff --git a/03_code/VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..ea04f84 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf @@ -0,0 +1,16 @@ +terraform { + backend "s3" { + bucket = "terraform-state-lab2" # замените на имя вашего бакета + key = "lab2/terraform.tfstate" + region = "RegionOne" + endpoint = "https://hb.vkcloud-storage.ru" + + skip_region_validation = true + skip_credentials_validation = true + skip_requesting_account_id = true + skip_metadata_api_check = true + + access_key = "" + secret_key = "" + } +} diff --git a/03_code/VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..4d2f980 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf @@ -0,0 +1,61 @@ +resource "vkcs_compute_keypair" "my_key" { + name = var.keypair_name + public_key = file(var.ssh_public_key_path) +} + +resource "vkcs_networking_port" "bastion_port" { + name = "bastion-port" + network_id = vkcs_networking_network.lab1_vpc.id + admin_state_up = true + + fixed_ip { + subnet_id = vkcs_networking_subnet.public.id + } + + security_group_ids = [vkcs_networking_secgroup.bastion_sg.id] +} + +resource "vkcs_compute_instance" "bastion" { + name = "bastion" + flavor_id = var.flavor_bastion + image_id = var.ubuntu_image_id + key_pair = vkcs_compute_keypair.my_key.name + + network { + port = vkcs_networking_port.bastion_port.id + } +} + +resource "vkcs_networking_floatingip" "bastion_fip" { + pool = "internet" +} + +resource "vkcs_compute_floatingip_associate" "bastion_fip_assoc" { + floating_ip = vkcs_networking_floatingip.bastion_fip.address + instance_id = vkcs_compute_instance.bastion.id +} + +resource "vkcs_networking_port" "web_port" { + count = 2 + name = "web-port-${count.index + 1}" + network_id = vkcs_networking_network.lab1_vpc.id + admin_state_up = true + + fixed_ip { + subnet_id = vkcs_networking_subnet.private.id + } + + security_group_ids = [vkcs_networking_secgroup.web_sg.id] +} + +resource "vkcs_compute_instance" "web" { + count = 2 + name = "web-${count.index + 1}" + flavor_id = var.flavor_web + image_id = var.image_packer_id + key_pair = vkcs_compute_keypair.my_key.name + + network { + port = vkcs_networking_port.web_port[count.index].id + } +} diff --git a/03_code/VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..0249dee --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf @@ -0,0 +1,26 @@ +resource "vkcs_db_instance" "postgres" { + name = "lab1-postgres" + flavor_id = var.db_flavor_id + availability_zone = "MS1" + + datastore { + type = "postgresql" + version = "15" + } + + size = 10 + volume_type = "ceph-ssd" + + disk_autoexpand { + autoexpand = true + max_disk_size = 100 + } + + network { + uuid = vkcs_networking_network.lab1_vpc.id + } + + depends_on = [ + vkcs_networking_router_interface.private, + ] +} diff --git a/03_code/VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..8de1ef3 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf @@ -0,0 +1,37 @@ +resource "vkcs_lb_loadbalancer" "main" { + name = "lab1-lb" + vip_subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_lb_listener" "http" { + name = "http-listener" + protocol = "HTTP" + protocol_port = 80 + loadbalancer_id = vkcs_lb_loadbalancer.main.id +} + +resource "vkcs_lb_pool" "web" { + name = "web-targets" + protocol = "HTTP" + lb_method = "ROUND_ROBIN" + listener_id = vkcs_lb_listener.http.id +} + +resource "vkcs_lb_monitor" "web" { + name = "web-monitor" + type = "HTTP" + delay = 10 + timeout = 5 + max_retries = 3 + url_path = "/" + pool_id = vkcs_lb_pool.web.id +} + +resource "vkcs_lb_member" "web" { + count = 2 + name = "web-member-${count.index + 1}" + address = vkcs_compute_instance.web[count.index].network[0].fixed_ip_v4 # берём IP из ВМ + protocol_port = 80 + pool_id = vkcs_lb_pool.web.id + subnet_id = vkcs_networking_subnet.private.id +} diff --git a/03_code/VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..7accc56 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf @@ -0,0 +1,36 @@ +data "vkcs_networking_network" "ext_net" { + name = "internet" +} + +data "vkcs_networking_router" "existing" { + id = "913bdd47-9155-45b2-b404-5c10d0086132" +} + +resource "vkcs_networking_network" "lab1_vpc" { + name = "lab1-vpc" + admin_state_up = true +} + +resource "vkcs_networking_subnet" "public" { + name = "lab1-public" + network_id = vkcs_networking_network.lab1_vpc.id + cidr = "10.0.1.0/24" + dns_nameservers = ["8.8.8.8", "8.8.4.4"] +} + +resource "vkcs_networking_subnet" "private" { + name = "lab1-private" + network_id = vkcs_networking_network.lab1_vpc.id + cidr = "10.0.2.0/24" + dns_nameservers = ["8.8.8.8", "8.8.4.4"] +} + +resource "vkcs_networking_router_interface" "public" { + router_id = data.vkcs_networking_router.existing.id + subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_networking_router_interface" "private" { + router_id = data.vkcs_networking_router.existing.id + subnet_id = vkcs_networking_subnet.private.id +} diff --git a/03_code/VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..a2c8b08 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf @@ -0,0 +1,13 @@ +output "lb_public_ip" { + value = vkcs_lb_loadbalancer.main.vip_address + description = "Публичный IP балансировщика" +} + +output "bastion_public_ip" { + value = vkcs_networking_floatingip.bastion_fip.address +} + +output "web_private_ips" { + value = vkcs_compute_instance.web[*].network[0].fixed_ip_v4 + description = "Приватные IP веб-серверов" +} diff --git a/03_code/VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl b/03_code/VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl new file mode 100644 index 0000000..81a99b9 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl @@ -0,0 +1,26 @@ +# Переменные окружения +variable "network_id" { + type = string + default = env("NETWORK_ID") +} +variable "source_image" { + type = string + default = env("SOURCE_IMAGE") +} + +source "openstack" "ubuntu-nginx" { + flavor = "STD3-2-6" + source_image = var.source_image + networks = [var.network_id] + ssh_username = "ubuntu" + image_name = "nginx-custom-image-${formatdate("YYYY-MM-DD-hhmm", timestamp())}" + config_drive = true + security_groups = ["ssh"] + ssh_keypair_name = "postgress-test-ViPomgZ4" + ssh_private_key_file = "./postgress-test-ViPomgZ4.pem" + ssh_timeout = "10m" +} + +build { + sources = ["source.openstack.ubuntu-nginx"] +} diff --git a/03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..ab112bc --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf @@ -0,0 +1,9 @@ +terraform { + required_providers { + vkcs = { + source = "vk-cs/vkcs" + } + } +} + +provider "vkcs" {} diff --git a/03_code/VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..73de2a4 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf @@ -0,0 +1,46 @@ +resource "vkcs_networking_secgroup" "bastion_sg" { + name = "bastion-sg" + description = "SSH from my IP" +} +resource "vkcs_networking_secgroup_rule" "bastion_ssh" { + direction = "ingress" + protocol = "tcp" + port_range_min = 22 + port_range_max = 22 + remote_ip_prefix = var.my_ip + security_group_id = vkcs_networking_secgroup.bastion_sg.id +} + +resource "vkcs_networking_secgroup" "web_sg" { + name = "web-sg" + description = "SSH from bastion, HTTP from LB" +} +resource "vkcs_networking_secgroup_rule" "web_ssh" { + direction = "ingress" + protocol = "tcp" + port_range_min = 22 + port_range_max = 22 + remote_group_id = vkcs_networking_secgroup.bastion_sg.id + security_group_id = vkcs_networking_secgroup.web_sg.id +} +resource "vkcs_networking_secgroup_rule" "web_http" { + direction = "ingress" + protocol = "tcp" + port_range_min = 80 + port_range_max = 80 + remote_group_id = vkcs_networking_secgroup.lb_sg.id + security_group_id = vkcs_networking_secgroup.web_sg.id +} + +resource "vkcs_networking_secgroup" "lb_sg" { + name = "lb-sg" + description = "HTTP from internet" +} +resource "vkcs_networking_secgroup_rule" "lb_http" { + direction = "ingress" + protocol = "tcp" + port_range_min = 80 + port_range_max = 80 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = vkcs_networking_secgroup.lb_sg.id +} diff --git a/03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf b/03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..fa4b517 --- /dev/null +++ b/03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf @@ -0,0 +1,44 @@ +variable "my_ip" { + type = string + default = "95.26.148.233/32" +} + +variable "flavor_web" { + type = string + default = "25ae869c-be29-4840-8e12-99e046d2dbd4" +} + +variable "flavor_bastion" { + type = string + default = "df3c499a-044f-41d2-8612-d303adc613cc" +} + +variable "image_packer_id" { + type = string + default = "a31acc16-4703-468b-bc5b-bf07952f66b2" +} + +variable "ubuntu_image_name" { + type = string + default = "ubuntu-22-202602051629.gite7a38aaf" +} + +variable "ssh_public_key_path" { + type = string + default = "~/.ssh/id_rsa.pub" +} + +variable "keypair_name" { + type = string + default = "terraform-key-local" +} + +variable "ubuntu_image_id" { + type = string + default = "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d" +} + +variable "db_flavor_id" { + type = string + default = "2d9866a9-e955-4986-b00a-340ca54b2cac" +}