feat: Added lab 2

This commit is contained in:
Black_Raven committed 2026-06-17 15:26:19 +03:00
1 parent b599bd410b
commit ee54718ba0
19 files changed
+1359

No files matched your search

+18
View File
@@ -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,
1 file_name artifact_type module_or_lab task_code task_title relative_path evidence_for status comment
84 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
85 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
86 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
87 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
88 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
89 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
90 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
91 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
92 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
93 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
94 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
95 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
96 VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf CODE LR_02 main Terraform вычислительные ресурсы 03_code/VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf final
97 VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf CODE LR_02 main Terraform управляемая БД 03_code/VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf final
98 VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf CODE LR_02 main Terraform балансировщик 03_code/VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf final
99 VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf CODE LR_02 main Terraform сеть 03_code/VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf final
100 VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf CODE LR_02 main Terraform выходные переменные 03_code/VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf final
101 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
102 VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf CODE LR_02 main Terraform провайдер 03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf final
103 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
104 VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf CODE LR_02 main Terraform переменные 03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf final
105 00_manifest.csv MANIFEST all all Финальный манифест сдачи 00_manifest.csv final
@@ -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 | Переменные |
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -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
@@ -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
@@ -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",
]
@@ -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",
]
@@ -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 = ""
}
}
@@ -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
}
}
@@ -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,
]
}
@@ -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
}
@@ -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
}
@@ -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 веб-серверов"
}
@@ -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"]
}
@@ -0,0 +1,9 @@
terraform {
required_providers {
vkcs = {
source = "vk-cs/vkcs"
}
}
}
provider "vkcs" {}
@@ -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
}
@@ -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"
}