first commit
No files matched your search
@@ -0,0 +1,68 @@
|
|||||||
|
file_name,artifact_type,module_or_lab,task_code,task_title,relative_path,evidence_for,status,comment
|
||||||
|
VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,PR,M00,PR00,Настройка окружения,submission/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,Подтверждает выполнение демонстрации M00_PR00 (настройка среды),final,
|
||||||
|
VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,PR,LR_01,main,Высокодоступная веб-инфраструктура (ЛР1),submission/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №1,final,Был переименован из LR_04
|
||||||
|
VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,PR,M02,01,Демонстрация 2.1: Сети,submission/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.1 (создание VPC и подсетей),final,
|
||||||
|
VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,PR,M02,02,Демонстрация 2.2: Security Groups,submission/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.2 (настройка групп безопасности),final,
|
||||||
|
VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,PR,M02,03,Демонстрация 2.3: Балансировщик нагрузки,submission/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.3 (балансировщик и health checks),final,
|
||||||
|
VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,PR,M03,01,Демонстрация 3.1: Объектное хранилище S3,submission/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,Подтверждает выполнение демонстрации 3.1 (S3 бакет, статический хостинг),final,
|
||||||
|
VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,PR,M03,02,Демонстрация 3.2: Управляемая БД PostgreSQL,submission/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,Подтверждает выполнение демонстрации 3.2 (создание и подключение к БД),final,
|
||||||
|
VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,SSH подключение к первой ВМ,submission/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,Скриншот: SSH-соединение с ВМ,final,
|
||||||
|
VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Первая ВМ создана,submission/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,Скриншот: созданная ВМ в консоли,final,
|
||||||
|
VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI список ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,Скриншот: openstack server list,final,
|
||||||
|
VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI создание ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,Скриншот: openstack server create,final,
|
||||||
|
VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Настройки безопасности и 2FA,submission/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,Скриншот: 2FA или security settings,final,
|
||||||
|
VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 1,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 1,final,
|
||||||
|
VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 2,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 2,final,
|
||||||
|
VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform apply успех,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,Скриншот: terraform apply success,final,
|
||||||
|
VKC_LR_01_balancer_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Балансировщик нагрузки,submission/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png,Скриншот: балансировщик в консоли,final,
|
||||||
|
VKC_LR_01_bastion_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Бастионный хост,submission/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png,Скриншот: бастионный хост,final,
|
||||||
|
VKC_LR_01_DB_SecurityGroups_20260604.png,EVIDENCE,LR_01,main,Группы безопасности БД,submission/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png,Скриншот: Security Groups для БД,final,
|
||||||
|
VKC_LR_01_DB_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Инстанс базы данных,submission/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png,Скриншот: созданная БД,final,
|
||||||
|
VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Конфигурация VPC,submission/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,Скриншот: VPC и подсети,final,
|
||||||
|
VKC_LR_01_Prif_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Тест производительности,submission/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png,Скриншот: профилирование/тест,final,
|
||||||
|
VKC_LR_01_Router_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Настройки роутера,submission/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png,Скриншот: роутер и маршруты,final,
|
||||||
|
VKC_LR_01_VM_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Список виртуальных машин,submission/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png,Скриншот: список ВМ,final,
|
||||||
|
VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Детали сетевой карты,submission/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,Скриншот: network card details,final,
|
||||||
|
VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Terraform создание сети,submission/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,Скриншот: terraform network creation,final,
|
||||||
|
VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC и подсети (UI),submission/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,Скриншот: VPC and subnets UI,final,
|
||||||
|
VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC через OpenStack CLI,submission/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,Скриншот: openstack network list,final,
|
||||||
|
VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (OpenStack CLI),submission/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,Скриншот: openstack security group,final,
|
||||||
|
VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (Terraform),submission/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,Скриншот: terraform security group,final,
|
||||||
|
VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (UI),submission/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,Скриншот: security groups UI,final,
|
||||||
|
VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Проверка здоровья балансировщика,submission/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,Скриншот: health check proof,final,
|
||||||
|
VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик (Terraform код),submission/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,Скриншот: terraform load balancer code,final,
|
||||||
|
VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик создан,submission/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,Скриншот: load balancer created,final,
|
||||||
|
VKC_PR_M03_aws_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Вывод AWS CLI,submission/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log,Лог: AWS CLI output,final,
|
||||||
|
VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,EVIDENCE,M03,01,S3 бакет,submission/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,Скриншот: S3 bucket,final,
|
||||||
|
VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Созданная БД (скриншот),submission/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,Скриншот: database creation,final,
|
||||||
|
VKC_PR_M03_index_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Главная страница,submission/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png,Скриншот: index page,final,
|
||||||
|
VKC_PR_M03_terraform_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Лог выполнения Terraform,submission/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log,Лог: terraform output,final,
|
||||||
|
VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Лог базы данных,submission/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,Лог: database log,final,
|
||||||
|
VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,EVIDENCE,M03,02,OpenStack CLI (БД),submission/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,Лог: openstack database commands,final,
|
||||||
|
VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Terraform для БД (лог),submission/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,Лог: terraform db apply,final,
|
||||||
|
VKC_LR_01_compute_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform compute,submission/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf,Код: вычислительные ресурсы,final,
|
||||||
|
VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform балансировщик,submission/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,Код: load balancer,final,
|
||||||
|
VKC_LR_01_network_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform сеть,submission/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf,Код: network,final,
|
||||||
|
VKC_LR_01_outputs_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform outputs,submission/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf,Код: outputs,final,
|
||||||
|
VKC_LR_01_provider_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform provider,submission/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf,Код: provider,final,
|
||||||
|
VKC_LR_01_security_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform security groups,submission/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf,Код: security groups,final,
|
||||||
|
VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,CODE,LR_01,main,Terraform переменные (значения),submission/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,Код: tfvars values,final,
|
||||||
|
VKC_LR_01_variables_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform переменные (декларация),submission/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf,Код: variables,final,
|
||||||
|
VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,PR,LR_05,main,Резервное копирование и восстановление БД (ЛР5),submission/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №5,final,
|
||||||
|
VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,PR,M04,01,Демонстрация 4.1: Управление образами ВМ,submission/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.1 (работа с образами ВМ),final,
|
||||||
|
VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,PR,M04,02,Демонстрация 4.2: Работа с API через curl,submission/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.2 (вызов API),final,
|
||||||
|
VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Инстанс базы данных для ЛР5,submission/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,Скриншот: инстанс БД,final,
|
||||||
|
VKC_LR_05_Backups_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Бакет S3 с бэкапами,submission/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png,Скриншот: бакет с бэкапами,final,
|
||||||
|
VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Список резервных копий,submission/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,Скриншот: список бэкапов,final,
|
||||||
|
VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Восстановление из бэкапа,submission/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,Скриншот: процесс восстановления,final,
|
||||||
|
VKC_LR_05_PITR_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Настройка PITR,submission/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png,Скриншот: Point-in-Time Recovery,final,
|
||||||
|
VKC_LR_05_S3_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Экспорт в S3,submission/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png,Скриншот: экспорт бэкапа в S3,final,
|
||||||
|
VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Расширенное создание ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,Скриншот: созданная ВМ cli-advanced-vm,final,
|
||||||
|
VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Созданный образ my-custom-image,submission/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,Скриншот: образ в консоли,final,
|
||||||
|
VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,Лог: openstack server create,final,
|
||||||
|
VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания образа ВМ,submission/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,Лог: создание снапшота,final,
|
||||||
|
VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,EVIDENCE,M04,02,Создание ВМ через API (скриншот),submission/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,Скриншот: успешный ответ API,final,
|
||||||
|
VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Получение токена аутентификации,submission/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,Лог: получение X-Subject-Token,final,
|
||||||
|
VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Лог создания ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,Лог: POST запрос к /servers,final,
|
||||||
|
VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,Лог: GET /servers,final,
|
||||||
|
VKC_LR_05_DB_РемизовКЛ_20260610.tf,CODE,LR_05,main,Terraform конфигурация управляемой БД,submission/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf,Код: terraform для БД ЛР5,final,
|
||||||
|
@@ -0,0 +1,197 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: ENV
|
||||||
|
module: M00
|
||||||
|
task_code: PR00
|
||||||
|
task_title: Настройка учебной среды
|
||||||
|
student_fio: Ремизов Кирилл
|
||||||
|
date: 26.05.2026
|
||||||
|
source_docs:
|
||||||
|
- Д1
|
||||||
|
- Д2
|
||||||
|
- Д7
|
||||||
|
- Д8
|
||||||
|
attached_files:
|
||||||
|
- VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png
|
||||||
|
- VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png
|
||||||
|
- VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png
|
||||||
|
- VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png
|
||||||
|
- VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png
|
||||||
|
- VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png
|
||||||
|
- VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчёт по настройке учебной среды
|
||||||
|
|
||||||
|
## 1. Что было сделано
|
||||||
|
|
||||||
|
- Создан аккаунт VK Cloud (`remizov.kirill2005@yandex.ru`) с проектом `mcs3340419193`. Для аккаунта включена двухфакторная аутентификация.
|
||||||
|
- Создана первая виртуальная машина через веб-интерфейс VK Cloud.
|
||||||
|
- Выполнено подключение к ВМ по SSH.
|
||||||
|
- Создана виртуальная машина с помощью OpenStack CLI.
|
||||||
|
- Создана виртуальная машина с помощью Terraform.
|
||||||
|
|
||||||
|
## 2. Выполненные шаги
|
||||||
|
|
||||||
|
### 1. Создание и настройка аккаунта в VK Cloud
|
||||||
|
|
||||||
|
1. **Регистрация** – через [страницу регистрации VK Cloud](https://cloud.vk.com/authapp/signup?region_name=RegionOne).
|
||||||
|
2. **Верификация** – подтверждены адрес электронной почты и номер телефона.
|
||||||
|
3. **Безопасность** – включена двухфакторная аутентификация.
|
||||||
|

|
||||||
|
### 2. Создание первой ВМ через веб-интерфейс
|
||||||
|
|
||||||
|
1. Переход: «Облачные вычисления» → «Виртуальные машины» → кнопка «Создать инстанс».
|
||||||
|
2. Создана ВМ `my-first-vm` со следующими параметрами:
|
||||||
|
- ОС: Ubuntu 24.04
|
||||||
|
- Тип ВМ: STD3-1-2
|
||||||
|
- Зона доступности: PA2
|
||||||
|
- Размер диска: 12 ГБ
|
||||||
|
- Firewall: все разрешено
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 3. Подключение к ВМ по SSH
|
||||||
|
|
||||||
|
1. Приватный ключ скачан автоматически при создании ВМ.
|
||||||
|
2. Выданы права на ключ: `chmod 400`.
|
||||||
|
3. Подключение выполнено командой:
|
||||||
|
```bash
|
||||||
|
ssh -i ~/pemkeys/my-first-vm-ie9Ev9Cc.pem ubuntu@95.163.214.61
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 4. Создание ВМ с помощью OpenStack CLI
|
||||||
|
|
||||||
|
1. Подготовлено виртуальное окружение (файл `shell.nix`).
|
||||||
|
2. Загружены переменные окружения:
|
||||||
|
```bash
|
||||||
|
source ~/Загрузки/mcs3340419193-openrc.sh
|
||||||
|
```
|
||||||
|
3. Выполнена команда создания ВМ:
|
||||||
|
```bash
|
||||||
|
openstack server create \
|
||||||
|
--flavor Basic-1-1-10 \
|
||||||
|
--image "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d" \
|
||||||
|
--network "ec8c610e-6387-447e-83d2-d2c541e88164" \
|
||||||
|
--key-name my-first-vm-ie9Ev9Cc \
|
||||||
|
cli-created-vm
|
||||||
|
```
|
||||||
|
4. Проверено, что сервер создан и работает.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### 5. Создание ВМ с помощью Terraform
|
||||||
|
|
||||||
|
1. Подготовлено виртуальное окружение (файл `shell.nix`).
|
||||||
|
2. Создан файл `main.tf` по предоставленному шаблону.
|
||||||
|
3. Изучена документация Terraform после возникновения ошибок.
|
||||||
|
4. Скачан файл конфигурации Terraform из настроек проекта.
|
||||||
|
5. Финальная конфигурация `main.tf`:
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = {
|
||||||
|
source = "vk-cs/vkcs"
|
||||||
|
version = "~> 0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "vkcs" {
|
||||||
|
username = "<Логин из настроек проекта / Terraform>"
|
||||||
|
password = "<Пароль>"
|
||||||
|
project_id = "<ID проекта>"
|
||||||
|
region = "<Регион, например RegionOne>"
|
||||||
|
auth_url = "https://infra.mail.ru:35357/v3/"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_keypair" "my_key" {
|
||||||
|
name = "terraform-key"
|
||||||
|
public_key = file("~/.ssh/terraform_rsa.pub")
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_instance" "terraform_vm" {
|
||||||
|
name = "terraform-created-vm"
|
||||||
|
flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc"
|
||||||
|
image_name = "ubuntu-22-202602051629.gite7a38aaf"
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = "ec8c610e-6387-447e-83d2-d2c541e88164"
|
||||||
|
}
|
||||||
|
|
||||||
|
key_pair = vkcs_compute_keypair.my_key.name
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
environment = "dev"
|
||||||
|
created_by = "terraform"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "vm_ip" {
|
||||||
|
value = vkcs_compute_instance.terraform_vm.access_ip_v4
|
||||||
|
}
|
||||||
|
|
||||||
|
output "vm_name" {
|
||||||
|
value = vkcs_compute_instance.terraform_vm.name
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Выполнены команды:
|
||||||
|
```bash
|
||||||
|
terraform init
|
||||||
|
terraform plan
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## 3. Доказательства
|
||||||
|
|
||||||
|
- Скриншот создания первой ВМ:
|
||||||
|

|
||||||
|
- Скриншот SSH-подключения:
|
||||||
|

|
||||||
|
- ВМ, созданная через OpenStack CLI (список):
|
||||||
|

|
||||||
|
- Детали CLI-ВМ:
|
||||||
|

|
||||||
|
- Процесс Terraform `plan`:
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
- Результат `terraform apply`:
|
||||||
|

|
||||||
|
|
||||||
|
## 4. Проверка готовности
|
||||||
|
|
||||||
|
- [x] Вход в аккаунт выполнен (учётная запись `remizov.kirill2005@yandex.ru`, проект `mcs3340419193`).
|
||||||
|
- [x] Двухфакторная аутентификация включена.
|
||||||
|
- [x] SSH-ключ создан (использован ключ `my-first-vm-ie9Ev9Cc.pem` для ручного доступа и ключ `terraform-key` для Terraform).
|
||||||
|
- [x] Рабочая папка создана (присутствуют `shell.nix`, `main.tf`, `openrc.sh` и другие файлы конфигурации).
|
||||||
|
|
||||||
|
## 5. Замечания и риски
|
||||||
|
|
||||||
|
| № | Замечание / риск | Вероятность | Влияние | Меры предотвращения / комментарий |
|
||||||
|
|---|------------------|-------------|---------|------------------------------------|
|
||||||
|
| 1 | При использовании Terraform возникли ошибки из-за неверного синтаксиса или версии провайдера | Средняя | Высокое | Изучена документация, конфигурация приведена к рабочему виду. В будущем использовать актуальные примеры от VK Cloud. |
|
||||||
|
| 2 | Открытый SSH-ключ `terraform_rsa.pub` хранится на диске – возможен случайный доступ | Низкая | Среднее | Ключ используется только для учебных целей. Рекомендуется не публиковать его в открытых репозиториях. |
|
||||||
|
| 3 | В правилах файрвола первой ВМ разрешён весь трафик – потенциальная угроза безопасности | Высокая (в учебной среде) | Среднее | Для production-сред настраивать минимально необходимые правила. В учебном проекте допустимо. |
|
||||||
|
| 4 | Пароль от учётной записи VK Cloud может быть скомпрометирован при сохранении в открытом виде | Низкая | Критическое | Используется 2FA. Пароль не хранится в коде, передаётся через переменные окружения. |
|
||||||
|
| 5 | Квоты проекта могут быть исчерпаны при создании нескольких ВМ | Низкая | Низкое | В рамках задания создано три ВМ. При необходимости можно удалять неиспользуемые экземпляры. |
|
||||||
|
|
||||||
|
## 6. Вывод
|
||||||
|
|
||||||
|
Учебная среда VK Cloud полностью настроена. Выполнены все предусмотренные задания:
|
||||||
|
- зарегистрирован аккаунт с двухфакторной аутентификацией,
|
||||||
|
- созданы виртуальные машины тремя способами: через веб-интерфейс, OpenStack CLI и Terraform,
|
||||||
|
- отработано подключение по SSH,
|
||||||
|
- получены практические навыки работы с облачной платформой и инструментами автоматизации.
|
||||||
|
|
||||||
|
Все действия подтверждены скриншотами. Система готова к выполнению следующих лабораторных работ модуля `M00`.
|
||||||
@@ -0,0 +1,305 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: LR
|
||||||
|
lab_code: 1
|
||||||
|
lab_title: Развертывание отказоустойчивой веб-инфраструктуры
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-04
|
||||||
|
source_docs:
|
||||||
|
- 5-Задания для лабораторных работ -VK-1.md
|
||||||
|
attached_files:
|
||||||
|
- VKC_LR_01_compute_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_network_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_provider_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars
|
||||||
|
- VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_outputs_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_security_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_variables_РемизовКЛ_20260604.tf
|
||||||
|
- VKC_LR_01_balancer_РемизовКЛ_20260604.png
|
||||||
|
- VKC_LR_01_bastion_РемизовКЛ_20260604.png
|
||||||
|
- VKC_LR_01_DB_SecurityGroups_20260604.png
|
||||||
|
- VKC_LR_01_DB_РемизовКЛ_20260604.png
|
||||||
|
- VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png
|
||||||
|
- VKC_LR_01_Prif_РемизовКЛ_20260604.png
|
||||||
|
- VKC_LR_01_Router_РемизовКЛ_20260604.png
|
||||||
|
- VKC_LR_01_VM_РемизовКЛ_20260604.png
|
||||||
|
estimated_cost_rub: 84
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по лабораторной работе
|
||||||
|
|
||||||
|
## 1. Цель работы
|
||||||
|
Спроектировать и развернуть отказоустойчивую архитектуру для веб-приложения, включающую:
|
||||||
|
- Изолированную сеть (VPC) с публичной и приватной подсетями.
|
||||||
|
- Два веб-сервера в приватной подсети.
|
||||||
|
- Балансировщик нагрузки в публичной подсети.
|
||||||
|
- Управляемую базу данных PostgreSQL в приватной подсети.
|
||||||
|
- Бастионный хост для безопасного доступа к внутренним ресурсам.
|
||||||
|
|
||||||
|
Инфраструктура реализована комбинированным способом: сеть, группы безопасности и балансировщик описаны в Terraform; виртуальные машины и база данных созданы вручную через интерфейс VK Cloud.
|
||||||
|
|
||||||
|
## 2. Используемые ресурсы
|
||||||
|
| Ресурс | Тип | Параметры | Назначение |
|
||||||
|
|---|---|---|---|
|
||||||
|
| VPC | vkcs_networking_network | Имя: `lab1-vpc` | Изолированная сеть |
|
||||||
|
| Публичная подсеть | vkcs_networking_subnet | Имя: `lab1-public`, CIDR: 10.0.1.0/24 | Размещение балансировщика и бастиона |
|
||||||
|
| Приватная подсеть | vkcs_networking_subnet | Имя: `lab1-private`, CIDR: 10.0.2.0/24 | Размещение веб-серверов и БД |
|
||||||
|
| Бастионный хост | Виртуальная машина (ручное создание) | Ubuntu 22.04, публичная подсеть | Единая точка входа SSH |
|
||||||
|
| Веб-сервер `web-1` | Виртуальная машина (ручное создание) | Ubuntu 22.04, 1 vCPU, 1GB RAM, приватная подсеть | Обработка HTTP-запросов |
|
||||||
|
| Веб-сервер `web-2` | Виртуальная машина (ручное создание) | Ubuntu 22.04, 1 vCPU, 1GB RAM, приватная подсеть | Обработка HTTP-запросов |
|
||||||
|
| Балансировщик | vkcs_lb_loadbalancer | Имя: `lab1-lb`, публичная подсеть | Распределение трафика между веб-серверами |
|
||||||
|
| Целевая группа | vkcs_lb_pool | `web-targets`, ROUND_ROBIN, порт 80 | Группа веб-серверов |
|
||||||
|
| Монитор здоровья | vkcs_lb_monitor | HTTP, интервал 10 с, путь `/` | Проверка доступности веб-серверов |
|
||||||
|
| Security Group (бастион) | vkcs_networking_secgroup | `bastion-sg`: SSH (22) с моего IP | Защита бастиона |
|
||||||
|
| Security Group (web) | vkcs_networking_secgroup | `web-sg`: SSH с бастиона, HTTP с балансировщика | Изоляция веб-серверов |
|
||||||
|
| Security Group (lb) | vkcs_networking_secgroup | `lb-sg`: HTTP (80) из интернета | Доступ к балансировщику |
|
||||||
|
| Управляемая БД | PostgreSQL (ручное создание) | Версия 15, 1 vCPU, 2 GB RAM, приватная подсеть | Хранение данных приложения |
|
||||||
|
|
||||||
|
## 3. Схема архитектуры
|
||||||
|
- **Файл схемы:** встроенное текстовое описание + скриншоты из консоли VK Cloud.
|
||||||
|
- **Краткое описание:**
|
||||||
|
Интернет-трафик приходит на публичный IP балансировщика, расположенного в публичной подсети (10.0.1.0/24). Балансировщик распределяет запросы между двумя веб-серверами в приватной подсети (10.0.2.0/24). Веб-серверы обращаются к управляемой БД PostgreSQL, также находящейся в приватной подсети. Доступ по SSH к веб-серверам и БД возможен только через бастионный хост (публичная подсеть).
|
||||||
|
|
||||||
|
**Скриншоты, подтверждающие архитектуру:**
|
||||||
|
- Роутер с подключенными интерфейсами: ![[VKC_LR_01_Router_РемизовКЛ_20260604.png]]
|
||||||
|
- Сеть `lab1-vpc` с подсетями: ![[VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png]]
|
||||||
|
- Бастионный хост: ![[VKC_LR_01_bastion_РемизовКЛ_20260604.png]]
|
||||||
|
- Веб-серверы: ![[VKC_LR_01_VM_РемизовКЛ_20260604.png]]
|
||||||
|
- Балансировщик: ![[VKC_LR_01_balancer_РемизовКЛ_20260604.png]]
|
||||||
|
- База данных: ![[VKC_LR_01_DB_РемизовКЛ_20260604.png]]
|
||||||
|
- Правила Security Groups: ![[VKC_LR_01_DB_SecurityGroups_20260604.png]]
|
||||||
|
- Запрос через бастион к БД: ![[VKC_LR_01_Prif_РемизовКЛ_20260604.png]]
|
||||||
|
|
||||||
|
## 4. Ход выполнения
|
||||||
|
|
||||||
|
### Шаг 1. Создание VPC и подсетей (Terraform)
|
||||||
|
**Что сделано:**
|
||||||
|
Написан Terraform-манифест `network.tf`, который создаёт VPC `lab1-vpc`, публичную подсеть `lab1-public` (10.0.1.0/24) и приватную подсеть `lab1-private` (10.0.2.0/24). Подсети подключены к существующему роутеру, что обеспечивает доступ в интернет для публичной подсети и NAT-маршрутизацию для приватной.
|
||||||
|
|
||||||
|
**Команды / настройки:**
|
||||||
|
```hcl
|
||||||
|
# network.tf
|
||||||
|
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
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Результат:**
|
||||||
|
VPC и обе подсети созданы, публичная подсеть имеет доступ в интернет через роутер, приватная — только исходящий через NAT (без входящего из интернета).
|
||||||
|
|
||||||
|
### Шаг 2. Настройка безопасности (Terraform + ручное создание бастиона)
|
||||||
|
**Что сделано:**
|
||||||
|
- Написаны Security Groups в `security.tf`:
|
||||||
|
- `bastion-sg`: разрешён SSH только с моего IP (95.37.52.68/32).
|
||||||
|
- `web-sg`: разрешён SSH только с `bastion-sg`, HTTP только с `lb-sg`.
|
||||||
|
- `lb-sg`: разрешён HTTP из интернета (0.0.0.0/0).
|
||||||
|
- Бастионный хост создан вручную в публичной подсети с привязкой `bastion-sg` и ключом SSH.
|
||||||
|
|
||||||
|
**Команды / настройки:**
|
||||||
|
```hcl
|
||||||
|
# security.tf (фрагмент)
|
||||||
|
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 # 95.37.52.68/32
|
||||||
|
security_group_id = vkcs_networking_secgroup.bastion_sg.id
|
||||||
|
}
|
||||||
|
# Аналогично для web_sg и lb_sg
|
||||||
|
```
|
||||||
|
**Результат:**
|
||||||
|
Бастион доступен по SSH с моего IP. Веб-серверы и БД недоступны напрямую из интернета, доступ к ним возможен только через бастион.
|
||||||
|
|
||||||
|
### Шаг 3. Развертывание веб-серверов (ручное через консоль VK Cloud)
|
||||||
|
**Что сделано:**
|
||||||
|
В приватной подсети созданы две ВМ `web-1` и `web-2` (Ubuntu 22.04, 1vCPU, 1GB RAM). При создании указан user-data скрипт для установки и настройки NGINX с индивидуальной страницей, отображающей hostname.
|
||||||
|
|
||||||
|
**Команды / настройки (user-data):**
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
apt update
|
||||||
|
apt install -y nginx
|
||||||
|
echo "<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Web Server $(hostname)</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>Welcome to $(hostname)</h1>
|
||||||
|
<p>Server IP: $(hostname -I | awk '{print $1}')</p>
|
||||||
|
<p>Backend server</p>
|
||||||
|
</body>
|
||||||
|
</html>" > /var/www/html/index.html
|
||||||
|
systemctl enable nginx
|
||||||
|
systemctl start nginx
|
||||||
|
```
|
||||||
|
**Результат:**
|
||||||
|
Обе ВМ активны, NGINX работает. С бастиона выполнены `curl http://10.0.2.5` и `curl http://10.0.2.6` – возвращаются страницы с именами `web-1` и `web-2`.
|
||||||
|
|
||||||
|
### Шаг 4. Настройка балансировщика нагрузки (Terraform + ручное добавление членов)
|
||||||
|
**Что сделано:**
|
||||||
|
- Terraform создаёт балансировщик `lab1-lb` в публичной подсети, HTTP-слушатель на порту 80, целевую группу `web-targets` с алгоритмом ROUND_ROBIN и health monitor (HTTP, `/`, интервал 10 с).
|
||||||
|
- Веб-серверы добавлены в целевую группу вручную через интерфейс VK Cloud (или через OpenStack CLI), так как ресурс `vkcs_lb_member` не был включён в Terraform.
|
||||||
|
|
||||||
|
**Команды / настройки:**
|
||||||
|
```hcl
|
||||||
|
# loadbalancer.tf
|
||||||
|
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
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Результат:**
|
||||||
|
Балансировщик получил публичный IP. В целевую группу добавлены оба веб-сервера, их статус – Healthy. При открытии публичного IP в браузере страницы чередуются между `web-1` и `web-2`.
|
||||||
|
|
||||||
|
### Шаг 5. Развертывание базы данных (ручное через консоль VK Cloud)
|
||||||
|
**Что сделано:**
|
||||||
|
Создан управляемый инстанс PostgreSQL 15 (1 vCPU, 2GB RAM) в приватной подсети. Созданы пользователь `webapp` и база данных `webapp_db`. С бастиона выполнено подключение, создана тестовая таблица `visitors` и вставлена запись.
|
||||||
|
|
||||||
|
**Команды / настройки:**
|
||||||
|
```sql
|
||||||
|
CREATE TABLE visitors (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
ip_address INET,
|
||||||
|
visit_time TIMESTAMP DEFAULT NOW(),
|
||||||
|
user_agent TEXT
|
||||||
|
);
|
||||||
|
INSERT INTO visitors (ip_address) VALUES ('10.0.1.10'::inet);
|
||||||
|
SELECT * FROM visitors;
|
||||||
|
```
|
||||||
|
**Результат:**
|
||||||
|
Подключение с бастиона успешно, таблица создана, данные вставлены. БД изолирована в приватной сети.
|
||||||
|
|
||||||
|
### Шаг 6. Очистка ресурсов
|
||||||
|
**Что сделано:**
|
||||||
|
Ресурсы удалены в обратном порядке: балансировщик → веб-серверы → бастион → инстанс БД → Security Groups → VPC и подсети.
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
В проекте нет активных ресурсов, биллинг не показывает начислений за оставленные ресурсы.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
| Критерий | Статус | Подтверждение |
|
||||||
|
|---|---|---|
|
||||||
|
| VPC создана | ✅ | Скриншот сети `lab1-vpc` |
|
||||||
|
| Обе подсети созданы, CIDR корректны | ✅ | Скриншот подсетей 10.0.1.0/24 и 10.0.2.0/24 |
|
||||||
|
| Публичная подсеть имеет доступ в интернет | ✅ | Роутер подключён к публичной подсети |
|
||||||
|
| Приватная подсеть не имеет прямого доступа из интернета | ✅ | Отсутствие интернет-шлюза, правила SG |
|
||||||
|
| Все Security Groups созданы с правильными правилами | ✅ | Скриншот правил файервола |
|
||||||
|
| Бастионный хост доступен по SSH | ✅ | Подключение с моего IP успешно |
|
||||||
|
| Обе ВМ созданы, активны, nginx запущен | ✅ | Страницы доступны с бастиона |
|
||||||
|
| Балансировщик создан, публичный IP, Healthy | ✅ | Целевая группа показывает Healthy, страницы чередуются |
|
||||||
|
| PostgreSQL создан, подключение успешно | ✅ | Выполнен SELECT из таблицы visitors |
|
||||||
|
|
||||||
|
## 6. Ответы на вопросы задания
|
||||||
|
|
||||||
|
1. **Вопрос:** Какие IP-адреса зарезервированы в подсети и для чего?
|
||||||
|
**Ответ:** В подсети с CIDR /24 зарезервированы: первый адрес (10.0.x.0) – адрес сети; второй (10.0.x.1) – шлюз по умолчанию (роутер); третий (10.0.x.2) – DNS/DHCP сервер. Остальные адреса доступны для ВМ.
|
||||||
|
|
||||||
|
2. **Вопрос:** Почему приватная подсеть не имеет прямого доступа из интернета?
|
||||||
|
**Ответ:** Приватная подсеть не подключена к интернет-шлюзу напрямую, а все входящие соединения блокируются на уровне роутера и правил security groups, что изолирует внутренние ресурсы.
|
||||||
|
|
||||||
|
3. **Вопрос:** Почему SSH на веб-серверы разрешен только с бастиона?
|
||||||
|
**Ответ:** Это реализует схему jump host – все административные подключения идут через единственную защищённую точку входа, уменьшая атакующую поверхность.
|
||||||
|
|
||||||
|
4. **Вопрос:** Какое правило разрешает веб-серверу обновлять систему?
|
||||||
|
**Ответ:** Исходящий трафик (egress) по умолчанию разрешён полностью в security groups, поэтому веб-сервер может обращаться к репозиториям пакетов.
|
||||||
|
|
||||||
|
5. **Вопрос:** Как проверить, что nginx запущен, не подключаясь к ВМ?
|
||||||
|
**Ответ:** Через health check балансировщика, через систему мониторинга (например, Prometheus) или через API VK Cloud, если оно поддерживает проверку состояния сервиса.
|
||||||
|
|
||||||
|
6. **Вопрос:** Что произойдет с веб-сервером после перезагрузки ВМ?
|
||||||
|
**Ответ:** Так как использован `systemctl enable nginx`, сервис автоматически запустится при старте, и страница останется доступной.
|
||||||
|
|
||||||
|
7. **Вопрос:** Какой алгоритм балансировки используется по умолчанию?
|
||||||
|
**Ответ:** В конфигурации указан `ROUND_ROBIN` – циклическое переключение между серверами.
|
||||||
|
|
||||||
|
8. **Вопрос:** Что произойдет, если одна из ВМ перестанет отвечать на health check?
|
||||||
|
**Ответ:** Балансировщик перестанет направлять трафик на эту ВМ до тех пор, пока она снова не начнёт проходить проверку. Это обеспечивает отказоустойчивость.
|
||||||
|
|
||||||
|
9. **Вопрос:** Почему БД размещена в приватной подсети, а не в публичной?
|
||||||
|
**Ответ:** Для безопасности – база данных не должна быть напрямую доступна из интернета, чтобы снизить риск атак (SQL-инъекции, перебор паролей). Доступ возможен только из приватной сети, где находятся веб-серверы и бастион.
|
||||||
|
|
||||||
|
10. **Вопрос:** Какие преимущества дает использование управляемой БД вместо установки на ВМ?
|
||||||
|
**Ответ:** Автоматическое резервное копирование, мониторинг, патчи безопасности, масштабирование, высокая доступность (при выборе конфигурации с репликами), отсутствие необходимости в ручном администрировании.
|
||||||
|
|
||||||
|
## 7. Приложенные файлы
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
|---|---|---|
|
||||||
|
| `network.tf` | Terraform конфигурация | Создание VPC, подсетей, подключение к роутеру |
|
||||||
|
| `security.tf` | Terraform конфигурация | Создание Security Groups и правил |
|
||||||
|
| `variables.tf` | Terraform переменные | Параметры (мой IP, flavor, образ, ключ) |
|
||||||
|
| `compute.tf` | Terraform конфигурация | Создание ключевой пары (не использовалась для ВМ, но описана) |
|
||||||
|
| `outputs.tf` | Terraform output | Вывод публичного IP балансировщика |
|
||||||
|
| `loadbalancer.tf` | Terraform конфигурация | Создание балансировщика, слушателя, пула, монитора |
|
||||||
|
| Скриншоты (Pasted image ...) | Изображения | Визуальное подтверждение создания ресурсов |
|
||||||
|
|
||||||
|
## 8. Ошибки, риски, доработки
|
||||||
|
- **Ошибки:** Не было ошибок при выполнении. Однако при использовании Terraform пришлось вручную добавлять члены целевой группы, так как ресурс `vkcs_lb_member` не был описан – это осознанное упрощение для демонстрации гибридного подхода.
|
||||||
|
- **Риски:** При длительном хранении неудалённых ресурсов возрастут затраты. Риск сбоя health check при перегрузке веб-серверов – тогда балансировщик исключит их из пула, но при корректной настройке это лишь повысит отказоустойчивость.
|
||||||
|
- **Доработки:** В следующих лабораторных работах стоит полностью описывать все ресурсы в Terraform (включая членов LB) и использовать Packer для кастомизированных образов, что ускорит развёртывание.
|
||||||
|
|
||||||
|
## 9. Затраты
|
||||||
|
- **Оценка стоимости:** За время выполнения (~6 часов) ориентировочная стоимость составила:
|
||||||
|
- 2 веб-ВМ + бастион: ~5 руб/час × 6 = 30 руб
|
||||||
|
- Управляемая БД: ~8 руб/час × 6 = 48 руб
|
||||||
|
- Балансировщик, сеть, SG: ~1 руб/час × 6 = 6 руб
|
||||||
|
- **Итого:** ~84 руб.
|
||||||
|
- **Время жизни ресурсов:** ~6 часов (с момента создания до удаления).
|
||||||
|
- **Все ли ресурсы удалены:** Да, все ресурсы (VPC, подсети, ВМ, БД, балансировщик, security groups) удалены. Биллинг не показывает активных начислений.
|
||||||
|
|
||||||
|
## 10. Вывод
|
||||||
|
В ходе лабораторной работы спроектирована и развёрнута отказоустойчивая веб-инфраструктура в VK Cloud с использованием комбинированного подхода: Terraform для сетевых компонентов и безопасности, ручное создание для ВМ и БД. Архитектура включает публичный балансировщик, два веб-сервера в приватной сети, изолированную базу данных и бастионный хост. Все критерии успеха выполнены, ресурсы удалены. Полученный опыт является основой для дальнейшей автоматизации (Terraform + Packer) и настройки мониторинга, что будет реализовано в следующих лабораторных работах.
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: LR
|
||||||
|
lab_code: 5
|
||||||
|
lab_title: Резервное копирование и восстановление базы данных
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-10
|
||||||
|
source_docs:
|
||||||
|
- 5-Задания для лабораторных работ -VK-1.md
|
||||||
|
attached_files:
|
||||||
|
- VKC_LR_05_S3_РемизовКЛ_20260610.png
|
||||||
|
- VKC_LR_05_PITR_РемизовКЛ_20260610.png
|
||||||
|
- VKC_LR_05_DBInstance_РемизовКЛ_20260610.png
|
||||||
|
- VKC_LR_05_Backups_РемизовКЛ_20260610.png
|
||||||
|
- VKC_LR_05_BackupDB_РемизовКЛ_20260610.png
|
||||||
|
- VKC_LR_05_DB_РемизовКЛ_20260610.tf
|
||||||
|
estimated_cost_rub: 84
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по лабораторной работе №5
|
||||||
|
|
||||||
|
## 1. Цель работы
|
||||||
|
Освоить стратегии резервного копирования и восстановления управляемой базы данных PostgreSQL в VK Cloud:
|
||||||
|
- Настроить автоматическое резервное копирование (включая Point-in-Time Recovery — PITR).
|
||||||
|
- Создать и восстановить базу данных из резервной копии.
|
||||||
|
- Организовать хранение бэкапов в объектном хранилище S3.
|
||||||
|
- Отработать сценарий восстановления после сбоя (Disaster Recovery).
|
||||||
|
|
||||||
|
Инфраструктура реализована комбинированным способом: инстанс БД развернут с помощью Terraform (из-за ошибки при ручном создании), а управление бэкапами и PITR выполнено через панель управления VK Cloud.
|
||||||
|
|
||||||
|
## 2. Используемые ресурсы
|
||||||
|
| Ресурс | Тип | Параметры | Назначение |
|
||||||
|
|--------|-----|-----------|-------------|
|
||||||
|
| Инстанс PostgreSQL | Managed DBaaS | 1 vCPU, 2 GB RAM, диск 10 GB | Хранение данных приложения |
|
||||||
|
| Бакет S3 | Object Storage | Стандартный класс, приватный доступ | Хранение резервных копий БД |
|
||||||
|
| Terraform | IaC (файл `.tf`) | Провайдер vkcs | Создание инстанса БД |
|
||||||
|
| Автоматические бэкапы | Managed Backup | Retention 7 дней (по заданию) | Ежедневное резервное копирование |
|
||||||
|
| PITR | Point-in-Time Recovery | Окно 24 часа (максимум) | Восстановление на произвольный момент времени |
|
||||||
|
|
||||||
|
## 3. Схема архитектуры
|
||||||
|
**Логическая схема:**
|
||||||
|
- Управляемый инстанс PostgreSQL размещён в приватной сети VK Cloud.
|
||||||
|
- Автоматические резервные копии (full + WAL) сохраняются в выделенный бакет S3 провайдера.
|
||||||
|
- Настроена политика хранения бэкапов (retention) и возможность PITR.
|
||||||
|
- Создан дополнительный бакет для ручных/экспортированных бэкапов (опционально).
|
||||||
|
- При восстановлении создаётся новый инстанс БД из выбранной копии или на заданный момент времени.
|
||||||
|
|
||||||
|
**Визуальное подтверждение:**
|
||||||
|
- Инстанс БД: ![[VKC_LR_05_DBInstance_РемизовКЛ_20260610.png]]
|
||||||
|
- Список бэкапов: ![[VKC_LR_05_BackupsList_РемизовКЛ_20260610.png]]
|
||||||
|
- Бакет с бэкапами: ![[VKC_LR_05_Backups_РемизовКЛ_20260610.png]]
|
||||||
|
- Восстановление из бэкапа: ![[VKC_LR_05_BackupDB_РемизовКЛ_20260610.png]]
|
||||||
|
- Настройка PITR: ![[VKC_LR_05_PITR_РемизовКЛ_20260610.png]]
|
||||||
|
|
||||||
|
## 4. Ход выполнения
|
||||||
|
|
||||||
|
### Этап 1. Создание инстанса PostgreSQL и настройка автоматических бэкапов
|
||||||
|
**Что сделано:**
|
||||||
|
Инстанс БД создан с помощью Terraform, так как при попытке ручного создания через консоль возникала ошибка `Object object` (некорректное отображение параметров). Terraform-конфигурация `VKC_LR_05_DB_РемизовКЛ_20260610.tf` описывает ресурс `vkcs_db_instance` с параметрами: версия PostgreSQL 15, 1 vCPU, 2 GB RAM, диск 10 GB, подключение к приватной подсети.
|
||||||
|
|
||||||
|
**Ключевые настройки бэкапов (через панель управления):**
|
||||||
|
- Включено автоматическое ежедневное резервное копирование.
|
||||||
|
- Задан retention (срок хранения) — 7 дней (согласно заданию). Однако для PITR максимальное окно составило 24 часа (ограничение платформы).
|
||||||
|
- Бэкапы автоматически сохраняются в служебный бакет S3 провайдера.
|
||||||
|
- Дополнительно создан пользовательский бакет для возможного экспорта ручных дампов.
|
||||||
|
|
||||||
|
**Команды / настройки (фрагмент Terraform):**
|
||||||
|
```hcl
|
||||||
|
resource "vkcs_db_instance" "postgres" {
|
||||||
|
name = "lab5-postgres"
|
||||||
|
flavor_id = "db1.small"
|
||||||
|
datastore {
|
||||||
|
version = "15"
|
||||||
|
type = "postgresql"
|
||||||
|
}
|
||||||
|
volume {
|
||||||
|
size = 10
|
||||||
|
type = "ceph-ssd"
|
||||||
|
}
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.main.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Результат:**
|
||||||
|
Инстанс успешно создан, автоматические бэкапы начали формироваться. Скриншот списка бэкапов показывает наличие ежедневных копий.
|
||||||
|
|
||||||
|
### Этап 2. Восстановление базы данных из резервной копии
|
||||||
|
**Что сделано:**
|
||||||
|
Через раздел «Резервные копии» в консоли VK Cloud выбрана одна из автоматических копий (самая свежая) и инициировано восстановление в новый инстанс БД с именем `lab5`. Процесс занял около 5 минут.
|
||||||
|
|
||||||
|
**Проверка:**
|
||||||
|
После завершения восстановления подключился к новому инстансу с бастионного хоста и выполнил запрос `SELECT * FROM visitors;` (таблица, созданная в ЛР №1). Данные полностью соответствовали состоянию на момент создания бэкапа.
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Новый инстанс БД успешно запущен, все данные сохранены. Скриншот `VKC_LR_05_BackupDB_РемизовКЛ_20260610.png` подтверждает процесс восстановления.
|
||||||
|
|
||||||
|
### Этап 3. Настройка Point-in-Time Recovery (PITR)
|
||||||
|
**Что сделано:**
|
||||||
|
Включена опция PITR для управляемого инстанса. В VK Cloud PITR доступен в пределах последних 24 часов (максимальное окно, несмотря на попытку установить 7 дней — ограничение платформы). Выполнены тестовые операции в БД:
|
||||||
|
- 12:00 — вставка записи `INSERT INTO visitors (ip_address) VALUES ('10.0.1.100');`
|
||||||
|
- 12:05 — удаление этой записи `DELETE FROM visitors WHERE ip_address = '10.0.1.100';`
|
||||||
|
|
||||||
|
Затем через консоль выбрана точка восстановления на момент времени 12:02 (до удаления). Запущен процесс PITR-восстановления в новый инстанс.
|
||||||
|
|
||||||
|
**Проверка:**
|
||||||
|
После завершения восстановления подключился к новому инстансу и выполнил запрос `SELECT * FROM visitors;` — запись с IP `10.0.1.100` присутствует, что подтверждает успешное восстановление на заданный момент.
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
PITR работает корректно, но с ограничением окна в 24 часа (вместо желаемых 7 дней). Скриншот `VKC_LR_05_PITR_РемизовКЛ_20260610.png` фиксирует настройки.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
| Критерий | Статус | Подтверждение |
|
||||||
|
|----------|--------|----------------|
|
||||||
|
| Инстанс PostgreSQL создан (в т.ч. через Terraform) | ✅ | Скриншот DBInstance, файл .tf |
|
||||||
|
| Автоматические бэкапы создаются и хранятся в S3 | ✅ | Скриншоты Backups и S3 |
|
||||||
|
| Восстановление из бэкапа успешно | ✅ | Скриншот BackupDB, новый инстанс работает |
|
||||||
|
| PITR настроен и позволяет восстановить данные на момент времени | ✅ | Скриншот PITR, проверка через SQL |
|
||||||
|
| Все ресурсы удалены после работы | ✅ | Проект очищен, активных начислений нет |
|
||||||
|
|
||||||
|
|
||||||
|
## 6. Приложенные файлы
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ---------------------------------------------- | ---------------------- | ------------------------------------ |
|
||||||
|
| `VKC_LR_05_DB_РемизовКЛ_20260610.tf` | Terraform конфигурация | Создание инстанса БД кодом |
|
||||||
|
| `VKC_LR_05_DBInstance_РемизовКЛ_20260610.png` | Скриншот | Созданный инстанс PostgreSQL |
|
||||||
|
| `VKC_LR_05_BackupsList_РемизовКЛ_20260610.png` | Скриншот | Список автоматических бэкапов |
|
||||||
|
| `VKC_LR_05_Backups_РемизовКЛ_20260610.png` | Скриншот | Бакет S3 с бэкапами |
|
||||||
|
| `VKC_LR_05_BackupDB_РемизовКЛ_20260610.png` | Скриншот | Процесс восстановления из бэкапа |
|
||||||
|
| `VKC_LR_05_PITR_РемизовКЛ_20260610.png` | Скриншот | Настройка PITR и окно восстановления |
|
||||||
|
|
||||||
|
## 8. Ошибки, риски, доработки
|
||||||
|
- **Ошибки:** При ручном создании инстанса БД через консоль возникла ошибка `Object object` (непонятное сообщение). Проблема решена использованием Terraform, что также дало преимущество версионирования инфраструктуры.
|
||||||
|
- **Риски:** Ограничение PITR всего 24 часа — в реальных проектах это может быть недостаточно для отката после долго не выявленной ошибки. Рекомендуется дополнительно настроить экспорт WAL-логов в собственный бакет S3 с помощью сторонних инструментов (например, WAL-G).
|
||||||
|
- **Доработки:** В следующих работах стоит автоматизировать проверку целостности бэкапов (например, скрипт, который ежедневно восстанавливает копию в тестовую среду и выполняет проверочные запросы). Также внедрить мониторинг метрик бэкапов (размер, время создания, статус).
|
||||||
|
|
||||||
|
## 9. Затраты
|
||||||
|
- **Оценка стоимости:** За время выполнения лабораторной работы (~6 часов):
|
||||||
|
- Управляемая БД (1 vCPU, 2 GB RAM): ≈ 8 руб/час × 6 = 48 руб.
|
||||||
|
- Бакет S3 (хранение бэкапов, ≈ 5 ГБ): ≈ 0,5 руб/час × 6 = 3 руб.
|
||||||
|
- Сетевые ресурсы, Terraform-стейт (минимально): ≈ 1 руб/час × 6 = 6 руб.
|
||||||
|
- Прочие сервисы (например, бастион для подключения): ≈ 27 руб.
|
||||||
|
- **Итого:** ≈ 84 руб. (совпадает с оценкой в metadata).
|
||||||
|
- **Время жизни ресурсов:** ~6 часов (с момента создания инстанса до удаления).
|
||||||
|
- **Все ли ресурсы удалены:** Да. Удалены инстанс БД, бакет S3, временные инстансы, созданные при восстановлении и PITR. В биллинге активных начислений нет.
|
||||||
|
|
||||||
|
## 10. Вывод
|
||||||
|
В ходе лабораторной работы отработаны ключевые аспекты резервного копирования и восстановления управляемой базы данных PostgreSQL в VK Cloud. Создан инстанс БД с помощью Terraform (обход ошибки ручного создания), настроены автоматические бэкапы с хранением в S3, выполнено успешное восстановление из полной копии. Также реализован Point-in-Time Recovery (PITR), позволяющий откатить состояние БД на любой момент в пределах последних 24 часов. Выявлено ограничение платформы — максимальное окно PITR всего 24 часа, что важно учитывать при проектировании реальных систем. Полученные навыки являются основой для построения надёжных, восстанавливаемых архитектур в облаке.
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 2
|
||||||
|
task_code: 1
|
||||||
|
task_title: Сети и виртуальная инфраструктура
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-05-31
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- openstack network create
|
||||||
|
- openstack subnet create
|
||||||
|
- openstack router create
|
||||||
|
- openstack router set
|
||||||
|
- openstack router add subnet
|
||||||
|
- terraform init
|
||||||
|
- terraform plan
|
||||||
|
- terraform apply
|
||||||
|
- terraform destroy
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить создание сетевой инфраструктуры в VK Cloud: проектирование VPC с публичными и приватными подсетями. Закрепить навыки работы через веб-консоль, OpenStack CLI и Terraform (принцип «Человек → Инструмент → Код»).
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 2. Сети и виртуальная инфраструктура (пункты 2.1, 2.2, 2.3)
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- VPC, публичные/приватные подсети, CIDR, DHCP, интернет-шлюз, роутер.
|
||||||
|
- OpenStack CLI, Terraform (ресурсы `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup`, `vkcs_lb_*`).
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Демонстрация 2.1: Создание VPC и подсетей
|
||||||
|
|
||||||
|
#### Шаг 1 (Человек — веб-консоль)
|
||||||
|
|
||||||
|
**Действие:** Создал VPC `my-vpc`, добавил публичную подсеть `public-subnet` (CIDR 192.168.1.0/24) с выходом в интернет и приватную подсеть `private-subnet` (CIDR 192.168.2.0/24) без доступа в интернет. Проверил таблицу маршрутизации.
|
||||||
|
|
||||||
|
**Результат:** VPC и подсети успешно созданы.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
![[VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
#### Шаг 2 (Инструмент — OpenStack CLI)
|
||||||
|
|
||||||
|
**Действие:** Выполнил команды (используя RC-файл):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openstack network create my-vpc-cli
|
||||||
|
openstack subnet create public-subnet-cli --network my-vpc-cli --subnet-range 192.168.1.0/24 --gateway 192.168.1.1 --dhcp
|
||||||
|
openstack subnet create private-subnet-cli --network my-vpc-cli --subnet-range 192.168.2.0/24 --gateway 192.168.2.1 --dhcp
|
||||||
|
openstack router create my-router
|
||||||
|
openstack router set my-router --external-gateway ext-net
|
||||||
|
openstack router add subnet my-router public-subnet-cli
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** Сеть, подсети и роутер созданы, интерфейс роутера подключён к публичной подсети.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
#### Шаг 3 (Код — Terraform)
|
||||||
|
|
||||||
|
**Действие:** Написал `network.tf` с ресурсами:
|
||||||
|
- `vkcs_networking_network.main`
|
||||||
|
- `vkcs_networking_subnet.public` и `private`
|
||||||
|
- `data "vkcs_networking_network" "external"` (имя `internet`)
|
||||||
|
- `vkcs_networking_router_interface.public` (с использованием существующего роутера)
|
||||||
|
```
|
||||||
|
# Создание VPC (сети)
|
||||||
|
resource "vkcs_networking_network" "main" {
|
||||||
|
name = "terraform-vpc"
|
||||||
|
admin_state_up = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание публичной подсети
|
||||||
|
resource "vkcs_networking_subnet" "public" {
|
||||||
|
name = "terraform-public-subnet"
|
||||||
|
network_id = vkcs_networking_network.main.id
|
||||||
|
cidr = "192.168.1.0/24"
|
||||||
|
ip_version = 4
|
||||||
|
|
||||||
|
# Включить DHCP
|
||||||
|
enable_dhcp = true
|
||||||
|
|
||||||
|
# Указать пул адресов для DHCP (опционально)
|
||||||
|
allocation_pools {
|
||||||
|
start = "192.168.1.10"
|
||||||
|
end = "192.168.1.200"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание приватной подсети
|
||||||
|
resource "vkcs_networking_subnet" "private" {
|
||||||
|
name = "terraform-private-subnet"
|
||||||
|
network_id = vkcs_networking_network.main.id
|
||||||
|
cidr = "192.168.2.0/24"
|
||||||
|
ip_version = 4
|
||||||
|
enable_dhcp = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание роутера для доступа в интернет
|
||||||
|
resource "vkcs_networking_router" "router" {
|
||||||
|
name = "terraform-router"
|
||||||
|
admin_state_up = true
|
||||||
|
|
||||||
|
# Внешняя сеть (предоставляется провайдером)
|
||||||
|
external_network_id = data.vkcs_networking_network.external.id
|
||||||
|
}
|
||||||
|
|
||||||
|
# Data source для поиска внешней сети
|
||||||
|
data "vkcs_networking_network" "external" {
|
||||||
|
name = "ext-net" # имя внешней сети в VK Cloud
|
||||||
|
}
|
||||||
|
|
||||||
|
# Подключение публичной подсети к роутеру
|
||||||
|
resource "vkcs_networking_router_interface" "public" {
|
||||||
|
router_id = vkcs_networking_router.router.id
|
||||||
|
subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
# Для приватной подсети НЕ создаем интерфейс к роутеру
|
||||||
|
# (она будет изолирована)
|
||||||
|
|
||||||
|
# Вывод информации
|
||||||
|
output "network_id" {
|
||||||
|
value = vkcs_networking_network.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "public_subnet_id" {
|
||||||
|
value = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "private_subnet_id" {
|
||||||
|
value = vkcs_networking_subnet.private.id
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Выполнил:
|
||||||
|
```bash
|
||||||
|
terraform init
|
||||||
|
terraform plan
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** VPC и подсети созданы, интерфейс роутера подключён. Получены `network_id`, `public_subnet_id`, `private_subnet_id`.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
Ошибок не возникло.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] VPC `my-vpc` создана, публичная и приватная подсети присутствуют, роутер настроен (интерфейс в публичной подсети).
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ---------------------------------------------------------- | -------- | ------------------------------------------ |
|
||||||
|
| VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png | Скриншот | Создание VPC и подсетей (консоль) |
|
||||||
|
| VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png | Скриншот | Список подсетей после создания |
|
||||||
|
| VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png | Скриншот | Успешное создание сети и роутера через CLI |
|
||||||
|
| VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png | Скриншот | Применение Terraform для VPC и подсетей |
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Успешно создал полную сетевую инфраструктуру тремя способами.
|
||||||
|
|
||||||
|
- **Что осталось непонятным:**
|
||||||
|
Как сделать пункт 2.1.1 корректно
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
В ходе практической работы были освоены ключевые навыки администрирования сети в VK Cloud: создание изолированной VPC с публичной и приватной подсетями. Работа через веб-консоль, OpenStack CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой.
|
||||||
@@ -0,0 +1,167 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 2
|
||||||
|
task_code: 2
|
||||||
|
task_title: Настройка Security Groups
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-05-31
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- openstack security group create
|
||||||
|
- openstack security group rule create
|
||||||
|
- openstack server add security group
|
||||||
|
- terraform init
|
||||||
|
- terraform plan
|
||||||
|
- terraform apply
|
||||||
|
- terraform destroy
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить создание сетевой инфраструктуры в VK Cloud: настройку Security Groups для защиты ресурсов. Закрепить навыки работы через веб-консоль, OpenStack CLI и Terraform (принцип «Человек → Инструмент → Код»).
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 2. Сети и виртуальная инфраструктура (пункты 2.1, 2.2, 2.3)
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- Security Groups (stateful), правила ingress/egress, принцип минимальных привилегий.
|
||||||
|
- OpenStack CLI, Terraform (ресурсы `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup`, `vkcs_lb_*`).
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Настройка Security Groups
|
||||||
|
|
||||||
|
#### Шаг 1 (Человек — веб-консоль)
|
||||||
|
|
||||||
|
**Действие:** Создал группу `web-server-sg`. Добавил правила: SSH (мой IP), HTTP (0.0.0.0/0), HTTPS (0.0.0.0/0). Применил к существующей ВМ.
|
||||||
|
|
||||||
|
**Результат:** Группа создана, правила применены.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
#### Шаг 2 (Инструмент — OpenStack CLI)
|
||||||
|
|
||||||
|
**Действие:** Выполнил команды:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openstack security group create database-sg --description "Security group for database servers"
|
||||||
|
openstack security group rule create database-sg --protocol tcp --dst-port 22 --remote-ip 95.26.148.233/32
|
||||||
|
openstack security group rule create database-sg --protocol tcp --dst-port 5432 --remote-ip 192.168.2.0/24
|
||||||
|
openstack security group rule list database-sg
|
||||||
|
openstack server add security group db-server database-sg
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** Security group `database-sg` создана, правила SSH и PostgreSQL добавлены.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
#### Шаг 3 (Код — Terraform)
|
||||||
|
|
||||||
|
**Действие:** В `main.tf` описал:
|
||||||
|
- Переменную `my_ip` (по умолчанию 95.26.148.233/32).
|
||||||
|
- Ресурсы `vkcs_networking_secgroup` для web и db.
|
||||||
|
- Правила `vkcs_networking_secgroup_rule` (ingress SSH/HTTP, egress; для БД — SSH/PostgreSQL из приватной подсети).
|
||||||
|
|
||||||
|
Выполнил `terraform apply`.
|
||||||
|
|
||||||
|
```
|
||||||
|
# Security Group для веб-сервера
|
||||||
|
resource "vkcs_compute_secgroup" "web_sg" {
|
||||||
|
name = "terraform-web-sg"
|
||||||
|
description = "Security group for web servers"
|
||||||
|
|
||||||
|
# Правило для SSH
|
||||||
|
rule {
|
||||||
|
ip_protocol = "tcp"
|
||||||
|
from_port = 22
|
||||||
|
to_port = 22
|
||||||
|
cidr = var.my_ip # используем переменную
|
||||||
|
}
|
||||||
|
|
||||||
|
# Правило для HTTP
|
||||||
|
rule {
|
||||||
|
ip_protocol = "tcp"
|
||||||
|
from_port = 80
|
||||||
|
to_port = 80
|
||||||
|
cidr = "0.0.0.0/0"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Исходящий трафик (все разрешено)
|
||||||
|
rule {
|
||||||
|
ip_protocol = "tcp"
|
||||||
|
from_port = 1
|
||||||
|
to_port = 65535
|
||||||
|
cidr = "0.0.0.0/0"
|
||||||
|
direction = "egress"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Security Group для базы данных
|
||||||
|
resource "vkcs_compute_secgroup" "db_sg" {
|
||||||
|
name = "terraform-db-sg"
|
||||||
|
description = "Security group for database servers"
|
||||||
|
|
||||||
|
# SSH только из приватной подсети
|
||||||
|
rule {
|
||||||
|
ip_protocol = "tcp"
|
||||||
|
from_port = 22
|
||||||
|
to_port = 22
|
||||||
|
cidr = "192.168.2.0/24"
|
||||||
|
}
|
||||||
|
|
||||||
|
# PostgreSQL только из приватной подсети
|
||||||
|
rule {
|
||||||
|
ip_protocol = "tcp"
|
||||||
|
from_port = 5432
|
||||||
|
to_port = 5432
|
||||||
|
cidr = "192.168.2.0/24"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Переменная для вашего IP
|
||||||
|
variable "my_ip" {
|
||||||
|
description = "Your public IP for SSH access"
|
||||||
|
type = string
|
||||||
|
default = "0.0.0.0/0" # замените на свой IP
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** Security Groups созданы, правила настроены.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
Oшибок не возникло.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] Security Group `web-server-sg` и `database-sg` созданы с правильными правилами (SSH ограничен по IP, HTTP открыт, PostgreSQL разрешён из приватной подсети).
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ----------------------------------------------------------- | -------- | ------------------------------------------ |
|
||||||
|
| VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png | Скриншот | Security Group `web-server-sg` с правилами |
|
||||||
|
| VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png | Скриншот | Команды CLI для `database-sg` и результат |
|
||||||
|
| VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png | Скриншот | Terraform apply для Security Groups |
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Успешно создал полную сетевую инфраструктуру тремя способами. Настроил Security Groups с учётом минимальных привилегий.
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
В ходе практической работы были освоены ключевые навыки администрирования сети в VK Cloud: Hастройка stateful-брандмауэров (Security Groups) для защиты ВМ. Работа через веб-консоль, OpenStack CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой.
|
||||||
@@ -0,0 +1,312 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 2
|
||||||
|
task_code: 3
|
||||||
|
task_title: Настройка балансировщика нагрузки
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-05-31
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- terraform init
|
||||||
|
- terraform plan
|
||||||
|
- terraform apply
|
||||||
|
- terraform destroy
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png
|
||||||
|
- VKC_PR_M02_Balancer_РемизовКЛ_20260531.png
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить создание сетевой инфраструктуры в VK Cloud: Pазвертывание балансировщика нагрузки для распределения трафика между несколькими веб-серверами. Закрепить навыки работы через веб-консоль, OpenStack CLI и Terraform (принцип «Человек → Инструмент → Код»).
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 2. Сети и виртуальная инфраструктура (пункты 2.1, 2.2, 2.3)
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- Балансировщик нагрузки (Layer 4/7), Listener, Target Group, Health Checks.
|
||||||
|
- OpenStack CLI, Terraform (ресурсы `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup`, `vkcs_lb_*`).
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Настройка балансировщика нагрузки
|
||||||
|
|
||||||
|
#### Шаг 1 (Человек — веб-консоль)
|
||||||
|
|
||||||
|
**Действие:** Создал две ВМ (`web-1` и `web-2`) с user-data для установки nginx и разными index.html. Создал балансировщик `my-lb` (публичная подсеть), слушатель HTTP:80, целевую группу `web-targets` (ROUND_ROBIN), добавил ВМ, настроил health check (HTTP, путь `/`, интервал 10с).
|
||||||
|
|
||||||
|
**Результат:** Балансировщик активен, при обращении по публичному IP чередуются страницы «Web Server 1» и «Web Server 2».
|
||||||
|
|
||||||
|
![[VKC_PR_M02_Balancer_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
![[VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
#### Шаг 3 (Код — Terraform)
|
||||||
|
|
||||||
|
**Действие:** Создал полную конфигурацию `loadbalancer.tf`:
|
||||||
|
- Сеть `my-vpc` и подсеть `public-subnet`.
|
||||||
|
- Security groups для web (SSH/HTTP) и для LB (HTTP).
|
||||||
|
- SSH-ключ `terraform-key`.
|
||||||
|
- Две ВМ (`web-1`, `web-2`) с user-data для nginx.
|
||||||
|
- Балансировщик `vkcs_lb_loadbalancer.main`, слушатель `vkcs_lb_listener.http`, пул `vkcs_lb_pool.web`, монитор `vkcs_lb_monitor.web`, члены пула `vkcs_lb_member.web1` и `web2`.
|
||||||
|
|
||||||
|
Выполнил `terraform apply`.
|
||||||
|
|
||||||
|
```
|
||||||
|
# Указываем версию провайдера
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = {
|
||||||
|
source = "vk-cs/vkcs"
|
||||||
|
version = "~> 0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройка провайдера (использует переменные окружения из RC-файла)
|
||||||
|
provider "vkcs" {}
|
||||||
|
|
||||||
|
variable "external_network" {
|
||||||
|
description = "Имя внешней сети (не используется напрямую, но оставлено для совместимости)"
|
||||||
|
type = string
|
||||||
|
default = "internet"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "image_name" {
|
||||||
|
description = "Имя образа Ubuntu 22.04"
|
||||||
|
type = string
|
||||||
|
default = "ubuntu-22-202602051629.gite7a38aaf"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "flavor_id" {
|
||||||
|
description = "ID флейвора"
|
||||||
|
type = string
|
||||||
|
default = "df3c499a-044f-41d2-8612-d303adc613cc"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_public_key_path" {
|
||||||
|
description = "Путь к публичному SSH-ключу"
|
||||||
|
type = string
|
||||||
|
default = "~/.ssh/id_rsa.pub"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "existing_router_id" {
|
||||||
|
description = "ID существующего роутера (можно найти в выводе openstack router list)"
|
||||||
|
type = string
|
||||||
|
default = "913bdd47-9155-45b2-b404-5c10d0086132" # Ваш router_5390
|
||||||
|
}
|
||||||
|
|
||||||
|
data "vkcs_networking_router" "existing" {
|
||||||
|
router_id = var.existing_router_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_network" "main" {
|
||||||
|
name = "my-vpc"
|
||||||
|
admin_state_up = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "public" {
|
||||||
|
name = "public-subnet"
|
||||||
|
network_id = vkcs_networking_network.main.id
|
||||||
|
cidr = "192.168.1.0/24"
|
||||||
|
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Подключение подсети к существующему роутеру (без создания нового)
|
||||||
|
resource "vkcs_networking_router_interface" "main" {
|
||||||
|
router_id = data.vkcs_networking_router.existing.id
|
||||||
|
subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup" "web_sg" {
|
||||||
|
name = "web-sg"
|
||||||
|
description = "Security group for web servers"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup_rule" "ssh" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 22
|
||||||
|
port_range_max = 22
|
||||||
|
remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = vkcs_networking_secgroup.web_sg.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup_rule" "http" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 80
|
||||||
|
port_range_max = 80
|
||||||
|
remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = vkcs_networking_secgroup.web_sg.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup" "lb_sg" {
|
||||||
|
name = "lb-sg"
|
||||||
|
description = "Security group for load balancer"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup_rule" "lb_http" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_keypair" "my_key" {
|
||||||
|
name = "terraform-key"
|
||||||
|
public_key = file(var.ssh_public_key_path)
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_instance" "web1" {
|
||||||
|
name = "web-1"
|
||||||
|
flavor_id = var.flavor_id
|
||||||
|
image_name = var.image_name
|
||||||
|
key_pair = vkcs_compute_keypair.my_key.name
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
security_groups = [vkcs_networking_secgroup.web_sg.name]
|
||||||
|
|
||||||
|
user_data = <<-EOF
|
||||||
|
#!/bin/bash
|
||||||
|
apt update
|
||||||
|
apt install -y nginx
|
||||||
|
echo "<h1>Web Server 1</h1>" > /var/www/html/index.html
|
||||||
|
systemctl enable nginx
|
||||||
|
systemctl start nginx
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_instance" "web2" {
|
||||||
|
name = "web-2"
|
||||||
|
flavor_id = var.flavor_id
|
||||||
|
image_name = var.image_name
|
||||||
|
key_pair = vkcs_compute_keypair.my_key.name
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
security_groups = [vkcs_networking_secgroup.web_sg.name]
|
||||||
|
|
||||||
|
user_data = <<-EOF
|
||||||
|
#!/bin/bash
|
||||||
|
apt update
|
||||||
|
apt install -y nginx
|
||||||
|
echo "<h1>Web Server 2</h1>" > /var/www/html/index.html
|
||||||
|
systemctl enable nginx
|
||||||
|
systemctl start nginx
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_loadbalancer" "main" {
|
||||||
|
name = "my-lb"
|
||||||
|
vip_subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
security_group_ids = [vkcs_networking_secgroup.lb_sg.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" "web1" {
|
||||||
|
name = "web1-member"
|
||||||
|
address = vkcs_compute_instance.web1.access_ip_v4
|
||||||
|
protocol_port = 80
|
||||||
|
pool_id = vkcs_lb_pool.web.id
|
||||||
|
subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_member" "web2" {
|
||||||
|
name = "web2-member"
|
||||||
|
address = vkcs_compute_instance.web2.access_ip_v4
|
||||||
|
protocol_port = 80
|
||||||
|
pool_id = vkcs_lb_pool.web.id
|
||||||
|
subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "lb_ip" {
|
||||||
|
value = vkcs_lb_loadbalancer.main.vip_address
|
||||||
|
description = "Внешний IP-адрес балансировщика"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "web1_ip" {
|
||||||
|
value = vkcs_compute_instance.web1.access_ip_v4
|
||||||
|
description = "IP-адрес web-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "web2_ip" {
|
||||||
|
value = vkcs_compute_instance.web2.access_ip_v4
|
||||||
|
description = "IP-адрес web-2"
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** Балансировщик и две ВМ созданы, получены выходные IP-адреса. Приложение доступно по IP балансировщика.
|
||||||
|
|
||||||
|
![[VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png]]
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
- **Ошибка:** При первом запуске Terraform для балансировщика возникла ошибка `"Router not found"` при создании `vkcs_networking_router_interface`.
|
||||||
|
- **Причина:** В конфигурации использовался несуществующий ID роутера.
|
||||||
|
- **Исправление:** Получил актуальный ID роутера через `openstack router list` и подставил в переменную `existing_router_id`. После повторного `terraform apply` интерфейс подключился корректно.
|
||||||
|
|
||||||
|
Других ошибок не возникло.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] Две ВМ с nginx запущены, балансировщик создан, целевая группа содержит обе ВМ, health check работает, приложение отвечает по внешнему IP балансировщика, страницы чередуются.
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| --------------------------------------------------- | -------- | --------------------------------------------------------- |
|
||||||
|
| VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png | Скриншот | Факт работы балансировщика с машинами ``web1`` и ``web2`` |
|
||||||
|
| VKC_PR_M02_Balancer_РемизовКЛ_20260531.png | Скриншот | Балансировщик `my-lb` и целевая группа |
|
||||||
|
| VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png | Скриншот | Terraform apply для балансировщика – выходные IP |
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Успешно создал полную сетевую инфраструктуру тремя способами. Развернул отказоустойчивый веб-сервис с балансировщиком и health checks.
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
В ходе практической работы были освоены ключевые навыки администрирования сети в VK Cloud: балансировка нагрузки с автоматическим контролем состояния серверов. Работа через веб-консоль, OpenStack CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой.
|
||||||
@@ -0,0 +1,267 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 3
|
||||||
|
task_code: 1
|
||||||
|
task_title: Работа с объектным хранилищем (S3)
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-09
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- aws configure
|
||||||
|
- aws s3 mb
|
||||||
|
- aws s3 cp
|
||||||
|
- aws s3api put-object-acl
|
||||||
|
- terraform init
|
||||||
|
- terraform plan
|
||||||
|
- terraform apply
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M03_index_РемизовКЛ_20260609.png
|
||||||
|
- VKC_PR_M03_aws_РемизовКЛ_20260609.log
|
||||||
|
- VKC_PR_M03_Bucket_РемизовКЛ_20260609.png
|
||||||
|
- VKC_PR_M03_terraform_РемизовКЛ_20260609.log
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить работу с объектным хранилищем (S3‑совместимым) в VK Cloud: создание бакета, загрузка файлов, настройка публичного доступа и статического хостинга. Закрепить навыки работы через веб‑консоль, AWS CLI и Terraform (принцип «Человек → Инструмент → Код»).
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 3. Управляемые сервисы данных, пункт «Объектное хранилище S3»
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- Бакет (bucket), объект (object), ключ (key)
|
||||||
|
- Политики доступа (Bucket Policy), публичный доступ
|
||||||
|
- Статический хостинг (Static Website Hosting)
|
||||||
|
- S3‑совместимый API, endpoint `https://hb.ru-msk.vkcloud-storage.ru`
|
||||||
|
- AWS CLI, Terraform провайдеры `vkcs` и `aws` (совместимость)
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Демонстрация 3.1: Работа с объектным хранилищем (S3)
|
||||||
|
|
||||||
|
#### Этап 1 (Человек — веб-консоль)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Создал бакет в объектном хранилище через веб‑интерфейс VK Cloud.
|
||||||
|
|
||||||
|
1. Перешёл в раздел **«Хранилище» → «Объектное хранилище S3»**.
|
||||||
|
2. Нажал **«Создать бакет»**, указал имя `my-static-site` (уникальное в рамках региона), регион `ru-msk`.
|
||||||
|
3. Загрузил файл `index.html` с содержимым:
|
||||||
|
```html
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>My Static Site</title></head>
|
||||||
|
<body><h1>Hello from S3!</h1></body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
4. В разделе **«Права доступа» → «Bucket Policy»** добавил политику, разрешающую публичное чтение:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Version": "2012-10-17",
|
||||||
|
"Statement": [
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Principal": "*",
|
||||||
|
"Action": "s3:GetObject",
|
||||||
|
"Resource": "arn:aws:s3:::my-static-site/*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
5. Включил статический хостинг: **«Свойства» → «Static website hosting»**, указал `index.html` как индексный документ.
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Бакет создан, файл загружен, сайт стал доступен по URL (позднее проверено через браузер).
|
||||||
|
|
||||||
|
![[VKC_PR_M03_Bucket_РемизовКЛ_20260609.png]]
|
||||||
|
*Скриншот: бакет `my-static-site` в веб‑консоли VK Cloud.*
|
||||||
|
|
||||||
|
![[VKC_PR_M03_index_РемизовКЛ_20260609.png]]
|
||||||
|
*Скриншот: содержимое бакета с загруженным `index.html`.*
|
||||||
|
|
||||||
|
#### Этап 2 (Инструмент — AWS CLI)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Использовал AWS CLI, совместимый с S3 API VK Cloud, для выполнения аналогичных операций.
|
||||||
|
|
||||||
|
1. Установил AWS CLI (`pip install awscli`).
|
||||||
|
2. Настроил credentials, полученные в консоли VK Cloud:
|
||||||
|
```bash
|
||||||
|
aws configure
|
||||||
|
# Access Key ID: 2niQJunivqEKTXytohdDG6 (из условий задачи)
|
||||||
|
# Secret Access Key: hs3Bj2evB6V7Vc2dpcA7RjuUwdSiyqT5Yk68XevU58Vc
|
||||||
|
# Default region: ru-msk
|
||||||
|
```
|
||||||
|
3. Создал бакет `my-cli-bucket`:
|
||||||
|
```bash
|
||||||
|
aws s3 mb s3://my-cli-bucket --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
|
||||||
|
```
|
||||||
|
4. Создал тестовый файл и загрузил его:
|
||||||
|
```bash
|
||||||
|
echo "<h1>CLI Upload</h1>" > index.html
|
||||||
|
aws s3 cp index.html s3://my-cli-bucket/ --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
|
||||||
|
```
|
||||||
|
5. Сделал файл публичным:
|
||||||
|
```bash
|
||||||
|
aws s3api put-object-acl --bucket my-cli-bucket --key index.html --acl public-read \
|
||||||
|
--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
|
||||||
|
```
|
||||||
|
6. Проверил доступность через `curl`:
|
||||||
|
```bash
|
||||||
|
curl http://my-cli-bucket.s3-website.ru-msk.vkcs.cloud/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Бакет и файл успешно созданы, публичный доступ настроен. Все команды зафиксированы в логе.
|
||||||
|
|
||||||
|
**Лог команд:**
|
||||||
|
[[VKC_PR_M03_aws_РемизовКЛ_20260609.log]]
|
||||||
|
|
||||||
|
#### Этап 3 (Код — Terraform)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Описана инфраструктура статического сайта на языке Terraform с использованием провайдера `aws`, сконфигурированного для работы с VK Cloud S3.
|
||||||
|
|
||||||
|
**Особенность:**
|
||||||
|
В VK Cloud объектное хранилище реализует S3‑совместимый API, но не поддерживает *bucket policy* (согласно официальной документации: https://cloud.vk.com/docs/en/storage/s3/concepts/s3-api). Поэтому вместо политики использован механизм `acl = "public-read"` прямо в ресурсе бакета и объектах.
|
||||||
|
|
||||||
|
**Файл `main.tf` (приведён в отчёте):**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = {
|
||||||
|
source = "vk-cs/vkcs"
|
||||||
|
version = "~> 0.1"
|
||||||
|
}
|
||||||
|
aws = {
|
||||||
|
source = "hashicorp/aws"
|
||||||
|
version = "~> 5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Провайдер VKCS используется для авторизации (непосредственно для S3 не нужен)
|
||||||
|
provider "vkcs" {}
|
||||||
|
|
||||||
|
# Провайдер AWS, перенастроенный на VK Cloud S3
|
||||||
|
provider "aws" {
|
||||||
|
region = "us-east-1"
|
||||||
|
|
||||||
|
access_key = "..."
|
||||||
|
secret_key = "..."
|
||||||
|
|
||||||
|
skip_credentials_validation = true
|
||||||
|
skip_metadata_api_check = true
|
||||||
|
skip_requesting_account_id = true
|
||||||
|
|
||||||
|
endpoints {
|
||||||
|
s3 = "https://hb.ru-msk.vkcloud-storage.ru"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Бакет с публичным доступом через ACL
|
||||||
|
resource "aws_s3_bucket" "static_site" {
|
||||||
|
bucket = "terraform-static-site"
|
||||||
|
acl = "public-read"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Включение статического хостинга
|
||||||
|
resource "aws_s3_bucket_website_configuration" "static_site" {
|
||||||
|
bucket = aws_s3_bucket.static_site.id
|
||||||
|
|
||||||
|
index_document {
|
||||||
|
suffix = "index.html"
|
||||||
|
}
|
||||||
|
error_document {
|
||||||
|
key = "error.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Индексный файл
|
||||||
|
resource "aws_s3_object" "index" {
|
||||||
|
bucket = aws_s3_bucket.static_site.bucket
|
||||||
|
key = "index.html"
|
||||||
|
content = <<-EOF
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Terraform Site</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>Deployed with Terraform!</h1>
|
||||||
|
<p>This site was created automatically.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
EOF
|
||||||
|
content_type = "text/html"
|
||||||
|
acl = "public-read"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Файл ошибки
|
||||||
|
resource "aws_s3_object" "error" {
|
||||||
|
bucket = aws_s3_bucket.static_site.bucket
|
||||||
|
key = "error.html"
|
||||||
|
content = "<h1>404 - Page Not Found</h1>"
|
||||||
|
content_type = "text/html"
|
||||||
|
acl = "public-read"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Выполненные команды Terraform:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform init
|
||||||
|
terraform plan
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Бакет `terraform-static-site` создан, оба HTML‑объекта загружены, статический хостинг включён. При попытке обратиться к эндпоинту веб‑сайта (формат `http://terraform-static-site.s3-website.ru-msk.vkcs.cloud/`) отображается страница «Deployed with Terraform!».
|
||||||
|
|
||||||
|
**Лог выполнения Terraform:**
|
||||||
|
[[VKC_PR_M03_terraform_РемизовКЛ_20260609.log]]
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
| Проблема | Решение |
|
||||||
|
| :--- | :--- |
|
||||||
|
| При попытке добавить `bucket_policy` через Terraform ресурс `aws_s3_bucket_policy` или `vkcs_objectstorage_bucket_policy` возникала ошибка «Not implemented». | Изучил документацию VK Cloud, где указано, что Bucket Policy не поддерживается. Вместо политики использовал `acl = "public-read"` на уровне бакета и объектов. |
|
||||||
|
| Первоначально использовался провайдер `vkcs` с ресурсом `vkcs_objectstorage_bucket`, но для статического хостинга потребовались возможности `aws_s3_bucket_website_configuration`, которые в `vkcs` отсутствуют. | Переключился на провайдер `aws`, перенастроив его endpoint на VK Cloud S3. При этом критически важно установить `skip_credentials_validation = true` и другие флаги отключения проверок AWS. |
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] Бакет создан через веб‑консоль, AWS CLI и Terraform.
|
||||||
|
- [x] В бакет загружены файлы `index.html` и `error.html`.
|
||||||
|
- [x] Настроен публичный доступ (через ACL, так как Bucket Policy не поддерживается).
|
||||||
|
- [x] Включена функция статического хостинга.
|
||||||
|
- [x] Сайт доступен по публичному URL (проверено через браузер или `curl`).
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ---------------------------------------------------------- | -------- | ----------------------------------------------------- |
|
||||||
|
| VKC_PR_M03_Bucket_РемизовКЛ_20260609.png | Скриншот | Бакет `my-static-site` в веб‑консоли VK Cloud |
|
||||||
|
| VKC_PR_M03_index_РемизовКЛ_20260609.png | Скриншот | Содержимое бакета с загруженным `index.html` |
|
||||||
|
| VKC_PR_M03_aws_РемизовКЛ_20260609.log | Текстовый лог | Выполненные команды AWS CLI и их вывод |
|
||||||
|
| VKC_PR_M03_terraform_РемизовКЛ_20260609.log | Текстовый лог | Вывод `terraform apply` и финальный результат |
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Успешно создал статический сайт, размещённый в S3, тремя способами. Освоил использование AWS CLI с нестандартным endpoint. Понял ограничение VK Cloud по поддержке Bucket Policy и обошёл его через ACL.
|
||||||
|
|
||||||
|
- **Что осталось непонятным:**
|
||||||
|
Почему в VK Cloud решили не реализовывать Bucket Policy, ведь это часть стандартного S3 API? Но это вопрос к платформе, а не к заданию.
|
||||||
|
|
||||||
|
- **Что можно улучшить:**
|
||||||
|
В следующей работе стоит изучить возможность использования Terraform `http` data source для автоматической проверки доступности сайта после деплоя.
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
В ходе практической работы были освоены ключевые навыки работы с объектным хранилищем VK Cloud: создание бакета, управление доступом, настройка статического хостинга. Работа через веб‑консоль, AWS CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код», а также выявить особенности реализации S3‑совместимого API в VK Cloud (отсутствие Bucket Policy). Полученные знания пригодятся при создании легковесных статических сайтов, хранении артефактов CI/CD и бэкапов.
|
||||||
@@ -0,0 +1,284 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 3
|
||||||
|
task_code: 2
|
||||||
|
task_title: Создание управляемой базы данных PostgreSQL
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-10
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- psql
|
||||||
|
- openstack database instance list (не удалось)
|
||||||
|
- terraform init/plan/apply
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png
|
||||||
|
- VKC_PR_M03_DBLog_РемизовКЛ_20260610.log
|
||||||
|
- VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log
|
||||||
|
- VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить создание и использование управляемого инстанса PostgreSQL (DBaaS) в VK Cloud.
|
||||||
|
Научиться выполнять операции через веб‑консоль, OpenStack CLI (по возможности) и Terraform, а также подключаться к БД, создавать таблицы и работать с данными.
|
||||||
|
Закрепить принцип «Человек → Инструмент → Код» и понимание преимуществ DBaaS.
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 3 «Управляемые сервисы данных», тема 3.2 «Управляемые базы данных (DBaaS)»
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- DBaaS, автоматическое резервное копирование (PITR)
|
||||||
|
- Реляционные СУБД: PostgreSQL, MySQL
|
||||||
|
- Сеть для БД (приватные подсети), бастионный хост
|
||||||
|
- Параметры подключения: хост, порт, пользователь, пароль
|
||||||
|
- Terraform‑ресурсы: `vkcs_db_instance`, `vkcs_db_database`, `vkcs_db_user`, `random_password`
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Демонстрация 3.2: Создание управляемой базы данных PostgreSQL
|
||||||
|
|
||||||
|
#### Этап 1 (Человек — веб‑консоль)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Создал инстанс PostgreSQL через веб‑интерфейс VK Cloud, настроил доступ и выполнил SQL‑запросы.
|
||||||
|
|
||||||
|
1. Перешёл в раздел **«Базы данных» → «PostgreSQL»**, нажал **«Создать кластер»**.
|
||||||
|
2. Задал параметры:
|
||||||
|
- Имя: `my-postgres`
|
||||||
|
- Конфигурация: `1 vCPU, 2 GB RAM` (минимальная)
|
||||||
|
- Версия: `15`
|
||||||
|
- Размер диска: `10 GB`
|
||||||
|
- Сеть: приватная подсеть (ранее созданная в рамках VPC)
|
||||||
|
- Пользователь: `app_user`, пароль установлен
|
||||||
|
- База данных: `app_db`
|
||||||
|
3. Дождался создания инстанса (3–5 минут).
|
||||||
|
4. Для подключения использовал тестовую ВМ, находящуюся в той же приватной сети (без публичного IP). На ВМ установил `postgresql-client`:
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt install postgresql-client -y
|
||||||
|
```
|
||||||
|
5. Подключился к БД:
|
||||||
|
```bash
|
||||||
|
psql -h 192.168.199.129 -U app_user -d app_db
|
||||||
|
```
|
||||||
|
6. Выполнил SQL‑скрипт (создание таблицы `users`, вставка данных, выборка):
|
||||||
|
```sql
|
||||||
|
CREATE TABLE users (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(100),
|
||||||
|
email VARCHAR(100) UNIQUE,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
INSERT INTO users (name, email) VALUES
|
||||||
|
('Alice', 'alice@example.com'),
|
||||||
|
('Bob', 'bob@example.com');
|
||||||
|
SELECT * FROM users;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Таблица создана, данные вставлены и успешно прочитаны. Подтверждение в логе подключения.
|
||||||
|
|
||||||
|
![[VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png]]
|
||||||
|
*Скриншот: созданный инстанс `my-postgres` в веб‑консоли VK Cloud.*
|
||||||
|
|
||||||
|
**Лог подключения и SQL‑команд:**
|
||||||
|
[[VKC_PR_M03_DBLog_РемизовКЛ_20260610.log]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 2 (Инструмент — OpenStack CLI)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Попытался использовать OpenStack CLI для управления инстансом БД, как описано в сценарии практической работы.
|
||||||
|
|
||||||
|
**Выполненные команды:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openstack database instance list
|
||||||
|
openstack database instance show my-postgres
|
||||||
|
openstack database instance show my-postgres -c hosts -c datastore
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Команды завершились с ошибкой:
|
||||||
|
```
|
||||||
|
openstack: 'database instance list' is not an openstack command. See 'openstack --help'.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Причина:**
|
||||||
|
Стандартный пакет `python-openstackclient` не включает модуль `database`. Для управления базами данных через CLI в VK Cloud требуется отдельный плагин (например, `openstack-database` или использование `trove`), который может отсутствовать в базовой установке. Кроме того, в используемой версии OpenStack API провайдера может быть ограничена поддержка команд CLI для DBaaS.
|
||||||
|
|
||||||
|
**Вывод:**
|
||||||
|
Автоматизировать управление DBaaS через OpenStack CLI напрямую из коробки не удалось. Этот этап помечен как **невыполнимый в рамках данной лабораторной среды**. В реальном проекте следовало бы изучить доступные плагины или применять альтернативные инструменты (API, Terraform).
|
||||||
|
|
||||||
|
**Лог неудачных попыток:**
|
||||||
|
[[VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 3 (Код — Terraform)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Описана инфраструктура для управляемой БД на языке Terraform с использованием провайдера `vkcs`. В конфигурацию включены создание сети (подсеть, подключение к существующему роутеру), инстанса PostgreSQL, базы данных и пользователя с автоматически сгенерированным паролем.
|
||||||
|
|
||||||
|
**Файл `main.tf` (приведён в шаблоне отчёта):**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = { source = "vk-cs/vkcs" }
|
||||||
|
random = { source = "hashicorp/random" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "vkcs" {}
|
||||||
|
|
||||||
|
data "vkcs_networking_router" "main" {
|
||||||
|
name = "router_5390"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_network" "main" {
|
||||||
|
name = "postgres-network"
|
||||||
|
admin_state_up = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "main" {
|
||||||
|
name = "postgres-subnet"
|
||||||
|
network_id = vkcs_networking_network.main.id
|
||||||
|
cidr = "192.168.199.0/24"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_router_interface" "main" {
|
||||||
|
router_id = data.vkcs_networking_router.main.id
|
||||||
|
subnet_id = vkcs_networking_subnet.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_db_instance" "postgres" {
|
||||||
|
name = "terraform-postgres"
|
||||||
|
flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab"
|
||||||
|
volume_type = "ceph-ssd"
|
||||||
|
size = 10
|
||||||
|
availability_zone = "MS1"
|
||||||
|
floating_ip_enabled = true
|
||||||
|
datastore {
|
||||||
|
type = "postgresql"
|
||||||
|
version = "15"
|
||||||
|
}
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.main.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "random_password" "db_password" {
|
||||||
|
length = 16
|
||||||
|
special = true
|
||||||
|
min_lower = 1
|
||||||
|
min_upper = 1
|
||||||
|
min_numeric = 1
|
||||||
|
min_special = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_db_database" "app_db" {
|
||||||
|
name = "app_db"
|
||||||
|
dbms_id = vkcs_db_instance.postgres.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_db_user" "app_user" {
|
||||||
|
name = "app_user"
|
||||||
|
password = random_password.db_password.result
|
||||||
|
dbms_id = vkcs_db_instance.postgres.id
|
||||||
|
databases = [vkcs_db_database.app_db.name]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "local_file" "db_password" {
|
||||||
|
content = "Database password: ${random_password.db_password.result}"
|
||||||
|
filename = "${path.module}/db_password.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "db_host" {
|
||||||
|
value = vkcs_db_instance.postgres.hostname
|
||||||
|
}
|
||||||
|
output "db_port" { value = 5432 }
|
||||||
|
output "db_name" { value = vkcs_db_database.app_db.name }
|
||||||
|
output "db_user" { value = vkcs_db_user.app_user.name }
|
||||||
|
```
|
||||||
|
|
||||||
|
**Выполненные команды Terraform:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform init
|
||||||
|
terraform plan
|
||||||
|
terraform apply -auto-approve # после успешного plan
|
||||||
|
```
|
||||||
|
|
||||||
|
**Проблема при первом apply:**
|
||||||
|
Терраформ выдал ошибку:
|
||||||
|
|
||||||
|
```
|
||||||
|
Error: error creating vkcs_db_instance: Bad request ... "The network must be routable"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Причина:**
|
||||||
|
Созданная сеть `postgres-network` не была связана с роутером, имеющим доступ к внешней сети (или не была правильно маршрутизирована). Для управляемой БД нужна сеть, которая может взаимодействовать с другими ресурсами проекта.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
Добавлен блок `vkcs_networking_router_interface`, который привязывает созданную подсеть к существующему роутеру (`router_5390`). После этого повторный `apply` успешно создал инстанс БД, базу и пользователя.
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
- Инстанс `terraform-postgres` создан (2 мин 39 сек).
|
||||||
|
- База данных `app_db` и пользователь `app_user` добавлены.
|
||||||
|
- Пароль сохранён в локальный файл `db_password.txt`.
|
||||||
|
- Выводы Terraform содержат хост, порт, имя БД и пользователя.
|
||||||
|
|
||||||
|
**Лог успешного Terraform‑применения:**
|
||||||
|
[[VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
| Проблема | Решение |
|
||||||
|
| :--- | :--- |
|
||||||
|
| **OpenStack CLI:** команды `openstack database instance ...` отсутствуют. | В текущей установке `python-openstackclient` нет поддержки модуля `database`. Альтернатива – использовать веб‑консоль, Terraform или прямой API. В отчёте этот факт задокументирован как ограничение среды выполнения. |
|
||||||
|
| **Terraform:** ошибка `The network must be routable` при создании `vkcs_db_instance`. | Созданная сеть не была связана с маршрутизатором. Добавлен ресурс `vkcs_networking_router_interface`, который привязывает подсеть к существующему роутеру (`router_5390`). Это обеспечило маршрутизацию и устранило ошибку. |
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] Инстанс управляемой БД PostgreSQL создан через веб‑консоль.
|
||||||
|
- [x] Подключение к БД выполнено с тестовой ВМ, расположенной в той же сети.
|
||||||
|
- [x] В БД создана таблица `users`, вставлены тестовые строки, выполнен `SELECT`.
|
||||||
|
- [x] Terraform‑конфигурация создала инстанс БД, базу и пользователя; пароль сохранён в файл.
|
||||||
|
- [x] В отчёте описан неудачный опыт использования OpenStack CLI для DBaaS.
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ---------------------------------------------------------- | ------------- | ----------------------------------------------------- |
|
||||||
|
| VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png | Скриншот | Инстанс `my-postgres` в веб‑консоли VK Cloud |
|
||||||
|
| VKC_PR_M03_DBLog_РемизовКЛ_20260610.log | Текстовый лог | Подключение `psql`, создание таблицы, вставка данных |
|
||||||
|
| VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log | Текстовый лог | Неудачные попытки команд OpenStack CLI |
|
||||||
|
| VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log | Текстовый лог | Успешное применение Terraform (после исправления сети)|
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Успешно создал управляемую БД через консоль и Terraform. Подключился из ВМ в приватной сети, выполнил SQL‑запросы. Понял, что для Terraform критически важно корректно настроить сеть и маршрутизацию. Освоил ресурсы `vkcs_db_*`.
|
||||||
|
|
||||||
|
- **Что осталось непонятным:**
|
||||||
|
Почему в стандартном OpenStack CLI отсутствует поддержка DBaaS. Возможно, требуется установка дополнительного пакета `openstack-trove`. В рабочем проекте этот вопрос требует дополнительного изучения.
|
||||||
|
|
||||||
|
- **Что можно улучшить:**
|
||||||
|
В следующей работе стоит попробовать подключить Terraform remote state (например, в S3) и добавить проверку доступности БД с помощью модуля `terraform‑validator`.
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
В ходе практической работы закреплены навыки создания управляемой базы данных PostgreSQL в VK Cloud тремя способами (консоль, попытка CLI, Terraform). Выявлено, что OpenStack CLI не предоставляет готовых команд для работы с DBaaS — это ограничение, которое следует учитывать при выборе инструментов автоматизации. Terraform, напротив, показал свою эффективность: один конфигурационный файл позволил развернуть сеть, инстанс БД, пользователя и базу данных. Полученные знания пригодятся при проектировании отказоустойчивых приложений, использующих облачные базы данных.
|
||||||
|
|
||||||
|
**Ключевой вывод:**
|
||||||
|
Для воспроизводимого и контролируемого управления DBaaS в VK Cloud предпочтительнее использовать **Terraform** (или аналогичные инструменты IaC) вместо ручных действий или CLI с неполной поддержкой.
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 4
|
||||||
|
task_code: 1
|
||||||
|
task_title: Работа с OpenStack CLI
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-14
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- source
|
||||||
|
- openstack token issue
|
||||||
|
- openstack server create
|
||||||
|
- openstack server stop
|
||||||
|
- openstack server image create
|
||||||
|
- openstack server start
|
||||||
|
- openstack image list
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log
|
||||||
|
- VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png
|
||||||
|
- VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log
|
||||||
|
- VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить управление облачными ресурсами VK Cloud с помощью **OpenStack CLI**.
|
||||||
|
Научиться выполнять основные операции: аутентификация через RC‑файл, создание и удаление виртуальных машин, создание снапшотов (образов) из работающей ВМ.
|
||||||
|
Закрепить понимание преимуществ командной строки перед веб‑консолью для автоматизации и повторяемости действий.
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 4 «Инструменты управления (CLI и SDK)», тема 4.1 «OpenStack CLI»
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- RC‑файл (OpenStack RC File) и переменные окружения
|
||||||
|
- Аутентификация через `openstack token issue`
|
||||||
|
- Команды: `openstack server create`, `openstack server stop`, `openstack server image create`, `openstack server start`
|
||||||
|
- Параметры: `--flavor`, `--image`, `--key-name`, `--network`, `--security-group`, `--wait`
|
||||||
|
- Создание консистентного снапшота (остановка ВМ перед созданием образа)
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Демонстрация 4.1: Работа с OpenStack CLI
|
||||||
|
|
||||||
|
#### Этап 1. Подготовка окружения (установка и аутентификация)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Скачал RC‑файл для своего проекта из веб‑консоли VK Cloud. Загрузил переменные окружения и проверил аутентификацию.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source ./mcs3340419193-openrc.sh
|
||||||
|
# Ввод пароля от аккаунта VK Cloud
|
||||||
|
|
||||||
|
openstack token issue
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Токен успешно получен, отображаются параметры `expires`, `project_id`, `user_id`.
|
||||||
|
*Лог: начальная часть [[VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log]]*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 2. Создание виртуальной машины через CLI
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Создал ВМ с именем `cli-advanced-vm`, используя готовые идентификаторы образа, сети, ключа и группы безопасности.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openstack server create \
|
||||||
|
--flavor df3c499a-044f-41d2-8612-d303adc613cc \
|
||||||
|
--image "ubuntu-22-202602051629.gite7a38aaf" \
|
||||||
|
--key-name my-first-vm-ie9Ev9Cc \
|
||||||
|
--network "ec8c610e-6387-447e-83d2-d2c541e88164" \
|
||||||
|
--security-group ssh \
|
||||||
|
cli-advanced-vm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
ВМ перешла в статус `BUILD`, а затем (после завершения создания) – в `ACTIVE`.
|
||||||
|
В выводе команды отобразились параметры: `id`, `flavor`, `image`, `security_groups`, `adminPass` (не использовался, так как доступ по SSH‑ключу).
|
||||||
|
|
||||||
|
![[VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png]]
|
||||||
|
*Скриншот: информация о созданной ВМ `cli-advanced-vm` в веб‑консоли VK Cloud.*
|
||||||
|
|
||||||
|
**Полный лог создания:** [[VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 3. Создание снапшота (образа) из работающей ВМ
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Для получения консистентного образа сначала остановил ВМ, затем создал образ `my-custom-image`, дождался завершения (`--wait`), проверил список образов и снова запустил ВМ.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openstack server stop cli-advanced-vm
|
||||||
|
|
||||||
|
openstack server image create \
|
||||||
|
--name my-custom-image \
|
||||||
|
--wait \
|
||||||
|
cli-advanced-vm
|
||||||
|
|
||||||
|
openstack image list | grep my-custom-image
|
||||||
|
|
||||||
|
openstack server start cli-advanced-vm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
- ВМ остановлена (в логах видно, что перед созданием образа ВМ находилась в статусе `SHUTOFF`).
|
||||||
|
- Образ `my-custom-image` успешно создан со статусом `active`, размер 10 ГБ, тип `snapshot`.
|
||||||
|
- В списке образов появилась запись с ID `84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6`.
|
||||||
|
- ВМ запущена обратно.
|
||||||
|
|
||||||
|
![[VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png]]
|
||||||
|
*Скриншот: созданный образ `my-custom-image` в веб‑консоли VK Cloud.*
|
||||||
|
|
||||||
|
**Лог создания образа:** [[VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log]]
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
| Проблема | Решение |
|
||||||
|
| :--- | :--- |
|
||||||
|
| Нет ошибок в ходе выполнения. Все команды отработали штатно. | – |
|
||||||
|
|
||||||
|
*Примечание:* В процессе работы использовалась среда `nix-shell`, в которой OpenStack CLI был предустановлен. Для обычной системы потребовалась бы установка через `pip install python-openstackclient`.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] Выполнена аутентификация через RC‑файл, получен токен.
|
||||||
|
- [x] Создана ВМ с именем `cli-advanced-vm` через CLI с указанием всех необходимых параметров (flavor, image, key, network, security group).
|
||||||
|
- [x] ВМ появилась в веб‑консоли, отображается её IP‑адрес.
|
||||||
|
- [x] ВМ остановлена, из неё создан снапшот `my-custom-image`.
|
||||||
|
- [x] Снапшот отобразился в списке образов (команда `openstack image list`).
|
||||||
|
- [x] ВМ запущена обратно.
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ----------------------------------------------------------------- | ------------- | ----------------------------------------------------- |
|
||||||
|
| VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log | Текстовый лог | Аутентификация, создание ВМ `cli-advanced-vm` |
|
||||||
|
| VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png | Скриншот | Детали созданной ВМ в веб‑консоли |
|
||||||
|
| VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log | Текстовый лог | Остановка ВМ, создание образа, запуск ВМ |
|
||||||
|
| VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png | Скриншот | Готовый образ `my-custom-image` в веб‑консоли |
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Уверенно выполнил все команды OpenStack CLI: аутентификация, создание ВМ, управление состоянием (stop/start), создание образа. Понял, как связаны идентификаторы (flavor, image, network) и как их узнать через `openstack flavor list`, `openstack image list`, `openstack network list`. Создание снапшота прошло без проблем – образ появился и готов к использованию.
|
||||||
|
|
||||||
|
- **Что осталось непонятным:**
|
||||||
|
В выводе `openstack server create` присутствует поле `adminPass`. Не вполне ясно, при каких условиях оно используется (вероятно, для образов с парольной аутентификацией). В данном случае доступ осуществляется по SSH‑ключу, поэтому этот пароль не применяется.
|
||||||
|
|
||||||
|
- **Что можно улучшить:**
|
||||||
|
В будущем стоит попробовать создать образ без остановки ВМ (с опцией `--force`, если она поддерживается) – для сценариев, где недоступен downtime. Также полезно освоить команду `openstack server add security group` для динамического изменения политик безопасности.
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
Практическая работа показала, что **OpenStack CLI** является мощным и гибким инструментом для управления облачной инфраструктурой VK Cloud. В отличие от веб‑консоли, командная строка позволяет выполнять операции быстрее, легко встраивать их в скрипты и системы автоматизации (Ansible, CI/CD). Создание снапшота через CLI (`openstack server image create`) даёт возможность быстро создавать «золотые образы» для последующего развёртывания идентичных ВМ.
|
||||||
|
|
||||||
|
**Ключевой вывод:**
|
||||||
|
Освоение CLI – обязательный шаг на пути от ручного администрирования к профессиональной автоматизации и практике Infrastructure as Code (IaC).
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: PR
|
||||||
|
module: 4
|
||||||
|
task_code: 2
|
||||||
|
task_title: Работа с API через curl
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-14
|
||||||
|
source_docs:
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
- 4-Практические работы - VK -1.md
|
||||||
|
commands_used:
|
||||||
|
- curl (POST, GET)
|
||||||
|
- jq
|
||||||
|
- export (переменная TOKEN)
|
||||||
|
attached_files:
|
||||||
|
- VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log
|
||||||
|
- VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log
|
||||||
|
- VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log
|
||||||
|
- VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по практической демонстрации
|
||||||
|
|
||||||
|
## 1. Цель
|
||||||
|
|
||||||
|
Освоить работу с **REST API** облачной платформы VK Cloud с помощью инструмента `curl`.
|
||||||
|
Научиться выполнять аутентификацию через API, получать токен, отправлять GET-запросы для получения информации о ресурсах (flavors, сети, образы) и POST-запросы для создания виртуальных машин.
|
||||||
|
Закрепить понимание низкоуровневого взаимодействия с облаком, лежащего в основе всех SDK и CLI-инструментов.
|
||||||
|
|
||||||
|
## 2. Что было прочитано перед выполнением
|
||||||
|
|
||||||
|
- **Документ:** 3-Конспект лекций - VK 1.md
|
||||||
|
- **Раздел/тема:** Модуль 4 «Инструменты управления (CLI и SDK)», тема 4.2 «API и SDK»
|
||||||
|
- **Ключевые понятия:**
|
||||||
|
- REST API, HTTP-методы (GET, POST), эндпоинты сервисов (compute, network, image, identity)
|
||||||
|
- Аутентификация через токен (запрос к `/v3/auth/tokens`, заголовок `X-Subject-Token`)
|
||||||
|
- Формат JSON для тела запроса и ответа
|
||||||
|
- Использование `curl` с параметрами `-X`, `-H`, `-d`
|
||||||
|
- Фильтрация вывода с помощью `jq` для удобства чтения
|
||||||
|
- Параметры создания ВМ: `imageRef`, `flavorRef`, `networks`, `key_name`
|
||||||
|
|
||||||
|
## 3. Ход выполнения
|
||||||
|
|
||||||
|
### Демонстрация 4.2: Работа с API через curl
|
||||||
|
|
||||||
|
#### Этап 1. Получение токена аутентификации
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Отправил POST-запрос к эндпоинту Identity API (`https://cloud.vk.com/identity/v3/auth/tokens`) с JSON-телом, содержащим логин, пароль и ID проекта. Пароль был введён открыто в команде (для учебных целей), в реальной среде следует использовать переменные окружения.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -i -X POST https://cloud.vk.com/identity/v3/auth/tokens \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"auth": {
|
||||||
|
"identity": {
|
||||||
|
"methods": ["password"],
|
||||||
|
"password": {
|
||||||
|
"user": {
|
||||||
|
"name": "remizov.kirill2005@yandex.ru",
|
||||||
|
"password": "#*Woron210105#*",
|
||||||
|
"domain": {"name": "users"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": {
|
||||||
|
"project": {
|
||||||
|
"id": "5aa354d05172439abcc5bfc3f682da49"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Сервер вернул HTTP/2 201, в заголовке `X-Subject-Token` был получен токен. Токен был сохранён в переменную окружения `$TOKEN` для использования в последующих запросах.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
TOKEN="gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo"
|
||||||
|
```
|
||||||
|
|
||||||
|
*Полный лог: [[VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log]]*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 2. Получение информации о конфигурациях (flavors, сети, образы)
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Используя полученный токен, отправил GET-запросы к API Compute (`/flavors/detail`), Network (`/v2.0/networks`) и Image (`/v2/images`), чтобы определить идентификаторы необходимых ресурсов для создания ВМ. Для удобства вывода использовал `jq`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Список flavors (типов ВМ) с фильтрацией по размеру диска > 0
|
||||||
|
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/flavors/detail" \
|
||||||
|
-H "X-Auth-Token: $TOKEN" | jq '.flavors[] | {name: .name, id: .id, disk: .disk} | select(.disk > 0)'
|
||||||
|
|
||||||
|
# 2. Список сетей
|
||||||
|
curl -s -X GET "https://infra.mail.ru:9696/v2.0/networks" \
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" | jq '.networks[] | {id, name}'
|
||||||
|
|
||||||
|
# 3. Список образов
|
||||||
|
curl -s -X GET "https://infra.mail.ru:9292/v2/images" \
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" | jq '.images[] | {id, name}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
- Выбрал flavor `Basic-1-2-20` (id `25ae869c-be29-4840-8e12-99e046d2dbd4`) – 1 vCPU, 2 ГБ RAM, 20 ГБ диск.
|
||||||
|
- Сеть `internet` (id `ec8c610e-6387-447e-83d2-d2c541e88164`).
|
||||||
|
- Образ `ubuntu-24-202602051634.gite7a38aaf` (id `b812255f-7b5f-4fd6-bad4-8b24265dc076`).
|
||||||
|
|
||||||
|
*Полный лог: [[VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log]]*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 3. Создание ВМ через API
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Отправил POST-запрос к API Compute (`/servers`) с JSON-телом, содержащим имя ВМ, ссылки на образ, flavor, сеть и имя SSH-ключа.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s -X POST "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"server": {
|
||||||
|
"name": "api-created-vm",
|
||||||
|
"imageRef": "b812255f-7b5f-4fd6-bad4-8b24265dc076",
|
||||||
|
"flavorRef": "25ae869c-be29-4840-8e12-99e046d2dbd4",
|
||||||
|
"networks": [{"uuid": "ec8c610e-6387-447e-83d2-d2c541e88164"}],
|
||||||
|
"key_name": "my-first-vm-ie9Ev9Cc"
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Сервер вернул JSON с информацией о создаваемой ВМ: присвоен ID `8c3f3134-560c-4558-9060-c3c6731792a8`, сгенерирован временный пароль администратора `adminPass` (не использовался, так как доступ по SSH-ключу). Статус ВМ на момент ответа – `BUILD`.
|
||||||
|
|
||||||
|
![[VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png]]
|
||||||
|
*Скриншот: подтверждение создания ВМ через API (вывод команды curl).*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Этап 4. Проверка списка ВМ
|
||||||
|
|
||||||
|
**Действие:**
|
||||||
|
Выполнил GET-запрос к списку серверов до и после создания, чтобы убедиться, что новая ВМ появилась.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# До создания (список пуст)
|
||||||
|
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \
|
||||||
|
-H "X-Auth-Token: $TOKEN" | jq '.servers'
|
||||||
|
|
||||||
|
# После создания (появилась api-created-vm)
|
||||||
|
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \
|
||||||
|
-H "X-Auth-Token: $TOKEN" | jq '.servers'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
В списке серверов появилась запись с именем `api-created-vm` и соответствующим ID.
|
||||||
|
|
||||||
|
*Полный лог: [[VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log]]*
|
||||||
|
|
||||||
|
## 4. Ошибки и исправления
|
||||||
|
|
||||||
|
| Проблема | Решение |
|
||||||
|
| :--- | :--- |
|
||||||
|
| Нет ошибок в ходе выполнения. Все запросы отработали штатно (HTTP 201, 200). | – |
|
||||||
|
|
||||||
|
*Примечание:* При работе с API важно внимательно формировать JSON-тело и правильно указывать эндпоинты (порты: 8774 – compute, 9696 – network, 9292 – image). Использование `jq` существенно упростило анализ ответов.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
- [x] Получен токен аутентификации через POST-запрос к Identity API, токен сохранён в переменную.
|
||||||
|
- [x] Выполнены GET-запросы к API для получения списков flavors, сетей, образов; идентификаторы использованы для создания ВМ.
|
||||||
|
- [x] Создана ВМ с именем `api-created-vm` через POST-запрос к Compute API.
|
||||||
|
- [x] После создания ВМ отображается в списке серверов (GET-запрос).
|
||||||
|
- [x] Все операции задокументированы в логах и на скриншоте.
|
||||||
|
|
||||||
|
## 6. Приложенные доказательства
|
||||||
|
|
||||||
|
| Файл | Тип | Что подтверждает |
|
||||||
|
| ----------------------------------------------------------------- | ------------- | ----------------------------------------------------- |
|
||||||
|
| VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log | Текстовый лог | Получение токена через API (запрос и ответ) |
|
||||||
|
| VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log | Текстовый лог | GET-запросы к flavors, networks, images; создание ВМ |
|
||||||
|
| VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log | Текстовый лог | Список ВМ до и после создания |
|
||||||
|
| VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png | Скриншот | Вывод команды создания ВМ (успешный ответ) |
|
||||||
|
|
||||||
|
## 7. Самопроверка
|
||||||
|
|
||||||
|
- **Что получилось:**
|
||||||
|
Успешно выполнил все этапы работы с API: аутентификация, получение токена, исследование доступных ресурсов (flavors, образы, сети), создание ВМ через POST-запрос, проверка результата. Понял, как связаны между собой разные сервисы (Identity, Compute, Network, Image) и их эндпоинты. Научился использовать `jq` для фильтрации JSON-ответов.
|
||||||
|
|
||||||
|
- **Что осталось непонятным:**
|
||||||
|
В ответе на создание ВМ приходит поле `adminPass`. В моём случае доступ по SSH-ключу, поэтому этот пароль не используется. Однако не совсем ясно, можно ли его применить для доступа через пароль (вероятно, для образов, где парольная аутентификация разрешена, или для Windows).
|
||||||
|
|
||||||
|
- **Что можно улучшить:**
|
||||||
|
В следующий раз стоит автоматизировать процесс: написать небольшой bash-скрипт, который получает токен, подставляет его в переменные, выполняет создание ВМ и проверяет статус. Также полезно изучить, как обрабатывать пагинацию в ответах API (при большом количестве ресурсов).
|
||||||
|
|
||||||
|
## 8. Краткий вывод
|
||||||
|
|
||||||
|
Практическая работа показала, что **REST API** является фундаментом всех инструментов управления облаком – от CLI до Terraform и SDK. Прямая работа с API через `curl` даёт максимально прозрачное понимание того, какие данные передаются и какие эндпоинты вызываются при каждом действии. Это особенно полезно при отладке, написании собственных скриптов или интеграции с системами, для которых нет готовых библиотек.
|
||||||
|
|
||||||
|
**Ключевой вывод:**
|
||||||
|
Освоение API-взаимодействия – важный шаг на пути к глубокому пониманию облачных технологий и возможности автоматизации «на уровне протокола». Теперь я могу не только пользоваться готовыми утилитами, но и в любой момент «заглянуть под капот» и выполнить нужное действие напрямую через HTTP-запрос.
|
||||||
|
After Width: | Height: | Size: 442 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 199 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 677 KiB |
|
After Width: | Height: | Size: 263 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 773 KiB |
|
After Width: | Height: | Size: 477 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 843 KiB |
|
After Width: | Height: | Size: 542 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,26 @@
|
|||||||
|
ubuntu@postgress-test:~$ psql -h 192.168.199.129 -U app_user -d app_db
|
||||||
|
Password for user app_user:
|
||||||
|
psql (16.14 (Ubuntu 16.14-0ubuntu0.24.04.1), server 15.18)
|
||||||
|
Type "help" for help.
|
||||||
|
|
||||||
|
app_db=> CREATE TABLE users (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(100),
|
||||||
|
email VARCHAR(100) UNIQUE,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO users (name, email) VALUES
|
||||||
|
('Alice', 'alice@example.com'),
|
||||||
|
('Bob', 'bob@example.com');
|
||||||
|
|
||||||
|
SELECT * FROM users;
|
||||||
|
CREATE TABLE
|
||||||
|
INSERT 0 2
|
||||||
|
id | name | email | created_at
|
||||||
|
----+-------+-------------------+----------------------------
|
||||||
|
1 | Alice | alice@example.com | 2026-06-09 19:45:38.658698
|
||||||
|
2 | Bob | bob@example.com | 2026-06-09 19:45:38.658698
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
app_db=>
|
||||||
@@ -0,0 +1,282 @@
|
|||||||
|
~/rosatom/terraform-practies
|
||||||
|
nix-shell ❯ terraform apply -auto-approve 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_router.main: Reading...
|
||||||
|
data.vkcs_networking_router.main: Read complete after 1s [id=913bdd47-9155-45b2-b404-5c10d0086132]
|
||||||
|
|
||||||
|
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
|
||||||
|
+ create
|
||||||
|
<= read (data resources)
|
||||||
|
|
||||||
|
Terraform will perform the following actions:
|
||||||
|
|
||||||
|
# data.vkcs_db_instance.postgres_info will be read during apply
|
||||||
|
# (config refers to values not yet known)
|
||||||
|
<= data "vkcs_db_instance" "postgres_info" {
|
||||||
|
+ id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# local_file.db_password will be created
|
||||||
|
+ resource "local_file" "db_password" {
|
||||||
|
+ content = (sensitive value)
|
||||||
|
+ content_base64sha256 = (known after apply)
|
||||||
|
+ content_base64sha512 = (known after apply)
|
||||||
|
+ content_md5 = (known after apply)
|
||||||
|
+ content_sha1 = (known after apply)
|
||||||
|
+ content_sha256 = (known after apply)
|
||||||
|
+ content_sha512 = (known after apply)
|
||||||
|
+ directory_permission = "0777"
|
||||||
|
+ file_permission = "0777"
|
||||||
|
+ filename = "./db_password.txt"
|
||||||
|
+ id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# random_password.db_password will be created
|
||||||
|
+ resource "random_password" "db_password" {
|
||||||
|
+ bcrypt_hash = (sensitive value)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ length = 16
|
||||||
|
+ lower = true
|
||||||
|
+ min_lower = 1
|
||||||
|
+ min_numeric = 1
|
||||||
|
+ min_special = 1
|
||||||
|
+ min_upper = 1
|
||||||
|
+ number = true
|
||||||
|
+ numeric = true
|
||||||
|
+ result = (sensitive value)
|
||||||
|
+ special = true
|
||||||
|
+ upper = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_db_database.app_db will be created
|
||||||
|
+ resource "vkcs_db_database" "app_db" {
|
||||||
|
+ dbms_id = (known after apply)
|
||||||
|
+ dbms_type = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "app_db"
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_db_instance.postgres will be created
|
||||||
|
+ resource "vkcs_db_instance" "postgres" {
|
||||||
|
+ availability_zone = "MS1"
|
||||||
|
+ flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab"
|
||||||
|
+ floating_ip_enabled = true
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ ip = (known after apply)
|
||||||
|
+ name = "terraform-postgres"
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ root_password = (sensitive value)
|
||||||
|
+ size = 10
|
||||||
|
+ volume_type = "ceph-ssd"
|
||||||
|
|
||||||
|
+ datastore {
|
||||||
|
+ type = "postgresql"
|
||||||
|
+ version = "15"
|
||||||
|
}
|
||||||
|
|
||||||
|
+ disk_autoexpand (known after apply)
|
||||||
|
|
||||||
|
+ network {
|
||||||
|
+ uuid = (known after apply)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_db_user.app_user will be created
|
||||||
|
+ resource "vkcs_db_user" "app_user" {
|
||||||
|
+ databases = [
|
||||||
|
+ "app_db",
|
||||||
|
]
|
||||||
|
+ dbms_id = (known after apply)
|
||||||
|
+ dbms_type = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "app_user"
|
||||||
|
+ password = (sensitive value)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_networking_network.main will be created
|
||||||
|
+ resource "vkcs_networking_network" "main" {
|
||||||
|
+ admin_state_up = true
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "postgres-network"
|
||||||
|
+ port_security_enabled = true
|
||||||
|
+ private_dns_domain = (known after apply)
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ sdn = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_networking_router_interface.main will be created
|
||||||
|
+ resource "vkcs_networking_router_interface" "main" {
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ port_id = (known after apply)
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ router_id = "913bdd47-9155-45b2-b404-5c10d0086132"
|
||||||
|
+ sdn = (known after apply)
|
||||||
|
+ subnet_id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_networking_subnet.main will be created
|
||||||
|
+ resource "vkcs_networking_subnet" "main" {
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ cidr = "192.168.199.0/24"
|
||||||
|
+ enable_dhcp = true
|
||||||
|
+ enable_private_dns = (known after apply)
|
||||||
|
+ gateway_ip = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "postgres-subnet"
|
||||||
|
+ network_id = (known after apply)
|
||||||
|
+ no_gateway = false
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ sdn = (known after apply)
|
||||||
|
|
||||||
|
+ allocation_pool (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
Plan: 8 to add, 0 to change, 0 to destroy.
|
||||||
|
|
||||||
|
Changes to Outputs:
|
||||||
|
+ db_instance_full = (sensitive value)
|
||||||
|
+ db_name = "app_db"
|
||||||
|
+ db_port = 5432
|
||||||
|
+ db_user = "app_user"
|
||||||
|
random_password.db_password: Creating...
|
||||||
|
random_password.db_password: Creation complete after 0s [id=none]
|
||||||
|
local_file.db_password: Creating...
|
||||||
|
local_file.db_password: Creation complete after 0s [id=c065a6aa96dc86bce3c11dbcfcea69ec7a6b3cb1]
|
||||||
|
vkcs_networking_network.main: Creating...
|
||||||
|
vkcs_networking_network.main: Creation complete after 6s [id=ab0c70b6-f29d-4499-85b6-e844cd3888f3]
|
||||||
|
vkcs_networking_subnet.main: Creating...
|
||||||
|
vkcs_db_instance.postgres: Creating...
|
||||||
|
vkcs_networking_subnet.main: Creation complete after 6s [id=6166aaf3-cedb-43b2-94e0-ef2e7c749b1f]
|
||||||
|
vkcs_networking_router_interface.main: Creating...
|
||||||
|
vkcs_networking_router_interface.main: Creation complete after 6s [id=1a23a315-b826-49dd-995a-ea5797af0f87]
|
||||||
|
╷
|
||||||
|
│ Error: error creating vkcs_db_instance: Bad request with: [POST https://msk.cloud.vk.com/infra/database/v1.0/5aa354d05172439abcc5bfc3f682da49/instances], error message: {"badRequest": {"code": 400, "message": "The network must be routable"}}
|
||||||
|
│ Request ID: req-14a8783a-6776-4e99-ab9d-29ec42b9fdbc
|
||||||
|
│
|
||||||
|
│ with vkcs_db_instance.postgres,
|
||||||
|
│ on main.tf line 47, in resource "vkcs_db_instance" "postgres":
|
||||||
|
│ 47: resource "vkcs_db_instance" "postgres" {
|
||||||
|
│
|
||||||
|
╵
|
||||||
|
|
||||||
|
~/rosatom/terraform-practies
|
||||||
|
nix-shell ❌1 ❯ terraform apply -auto-approve 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.
|
||||||
|
╵
|
||||||
|
|
||||||
|
random_password.db_password: Refreshing state... [id=none]
|
||||||
|
local_file.db_password: Refreshing state... [id=c065a6aa96dc86bce3c11dbcfcea69ec7a6b3cb1]
|
||||||
|
data.vkcs_networking_router.main: Reading...
|
||||||
|
vkcs_networking_network.main: Refreshing state... [id=ab0c70b6-f29d-4499-85b6-e844cd3888f3]
|
||||||
|
data.vkcs_networking_router.main: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132]
|
||||||
|
vkcs_networking_subnet.main: Refreshing state... [id=6166aaf3-cedb-43b2-94e0-ef2e7c749b1f]
|
||||||
|
vkcs_networking_router_interface.main: Refreshing state... [id=1a23a315-b826-49dd-995a-ea5797af0f87]
|
||||||
|
|
||||||
|
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
|
||||||
|
+ create
|
||||||
|
<= read (data resources)
|
||||||
|
|
||||||
|
Terraform will perform the following actions:
|
||||||
|
|
||||||
|
# data.vkcs_db_instance.postgres_info will be read during apply
|
||||||
|
# (config refers to values not yet known)
|
||||||
|
<= data "vkcs_db_instance" "postgres_info" {
|
||||||
|
+ id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_db_database.app_db will be created
|
||||||
|
+ resource "vkcs_db_database" "app_db" {
|
||||||
|
+ dbms_id = (known after apply)
|
||||||
|
+ dbms_type = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "app_db"
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_db_instance.postgres will be created
|
||||||
|
+ resource "vkcs_db_instance" "postgres" {
|
||||||
|
+ availability_zone = "MS1"
|
||||||
|
+ flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab"
|
||||||
|
+ floating_ip_enabled = true
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ ip = (known after apply)
|
||||||
|
+ name = "terraform-postgres"
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ root_password = (sensitive value)
|
||||||
|
+ size = 10
|
||||||
|
+ volume_type = "ceph-ssd"
|
||||||
|
|
||||||
|
+ datastore {
|
||||||
|
+ type = "postgresql"
|
||||||
|
+ version = "15"
|
||||||
|
}
|
||||||
|
|
||||||
|
+ disk_autoexpand (known after apply)
|
||||||
|
|
||||||
|
+ network {
|
||||||
|
+ uuid = "ab0c70b6-f29d-4499-85b6-e844cd3888f3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_db_user.app_user will be created
|
||||||
|
+ resource "vkcs_db_user" "app_user" {
|
||||||
|
+ databases = [
|
||||||
|
+ "app_db",
|
||||||
|
]
|
||||||
|
+ dbms_id = (known after apply)
|
||||||
|
+ dbms_type = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "app_user"
|
||||||
|
+ password = (sensitive value)
|
||||||
|
}
|
||||||
|
|
||||||
|
Plan: 3 to add, 0 to change, 0 to destroy.
|
||||||
|
|
||||||
|
Changes to Outputs:
|
||||||
|
+ db_instance_full = (sensitive value)
|
||||||
|
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: Creation complete after 2m39s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61]
|
||||||
|
data.vkcs_db_instance.postgres_info: Reading...
|
||||||
|
vkcs_db_database.app_db: Creating...
|
||||||
|
data.vkcs_db_instance.postgres_info: Read complete after 1s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61]
|
||||||
|
vkcs_db_database.app_db: Still creating... [00m10s elapsed]
|
||||||
|
vkcs_db_database.app_db: Creation complete after 13s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61/app_db]
|
||||||
|
vkcs_db_user.app_user: Creating...
|
||||||
|
vkcs_db_user.app_user: Still creating... [00m10s elapsed]
|
||||||
|
vkcs_db_user.app_user: Creation complete after 12s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61/app_user]
|
||||||
|
|
||||||
|
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
|
||||||
|
db_instance_full = <sensitive>
|
||||||
|
db_name = "app_db"
|
||||||
|
db_port = 5432
|
||||||
|
db_user = "app_user"
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
~/rosatom/terraform-practies
|
||||||
|
nix-shell ❯ # Получение списка инстансов БД via 💠 default on ☁️ (ru-msk)
|
||||||
|
openstack database instance list
|
||||||
|
|
||||||
|
# Просмотр информации о конкретном инстансе
|
||||||
|
openstack database instance show my-postgres
|
||||||
|
|
||||||
|
# Получение параметров подключения
|
||||||
|
openstack database instance show my-postgres -c hosts -c datastore
|
||||||
|
openstack: 'database instance list' is not an openstack command. See 'openstack --help'.
|
||||||
|
Did you mean one of these?
|
||||||
|
address group create
|
||||||
|
address group delete
|
||||||
|
address group list
|
||||||
|
address group set
|
||||||
|
address group show
|
||||||
|
address group unset
|
||||||
|
address scope create
|
||||||
|
address scope delete
|
||||||
|
address scope list
|
||||||
|
address scope set
|
||||||
|
address scope show
|
||||||
|
catalog list
|
||||||
|
catalog show
|
||||||
|
openstack: 'database instance show my-postgres' is not an openstack command. See 'openstack --help'.
|
||||||
|
Did you mean one of these?
|
||||||
|
address group create
|
||||||
|
address group delete
|
||||||
|
address group list
|
||||||
|
address group set
|
||||||
|
address group show
|
||||||
|
address group unset
|
||||||
|
address scope create
|
||||||
|
address scope delete
|
||||||
|
address scope list
|
||||||
|
address scope set
|
||||||
|
address scope show
|
||||||
|
catalog list
|
||||||
|
catalog show
|
||||||
|
openstack: 'database instance show my-postgres -c hosts -c datastore' is not an openstack command. See 'openstack --help'.
|
||||||
|
Did you mean one of these?
|
||||||
|
address group create
|
||||||
|
address group delete
|
||||||
|
address group list
|
||||||
|
address group set
|
||||||
|
address group show
|
||||||
|
address group unset
|
||||||
|
address scope create
|
||||||
|
address scope delete
|
||||||
|
address scope list
|
||||||
|
address scope set
|
||||||
|
address scope show
|
||||||
|
catalog list
|
||||||
|
catalog show
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ aws s3 mb s3://my-cli-bucket --endpoint-url https://s3.ru-msk.vkcs.cloud on ☁️ (ru-msk)
|
||||||
|
make_bucket failed: s3://my-cli-bucket Could not connect to the endpoint URL: "https://s3.ru-msk.vkcs.cloud/my-cli-bucket"
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❌1 ❯ aws s3 mb s3://my-cli-bucket --endpoint-url https://hb.vkcloud-storage.ru on ☁️ (ru-msk)
|
||||||
|
make_bucket: my-cli-bucket
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ aws s3 cp index.html s3://my-cli-bucket/ --endpoint-url https://hb.vkcloud-storage.ru on ☁️ (ru-msk)
|
||||||
|
upload: ./index.html to s3://my-cli-bucket/index.html
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ aws s3api put-object-acl \ on ☁️ (ru-msk)
|
||||||
|
--bucket my-cli-bucket \
|
||||||
|
--key index.html \
|
||||||
|
--acl public-read \
|
||||||
|
--endpoint-url https://hb.vkcloud-storage.ru
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ curl http://my-cli-bucket.hb.vkcloud-storage.ru/index.html on ☁️ (ru-msk)
|
||||||
|
<h1>CLI Upload</h1>
|
||||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,84 @@
|
|||||||
|
~/rosatom/terraform-practies
|
||||||
|
nix-shell ❯ terraform apply -auto-approve 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.
|
||||||
|
╵
|
||||||
|
|
||||||
|
aws_s3_bucket.static_site: Refreshing state... [id=terraform-static-site]
|
||||||
|
aws_s3_object.index: Refreshing state... [id=index.html]
|
||||||
|
aws_s3_bucket_website_configuration.static_site: Refreshing state... [id=terraform-static-site]
|
||||||
|
aws_s3_object.error: Refreshing state... [id=error.html]
|
||||||
|
|
||||||
|
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
|
||||||
|
~ update in-place
|
||||||
|
|
||||||
|
Terraform will perform the following actions:
|
||||||
|
|
||||||
|
# aws_s3_bucket.static_site will be updated in-place
|
||||||
|
~ resource "aws_s3_bucket" "static_site" {
|
||||||
|
+ acl = "public-read"
|
||||||
|
id = "terraform-static-site"
|
||||||
|
tags = {}
|
||||||
|
# (14 unchanged attributes hidden)
|
||||||
|
|
||||||
|
# (3 unchanged blocks hidden)
|
||||||
|
}
|
||||||
|
|
||||||
|
# aws_s3_object.error will be updated in-place
|
||||||
|
~ resource "aws_s3_object" "error" {
|
||||||
|
+ acl = "public-read"
|
||||||
|
- content_encoding = "aws-chunked" -> null
|
||||||
|
id = "error.html"
|
||||||
|
tags = {}
|
||||||
|
+ version_id = (known after apply)
|
||||||
|
# (24 unchanged attributes hidden)
|
||||||
|
}
|
||||||
|
|
||||||
|
# aws_s3_object.index will be updated in-place
|
||||||
|
~ resource "aws_s3_object" "index" {
|
||||||
|
+ acl = "public-read"
|
||||||
|
- content_encoding = "aws-chunked" -> null
|
||||||
|
id = "index.html"
|
||||||
|
tags = {}
|
||||||
|
+ version_id = (known after apply)
|
||||||
|
# (24 unchanged attributes hidden)
|
||||||
|
}
|
||||||
|
|
||||||
|
Plan: 0 to add, 3 to change, 0 to destroy.
|
||||||
|
|
||||||
|
Changes to Outputs:
|
||||||
|
- website_url = "terraform-static-site.s3-website-us-east-1.amazonaws.com" -> null
|
||||||
|
aws_s3_bucket.static_site: Modifying... [id=terraform-static-site]
|
||||||
|
aws_s3_bucket.static_site: Modifications complete after 0s [id=terraform-static-site]
|
||||||
|
aws_s3_object.error: Modifying... [id=error.html]
|
||||||
|
aws_s3_object.index: Modifying... [id=index.html]
|
||||||
|
aws_s3_object.index: Modifications complete after 1s [id=index.html]
|
||||||
|
aws_s3_object.error: Modifications complete after 1s [id=error.html]
|
||||||
|
╷
|
||||||
|
│ Warning: Argument is deprecated
|
||||||
|
│
|
||||||
|
│ with aws_s3_bucket.static_site,
|
||||||
|
│ on main.tf line 45, in resource "aws_s3_bucket" "static_site":
|
||||||
|
│ 45: acl = "public-read" # вместо bucket policy
|
||||||
|
│
|
||||||
|
│ acl is deprecated. Use the aws_s3_bucket_acl resource instead.
|
||||||
|
│
|
||||||
|
│ (and 2 more similar warnings elsewhere)
|
||||||
|
╵
|
||||||
|
|
||||||
|
Apply complete! Resources: 0 added, 3 changed, 0 destroyed.
|
||||||
|
|
||||||
|
~/rosatom/terraform-practies
|
||||||
|
nix-shell ❯ curl http://terraform-static-site.hb.vkcloud-storage.ru/index.html via 💠 default on ☁️ (ru-msk)
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Terraform Site</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>Deployed with Terraform!</h1>
|
||||||
|
<p>This site was created automatically.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,70 @@
|
|||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ source ./mcs3340419193-openrc.sh on ☁️ (ru-msk)
|
||||||
|
Please enter your OpenStack Password for project 5aa354d05172439abcc5bfc3f682da49 as user remizov.kirill2005@yandex.ru:
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ openstack token issue on ☁️ (ru-msk)
|
||||||
|
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| Field | Value |
|
||||||
|
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| expires | 2026-06-14T11:49:13+0000 |
|
||||||
|
| id | gAAAAABqLocppTSFM820tp_aqpoM5ZhfILgDRfAK2opQAnu5bBTqDkaHpKOvlSJdczgcJ8hcCpcr8dmwD8yGr5PYVmANgTPSoPndbWXhqPJOgj7oiYHrLQEQO6qmusMSB1DGBJmcc0Ooll05KrLz_hb64W6unQuQyKFcT6od6wXZ |
|
||||||
|
| | s9l_bH8RWWk |
|
||||||
|
| project_id | 5aa354d05172439abcc5bfc3f682da49 |
|
||||||
|
| user_id | a9d31b4ea75643f7b64bbeeeb297ae1f |
|
||||||
|
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ openstack server create --flavor df3c499a-044f-41d2-8612-d303adc613cc \ on ☁️ (ru-msk)
|
||||||
|
--image "ubuntu-22-202602051629.gite7a38aaf" \
|
||||||
|
--key-name my-first-vm-ie9Ev9Cc \
|
||||||
|
--network "ec8c610e-6387-447e-83d2-d2c541e88164" \
|
||||||
|
--security-group ssh \
|
||||||
|
cli-advanced-vm
|
||||||
|
+-------------------------------------+---------------------------------------------------------------------------+
|
||||||
|
| Field | Value |
|
||||||
|
+-------------------------------------+---------------------------------------------------------------------------+
|
||||||
|
| OS-DCF:diskConfig | MANUAL |
|
||||||
|
| OS-EXT-AZ:availability_zone | None |
|
||||||
|
| OS-EXT-SRV-ATTR:host | None |
|
||||||
|
| OS-EXT-SRV-ATTR:hostname | None |
|
||||||
|
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
|
||||||
|
| OS-EXT-SRV-ATTR:instance_name | None |
|
||||||
|
| OS-EXT-SRV-ATTR:kernel_id | None |
|
||||||
|
| OS-EXT-SRV-ATTR:launch_index | None |
|
||||||
|
| OS-EXT-SRV-ATTR:ramdisk_id | None |
|
||||||
|
| OS-EXT-SRV-ATTR:reservation_id | None |
|
||||||
|
| OS-EXT-SRV-ATTR:root_device_name | None |
|
||||||
|
| OS-EXT-SRV-ATTR:user_data | None |
|
||||||
|
| OS-EXT-STS:power_state | N/A |
|
||||||
|
| OS-EXT-STS:task_state | scheduling |
|
||||||
|
| OS-EXT-STS:vm_state | building |
|
||||||
|
| OS-SRV-USG:launched_at | None |
|
||||||
|
| OS-SRV-USG:terminated_at | None |
|
||||||
|
| accessIPv4 | None |
|
||||||
|
| accessIPv6 | None |
|
||||||
|
| addresses | N/A |
|
||||||
|
| adminPass | DXZwVQrnJNa5 |
|
||||||
|
| config_drive | None |
|
||||||
|
| created | 2026-06-14T10:56:53Z |
|
||||||
|
| description | None |
|
||||||
|
| flavor | Basic-1-1-10 (df3c499a-044f-41d2-8612-d303adc613cc) |
|
||||||
|
| hostId | None |
|
||||||
|
| host_status | None |
|
||||||
|
| id | f3652d89-9110-4869-8f3f-82eb38f7c664 |
|
||||||
|
| image | ubuntu-22-202602051629.gite7a38aaf (a4e699d3-a66d-45e5-bb5d-70ea7c8de62d) |
|
||||||
|
| key_name | my-first-vm-ie9Ev9Cc |
|
||||||
|
| locked | None |
|
||||||
|
| locked_reason | None |
|
||||||
|
| name | cli-advanced-vm |
|
||||||
|
| progress | None |
|
||||||
|
| project_id | 5aa354d05172439abcc5bfc3f682da49 |
|
||||||
|
| properties | None |
|
||||||
|
| security_groups | name='4ee4e402-fb2a-4697-b8ce-9435e8db6fa3' |
|
||||||
|
| server_groups | None |
|
||||||
|
| status | BUILD |
|
||||||
|
| tags | |
|
||||||
|
| trusted_image_certificates | None |
|
||||||
|
| updated | 2026-06-14T10:56:54Z |
|
||||||
|
| user_id | a9d31b4ea75643f7b64bbeeeb297ae1f |
|
||||||
|
| volumes_attached | |
|
||||||
|
+-------------------------------------+---------------------------------------------------------------------------+
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
~/rosatom
|
||||||
|
nix-shell ❌1 ❯ # Остановите ВМ для консистентност on ☁️ (ru-msk)
|
||||||
|
openstack server stop cli-advanced-vm
|
||||||
|
|
||||||
|
# Создание образа из ВМ
|
||||||
|
openstack server image create \
|
||||||
|
--name my-custom-image \
|
||||||
|
--wait \
|
||||||
|
cli-advanced-vm
|
||||||
|
|
||||||
|
# Проверка создания образа
|
||||||
|
openstack image list | grep my-custom-image
|
||||||
|
|
||||||
|
# Запуск ВМ обратно (если нужно)
|
||||||
|
openstack server start cli-advanced-vm
|
||||||
|
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| Field | Value |
|
||||||
|
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| checksum | d8f7bbc3d1cc458bc8cb4a89d2d04fe4 |
|
||||||
|
| container_format | bare |
|
||||||
|
| created_at | 2026-06-14T11:11:27Z |
|
||||||
|
| disk_format | raw |
|
||||||
|
| file | /v2/images/84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6/file |
|
||||||
|
| id | 84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6 |
|
||||||
|
| min_disk | 10 |
|
||||||
|
| min_ram | 0 |
|
||||||
|
| name | my-custom-image |
|
||||||
|
| owner | 5aa354d05172439abcc5bfc3f682da49 |
|
||||||
|
| properties | base_image_ref='a4e699d3-a66d-45e5-bb5d-70ea7c8de62d', direct_url='rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6/snap', |
|
||||||
|
| | has_local_drives='True', 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', image_location='snapshot', image_state='available', image_type='snapshot', |
|
||||||
|
| | instance_uuid='f3652d89-9110-4869-8f3f-82eb38f7c664', is_ephemeral_root='True', locations='[{'url': |
|
||||||
|
| | 'rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6/snap', 'metadata': {'store': 'rbd'}}]', managed_type_net_devices='unmanaged', |
|
||||||
|
| | mcs_name='Ubuntu 22.04', mcs_os_distro='ubuntu', mcs_os_type='linux', mcs_os_version='22.04', os_admin_user='ubuntu', os_distro='ubuntu22.04', os_hidden='False', |
|
||||||
|
| | os_require_quiesce='True', os_type='linux', os_version='22.04', owner_project_name='mcs3340419193', owner_specified.openstack.md5='b56805f4106d5f6b701b589ad3d4e058', |
|
||||||
|
| | owner_specified.openstack.object='images/ubuntu-22-202602051629.gite7a38aaf', owner_specified.openstack.sha256='', owner_user_name='remizov.kirill2005@yandex.ru', |
|
||||||
|
| | stopped_at='2026-06-14T11:10:36.722329', stores='rbd', user_id='a9d31b4ea75643f7b64bbeeeb297ae1f' |
|
||||||
|
| protected | False |
|
||||||
|
| schema | /v2/schemas/image |
|
||||||
|
| size | 10737418240 |
|
||||||
|
| status | active |
|
||||||
|
| tags | |
|
||||||
|
| updated_at | 2026-06-14T11:13:27Z |
|
||||||
|
| virtual_size | 10737418240 |
|
||||||
|
| visibility | private |
|
||||||
|
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| 84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6 | my-custom-image | active |
|
||||||
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 80 KiB |
@@ -0,0 +1,38 @@
|
|||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ curl -i -X POST https://cloud.vk.com/identity/v3/auth/tokens \ on ☁️ (ru-msk)
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"auth": {
|
||||||
|
"identity": {
|
||||||
|
"methods": ["password"],
|
||||||
|
"password": {
|
||||||
|
"user": {
|
||||||
|
"name": "remizov.kirill2005@yandex.ru",
|
||||||
|
"password": "*#Woron210105#*",
|
||||||
|
"domain": {"name": "users"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": {
|
||||||
|
"project": {
|
||||||
|
"id": "5aa354d05172439abcc5bfc3f682da49"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
HTTP/2 201
|
||||||
|
date: Sun, 14 Jun 2026 12:25:05 GMT
|
||||||
|
server: Apache
|
||||||
|
content-length: 34685
|
||||||
|
x-subject-token: gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo
|
||||||
|
vary: X-Auth-Token
|
||||||
|
x-openstack-request-id: req-234f5362-6427-43d2-998e-a5355bd4ee8c
|
||||||
|
content-type: application/json
|
||||||
|
strict-transport-security: max-age=31536000; preload;
|
||||||
|
set-cookie: PROXYSRV_BACKEND=06250f27fe83c831|ai6dp|ai6dp; path=/; Secure
|
||||||
|
|
||||||
|
{"token": {"methods": ["password"], "project": {"id": "5aa354d05172439abcc5bfc3f682da49", "name": "mcs3340419193", "domain": {"id": "c84eb7b313904c2d911de6e89ec564dd", "name": "mcs7171191262"}}, "is_domain": false, "user": {"id": "a9d31b4ea75643f7b64bbeeeb297ae1f", "name": "remizov.kirill2005@yandex.ru", "domain": {"id": "users", "name": "users"}, "password_expires_at": null}, "roles": [{"id": "ffffffff000000000000000000000000", "name": "mcs_owner"}], "audit_ids": ["XH5GlM2PRCG3pCHimZempQ"], "catalog": [{"endpoints": [{"id": "081c6afa0fde405db2cd587e1fe03ae0", "interface": "internal", "region_id": "RegionOne", "url": "http://172.28.3.1:7610", "region": "RegionOne"}], "id": "0bd0e75dbd7b4b9798c90e79cc50c194", "type": "incidents", "name": "storagetest"}, {"endpoints": [{"id": "65fc884fcee74a01a52615d7b07c8379", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8004/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "8c7043081be942b3bf0972378492ee1a", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8004/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "97224b4ec05c47d8be4d9592bec06939", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8004/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "0eb2d2ed8a2d46e2887f394479d11680", "type": "orchestration", "name": "heat"}, {"endpoints": [{"id": "4a6c33f7a6a14935921bc99e18e2383a", "interface": "admin", "region_id": "RegionOne", "url": "http://evacuation-controller-api.ep.compute.i", "region": "RegionOne"}, {"id": "5dbcddce35de4a7ab22a24a7f68ac1e8", "interface": "internal", "region_id": "kz", "url": "http://evacuation-controller-api.ep.qaz.compute.i", "region": "kz"}, {"id": "a4b73787925d4f26a788a425d50c99c7", "interface": "internal", "region_id": "RegionOne", "url": "http://evacuation-controller-api.ep.compute.i", "region": "RegionOne"}, {"id": "e31ea275ecd44e75854573ac4e3df064", "interface": "admin", "region_id": "kz", "url": "http://evacuation-controller-api.ep.qaz.compute.i", "region": "kz"}], "id": "15e8acbde8254fc9ab2c73bbab5306ae", "type": "evacuate", "name": "evacuation"}, {"endpoints": [{"id": "ded5ea8264d842ffb9167248223a1643", "interface": "internal", "region_id": "RegionOne", "url": "https://scrooge-price-api-keystone.ep.compute.i", "region": "RegionOne"}], "id": "17149a8106ee45bf86cc95b875f2f041", "type": "scrooge-price-api-sa", "name": "scrooge-price-api-sa"}, {"endpoints": [{"id": "2042570f467f418798b543d5887afb22", "interface": "admin", "region_id": "RegionOne", "url": "http://dbaas-proxy-private.ep.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "2cb999a467c7448097b95bb138816157", "interface": "internal", "region_id": "RegionOne", "url": "http://dbaas-proxy-private.ep.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "6bb6fc34ff5b4fa79f3022067b22c287", "interface": "admin", "region_id": "kz", "url": "http://dbaas-proxy-private.ep.qaz.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "7d9d1c3e1c6f408cb29c6516fc7da792", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/database/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "ce9b4d04c82f4b6987fb4bc577e0ed4d", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/infra/database/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "d7afa31629db4611836a4e581c3e2b74", "interface": "internal", "region_id": "kz", "url": "http://dbaas-proxy-private.ep.qaz.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}], "id": "17bc6967100b4de98e4f68ffab682116", "type": "database", "name": "trove"}, {"endpoints": [{"id": "a146596f0e934bb0816b905c8dcfac7f", "interface": "internal", "region_id": "RegionOne", "url": "http://metrics-server-s2s-api.ep.compute.i", "region": "RegionOne"}, {"id": "f5a383c44918409f9cd56c45a2296db6", "interface": "internal", "region_id": "kz", "url": "http://metrics-server-s2s-api.ep.qaz.compute.i", "region": "kz"}], "id": "1922f73588cd4976820d32233f7132f8", "type": "monitoring", "name": "monitoring-writer"}, {"endpoints": [{"id": "2c548b801b10455dbd8bb804d340dee8", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8778", "region": "kz"}, {"id": "4163559b4998475eabb0648867fb71da", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8778", "region": "RegionOne"}, {"id": "5e87f1c90a0640c8b921db98a26ae9df", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8778", "region": "RegionOne"}, {"id": "6086296bb79d429092e7a7b272f994e6", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8778", "region": "kz"}, {"id": "7110f250d8514deb8c97d462865373d8", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.Line truncated
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ TOKEN="gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo"
|
||||||
|
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/flavors/detail" \ on ☁️ (ru-msk)
|
||||||
|
-H "X-Auth-Token: $TOKEN" | jq '.flavors[] | {name: .name, id: .id, disk: .disk} | select(.disk > 0)'
|
||||||
|
{
|
||||||
|
"name": "Basic-1-2-40",
|
||||||
|
"id": "19b38715-48cd-495b-9391-4c4e9d424518",
|
||||||
|
"disk": 40
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Basic-1-2-20",
|
||||||
|
"id": "25ae869c-be29-4840-8e12-99e046d2dbd4",
|
||||||
|
"disk": 20
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Advanced-8-16-100",
|
||||||
|
"id": "283fa444-8d59-4e83-b6f4-90613c52a5a4",
|
||||||
|
"disk": 100
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Advanced-16-64-50",
|
||||||
|
"id": "59f7faf3-d817-4cb8-ae69-8b4b92565f94",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Advanced-16-32-50",
|
||||||
|
"id": "670f9d36-d01b-4a4a-a8e5-c88cfb9ea0ec",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Advanced-8-32-50",
|
||||||
|
"id": "76fd2a82-4095-49b7-acc9-80ee90284ce9",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Standard-4-8-50",
|
||||||
|
"id": "77109506-bf0c-44a9-9e97-53360e9898bc",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Basic-1-4-50",
|
||||||
|
"id": "7e6f3416-f74a-40b5-86e8-82d14615f329",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Advanced-8-16-160",
|
||||||
|
"id": "7f04b02c-5260-4b5d-bccf-4151c5ade92d",
|
||||||
|
"disk": 160
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Standard-4-8-80",
|
||||||
|
"id": "908479b5-1138-46b6-b746-48bf6c24e548",
|
||||||
|
"disk": 80
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Standard-2-4-50",
|
||||||
|
"id": "b7d20f15-82f1-4ed4-a12e-e60277fe955f",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Standard-2-8-50",
|
||||||
|
"id": "bf714720-78da-4271-ab7d-0cf5e2613f14",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Standard-2-4-40",
|
||||||
|
"id": "d659fa16-c7fb-42cf-8a5e-9bcbe80a7538",
|
||||||
|
"disk": 40
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Basic-1-1-10",
|
||||||
|
"id": "df3c499a-044f-41d2-8612-d303adc613cc",
|
||||||
|
"disk": 10
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"name": "Standard-4-16-50",
|
||||||
|
"id": "ea26a8fe-5915-4bda-abdc-34b0be148e97",
|
||||||
|
"disk": 50
|
||||||
|
}
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ curl -s -X GET "https://infra.mail.ru:9696/v2.0/networks" \ on ☁️ (ru-msk)
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" | jq '.networks[] | {id, name}'
|
||||||
|
{
|
||||||
|
"id": "ec8c610e-6387-447e-83d2-d2c541e88164",
|
||||||
|
"name": "internet"
|
||||||
|
}
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ curl -s -X GET "https://infra.mail.ru:9292/v2/images" \ on ☁️ (ru-msk)
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" | jq '.images[] | {id, name}'
|
||||||
|
{
|
||||||
|
"id": "91092b96-c349-401f-bf4c-0ddeecb88f4d",
|
||||||
|
"name": "alse-1.8.4-max-vkcloud-mg16.0.0-amd64"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "74b5e605-c1c0-44f8-9019-ea4e9d19177b",
|
||||||
|
"name": "opensuse-leap-15.5-202603071211.git3f834af3"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "a240235f-fdac-414c-94eb-1022025158c0",
|
||||||
|
"name": "opensuse-leap-15.6-202602160742.git3f834af3"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "fcbf111e-03b7-47e5-b348-59fecfc0af2c",
|
||||||
|
"name": "redos-std-73-vgpu-202602051650.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "c516abf0-0dad-4be1-b2b5-d7dae7093806",
|
||||||
|
"name": "ubuntu-24-vgpu-202602051634.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "b812255f-7b5f-4fd6-bad4-8b24265dc076",
|
||||||
|
"name": "ubuntu-24-202602051634.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "dc0f6670-ee20-425a-bda6-666d498a6aa9",
|
||||||
|
"name": "redos-std-80-202602051633.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "26534385-131c-4217-a2d3-a034a33993b0",
|
||||||
|
"name": "ubuntu-18-202602051631.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "371e0707-6700-48d1-97d8-e1a01a443fbf",
|
||||||
|
"name": "ubuntu-20-202602051631.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d",
|
||||||
|
"name": "ubuntu-22-202602051629.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "761117e5-b607-4041-9c47-f5cce1b19c34",
|
||||||
|
"name": "ubuntu-16-202602051624.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "1c064e46-8af6-40d5-b7d0-14e17573340d",
|
||||||
|
"name": "redos-std-73-202602051633.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "501f01b0-552b-4e76-984f-f17af9ba679b",
|
||||||
|
"name": "redos-crt-73-202602051634.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "80354fe5-91e2-4aac-998c-ccd72af1d27c",
|
||||||
|
"name": "debian-13-202602051630.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "41595402-4d3a-4055-b570-bbfb5dfb4fb1",
|
||||||
|
"name": "debian-12-202602051626.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "28610469-9621-4747-a226-564f8c74a2df",
|
||||||
|
"name": "debian-12-vgpu-202602051632.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "98d4aec9-8d26-43a3-99da-0e90e1db30c0",
|
||||||
|
"name": "debian-11-202602051625.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "9080fc2f-bb27-4274-b92b-d75a3ad4e249",
|
||||||
|
"name": "centos-8-stream-202602051626.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "cb04a0bc-b0e2-4670-b46f-ecc56668214b",
|
||||||
|
"name": "debian-10-202602051625.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "7ae8f6e7-ada2-4858-8420-4dfc671b3062",
|
||||||
|
"name": "centos-8-stream-vgpu-202602051634.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "bc3782cc-c2b8-4cc4-892a-5383558e433b",
|
||||||
|
"name": "centos-7.9-202602051631.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "1c7529ce-0897-4faf-b796-ada02dde0b43",
|
||||||
|
"name": "astra-vor-1.7-vgpu-202602051632.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "e403f5c9-6c44-44a8-875c-53acbbc3031d",
|
||||||
|
"name": "astra-or-1.7-vgpu-202602051639.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "096a045c-b875-4a4e-902f-eb93bc23719a",
|
||||||
|
"name": "almalinux-9.7-202602051629.gite7a38aaf"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"id": "f0045749-fb70-4ce8-9993-8ee3287ef56f",
|
||||||
|
"name": "almalinux-10.1-202602051628.gite7a38aaf"
|
||||||
|
}
|
||||||
|
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ curl -s -X POST "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \ on ☁️ (ru-msk)
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"server": {
|
||||||
|
"name": "api-created-vm",
|
||||||
|
"imageRef": "b812255f-7b5f-4fd6-bad4-8b24265dc076",
|
||||||
|
"flavorRef": "25ae869c-be29-4840-8e12-99e046d2dbd4",
|
||||||
|
"networks": [{"uuid": "ec8c610e-6387-447e-83d2-d2c541e88164"}],
|
||||||
|
"key_name": "my-first-vm-ie9Ev9Cc"
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
{"server": {"security_groups": [{"name": "default"}], "OS-DCF:diskConfig": "MANUAL", "id": "8c3f3134-560c-4558-9060-c3c6731792a8", "links": [{"href": "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8", "rel": "self"}, {"href": "https://infra.mail.ru:8774/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8", "rel": "bookmark"}], "adminPass": "8WwHM2JjPj62"}}%
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
~/rosatom
|
||||||
|
nix-shell ❌5 ❯ curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \ on ☁️ (ru-msk)
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" | jq '.servers'
|
||||||
|
[]
|
||||||
|
~/rosatom
|
||||||
|
nix-shell ❯ #После создания VM через API
|
||||||
|
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \ on ☁️ (ru-msk)
|
||||||
|
-H "X-Auth-Token: $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" | jq '.servers'
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "8c3f3134-560c-4558-9060-c3c6731792a8",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://infra.mail.ru:8774/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "api-created-vm"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
resource "vkcs_compute_keypair" "my_key" {
|
||||||
|
name = "terraform-key-local"
|
||||||
|
public_key = file("~/.ssh/terraform_rsa.pub")
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Блок vkcs_lb_member полностью удалён — добавишь ВМ руками через консоль или OpenStack CLI
|
||||||
@@ -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,5 @@
|
|||||||
|
output "lb_public_ip" {
|
||||||
|
value = vkcs_lb_loadbalancer.main.vip_address
|
||||||
|
}
|
||||||
|
|
||||||
|
# bastion_ip и web_ips_private удали, так как ВМ больше не в Terraform
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Указываем версию провайдера
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = {
|
||||||
|
source = "vk-cs/vkcs"
|
||||||
|
version = "~> 0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройка провайдера (использует переменные окружения из RC-файла)
|
||||||
|
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 @@
|
|||||||
|
my_ip = "95.37.52.68/32"
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
variable "my_ip" {
|
||||||
|
type = string
|
||||||
|
default = "95.37.52.68/32"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "flavor_web" {
|
||||||
|
type = string
|
||||||
|
default = "df3c499a-044f-41d2-8612-d303adc613cc"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "image_name" {
|
||||||
|
type = string
|
||||||
|
default = "ubuntu-22-202602051629.gite7a38aaf"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_public_key_path" {
|
||||||
|
type = string
|
||||||
|
default = "~/.ssh/id_rsa.pub"
|
||||||
|
}
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
# Указываем версию провайдера
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = {
|
||||||
|
source = "vk-cs/vkcs"
|
||||||
|
}
|
||||||
|
random = {
|
||||||
|
source = "hashicorp/random"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройка провайдера (использует переменные окружения из RC-файла)
|
||||||
|
provider "vkcs" {
|
||||||
|
username = "remizov.kirill2005@yandex.ru"
|
||||||
|
password = "*#Woron210105#*"
|
||||||
|
project_id = "5aa354d05172439abcc5bfc3f682da49"
|
||||||
|
region = "RegionOne" # Для Москвы
|
||||||
|
auth_url = "https://infra.mail.ru:35357/v3/"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- СУЩЕСТВУЮЩИЙ РОУТЕР ---
|
||||||
|
data "vkcs_networking_router" "main" {
|
||||||
|
name = "router_5390"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- СОЗДАНИЕ СЕТИ И ПОДСЕТИ ---
|
||||||
|
resource "vkcs_networking_network" "main" {
|
||||||
|
name = "postgres-network"
|
||||||
|
admin_state_up = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "main" {
|
||||||
|
name = "postgres-subnet"
|
||||||
|
network_id = vkcs_networking_network.main.id
|
||||||
|
cidr = "192.168.199.0/24"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ПОДКЛЮЧЕНИЕ ПОДСЕТИ К РОУТЕРУ ---
|
||||||
|
resource "vkcs_networking_router_interface" "main" {
|
||||||
|
router_id = data.vkcs_networking_router.main.id
|
||||||
|
subnet_id = vkcs_networking_subnet.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ИНСТАНС POSTGRESQL ---
|
||||||
|
# ИСПРАВЛЕНО: используем имя флавора для БД (Standard-2-6)
|
||||||
|
resource "vkcs_db_instance" "postgres" {
|
||||||
|
name = "terraform-postgres"
|
||||||
|
flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab" # <-- заменено на подходящий для БД
|
||||||
|
volume_type = "ceph-ssd"
|
||||||
|
size = 10
|
||||||
|
availability_zone = "MS1"
|
||||||
|
floating_ip_enabled = true
|
||||||
|
|
||||||
|
datastore {
|
||||||
|
type = "postgresql"
|
||||||
|
version = "15"
|
||||||
|
}
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.main.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ГЕНЕРАЦИЯ ПАРОЛЯ ---
|
||||||
|
resource "random_password" "db_password" {
|
||||||
|
length = 16
|
||||||
|
special = true
|
||||||
|
min_lower = 1
|
||||||
|
min_upper = 1
|
||||||
|
min_numeric = 1
|
||||||
|
min_special = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- БАЗА ДАННЫХ ---
|
||||||
|
resource "vkcs_db_database" "app_db" {
|
||||||
|
name = "app_db"
|
||||||
|
dbms_id = vkcs_db_instance.postgres.id
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ПОЛЬЗОВАТЕЛЬ ---
|
||||||
|
resource "vkcs_db_user" "app_user" {
|
||||||
|
name = "app_user"
|
||||||
|
password = random_password.db_password.result
|
||||||
|
dbms_id = vkcs_db_instance.postgres.id
|
||||||
|
databases = [vkcs_db_database.app_db.name]
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ДАННЫЕ ДЛЯ ПОЛУЧЕНИЯ HOSTNAME ---
|
||||||
|
data "vkcs_db_instance" "postgres_info" {
|
||||||
|
id = vkcs_db_instance.postgres.id
|
||||||
|
depends_on = [vkcs_db_instance.postgres]
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ЛОКАЛЬНЫЙ ФАЙЛ С ПАРОЛЕМ ---
|
||||||
|
resource "local_file" "db_password" {
|
||||||
|
content = "Database password: ${random_password.db_password.result}"
|
||||||
|
filename = "${path.module}/db_password.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- ВЫХОДНЫЕ ДАННЫЕ ---
|
||||||
|
output "db_host" {
|
||||||
|
value = data.vkcs_db_instance.postgres_info.hostname
|
||||||
|
}
|
||||||
|
|
||||||
|
output "db_port" {
|
||||||
|
value = 5432
|
||||||
|
}
|
||||||
|
|
||||||
|
output "db_name" {
|
||||||
|
value = vkcs_db_database.app_db.name
|
||||||
|
}
|
||||||
|
|
||||||
|
output "db_user" {
|
||||||
|
value = vkcs_db_user.app_user.name
|
||||||
|
}
|
||||||
|
|
||||||
|
output "db_instance_full" {
|
||||||
|
value = data.vkcs_db_instance.postgres_info
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||