commit 31817537f1275891c907721eb9629aebb9507bba Author: Kirill Date: Sun Jun 14 16:41:04 2026 +0300 first commit diff --git a/00_manifest.csv b/00_manifest.csv new file mode 100644 index 0000000..bab17f1 --- /dev/null +++ b/00_manifest.csv @@ -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, diff --git a/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md b/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md new file mode 100644 index 0000000..462a7df --- /dev/null +++ b/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md @@ -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. **Безопасность** – включена двухфакторная аутентификация. + ![Общий вид](VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png) +### 2. Создание первой ВМ через веб-интерфейс + +1. Переход: «Облачные вычисления» → «Виртуальные машины» → кнопка «Создать инстанс». +2. Создана ВМ `my-first-vm` со следующими параметрами: + - ОС: Ubuntu 24.04 + - Тип ВМ: STD3-1-2 + - Зона доступности: PA2 + - Размер диска: 12 ГБ + - Firewall: все разрешено + +![Создание первой ВМ](VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png) + +### 3. Подключение к ВМ по SSH + +1. Приватный ключ скачан автоматически при создании ВМ. +2. Выданы права на ключ: `chmod 400`. +3. Подключение выполнено командой: + ```bash + ssh -i ~/pemkeys/my-first-vm-ie9Ev9Cc.pem ubuntu@95.163.214.61 + ``` + +![SSH-подключение](VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png) + +### 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. Проверено, что сервер создан и работает. + +![Список ВМ после создания через CLI](VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png) +![Детали ВМ CLI](VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png) + +### 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 = "" + 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 + ``` + +![Terraform plan](VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png) + ![Terraform plan](VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png) +![Terraform apply успех](VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png) + +## 3. Доказательства + +- Скриншот создания первой ВМ: + ![Первая ВМ](VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png) +- Скриншот SSH-подключения: + ![SSH](VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png) +- ВМ, созданная через OpenStack CLI (список): + ![CLI ВМ список](VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png) +- Детали CLI-ВМ: + ![CLI ВМ детали](VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png) +- Процесс Terraform `plan`: + +![Terraform plan](VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png) + ![Terraform plan](VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png) +- Результат `terraform apply`: + ![Terraform apply](VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png) + +## 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`. diff --git a/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md b/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md new file mode 100644 index 0000000..8ee4985 --- /dev/null +++ b/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md @@ -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 " + +Web Server $(hostname) + +

Welcome to $(hostname)

+

Server IP: $(hostname -I | awk '{print $1}')

+

Backend server

+ +" > /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) и настройки мониторинга, что будет реализовано в следующих лабораторных работах. diff --git a/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md b/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md new file mode 100644 index 0000000..3905639 --- /dev/null +++ b/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md @@ -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 часа, что важно учитывать при проектировании реальных систем. Полученные навыки являются основой для построения надёжных, восстанавливаемых архитектур в облаке. diff --git a/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md b/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md new file mode 100644 index 0000000..68ef911 --- /dev/null +++ b/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md @@ -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 позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой. diff --git a/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md b/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md new file mode 100644 index 0000000..db2f5b6 --- /dev/null +++ b/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md @@ -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 позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой. diff --git a/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md b/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md new file mode 100644 index 0000000..ca62d06 --- /dev/null +++ b/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md @@ -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 "

Web Server 1

" > /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 "

Web Server 2

" > /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 позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой. diff --git a/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md b/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md new file mode 100644 index 0000000..5431fc6 --- /dev/null +++ b/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md @@ -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 + + + My Static Site +

Hello from S3!

+ + ``` +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 "

CLI Upload

" > 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 + + + Terraform Site + +

Deployed with Terraform!

+

This site was created automatically.

+ + + EOF + content_type = "text/html" + acl = "public-read" +} + +# Файл ошибки +resource "aws_s3_object" "error" { + bucket = aws_s3_bucket.static_site.bucket + key = "error.html" + content = "

404 - Page Not Found

" + 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 и бэкапов. diff --git a/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md b/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md new file mode 100644 index 0000000..bd5c0d8 --- /dev/null +++ b/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md @@ -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 с неполной поддержкой. diff --git a/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md b/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md new file mode 100644 index 0000000..e9d3619 --- /dev/null +++ b/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md @@ -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). diff --git a/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md b/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md new file mode 100644 index 0000000..889932c --- /dev/null +++ b/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md @@ -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-запрос. diff --git a/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png new file mode 100644 index 0000000..6978e2f Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png new file mode 100644 index 0000000..bdb1aab Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png new file mode 100644 index 0000000..df32910 Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png new file mode 100644 index 0000000..0785ce9 Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png new file mode 100644 index 0000000..d688cf4 Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png new file mode 100644 index 0000000..10d2027 Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png new file mode 100644 index 0000000..3d2aed5 Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png b/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png new file mode 100644 index 0000000..065ea53 Binary files /dev/null and b/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png differ diff --git a/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png b/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png new file mode 100644 index 0000000..31f1f24 Binary files /dev/null and b/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png differ diff --git a/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png new file mode 100644 index 0000000..89f65be Binary files /dev/null and b/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png new file mode 100644 index 0000000..5f4d5eb Binary files /dev/null and b/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png new file mode 100644 index 0000000..8228547 Binary files /dev/null and b/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png new file mode 100644 index 0000000..86ec256 Binary files /dev/null and b/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png new file mode 100644 index 0000000..8f90688 Binary files /dev/null and b/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png new file mode 100644 index 0000000..78440c9 Binary files /dev/null and b/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png b/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png new file mode 100644 index 0000000..7e4ac84 Binary files /dev/null and b/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png differ diff --git a/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png b/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png new file mode 100644 index 0000000..df35e3a Binary files /dev/null and b/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png differ diff --git a/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png b/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png new file mode 100644 index 0000000..6c66b45 Binary files /dev/null and b/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png differ diff --git a/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png b/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png new file mode 100644 index 0000000..ba71d41 Binary files /dev/null and b/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png differ diff --git a/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png b/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png new file mode 100644 index 0000000..47b40a7 Binary files /dev/null and b/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png differ diff --git a/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png b/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png new file mode 100644 index 0000000..fa04516 Binary files /dev/null and b/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png differ diff --git a/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png b/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png new file mode 100644 index 0000000..1bf3431 Binary files /dev/null and b/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png differ diff --git a/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png new file mode 100644 index 0000000..17f5e49 Binary files /dev/null and b/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png new file mode 100644 index 0000000..4602413 Binary files /dev/null and b/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png new file mode 100644 index 0000000..81d6f9a Binary files /dev/null and b/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png new file mode 100644 index 0000000..8554956 Binary files /dev/null and b/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png new file mode 100644 index 0000000..b67a01b Binary files /dev/null and b/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png new file mode 100644 index 0000000..3cb9458 Binary files /dev/null and b/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png new file mode 100644 index 0000000..096cc9d Binary files /dev/null and b/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png new file mode 100644 index 0000000..f94db93 Binary files /dev/null and b/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png new file mode 100644 index 0000000..034f468 Binary files /dev/null and b/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png b/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png new file mode 100644 index 0000000..2cc4ce1 Binary files /dev/null and b/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png differ diff --git a/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png b/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png new file mode 100644 index 0000000..05567d8 Binary files /dev/null and b/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png differ diff --git a/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png b/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png new file mode 100644 index 0000000..41e147d Binary files /dev/null and b/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png differ diff --git a/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log b/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log new file mode 100644 index 0000000..876c7fc --- /dev/null +++ b/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log @@ -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=> diff --git a/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log b/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log new file mode 100644 index 0000000..805d618 --- /dev/null +++ b/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log @@ -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 = +db_name = "app_db" +db_port = 5432 +db_user = "app_user" diff --git a/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log b/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log new file mode 100644 index 0000000..7ad62d7 --- /dev/null +++ b/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log @@ -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 diff --git a/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log b/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log new file mode 100644 index 0000000..04b9bb0 --- /dev/null +++ b/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log @@ -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) +

CLI Upload

diff --git a/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png b/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png new file mode 100644 index 0000000..e7fe0b5 Binary files /dev/null and b/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png differ diff --git a/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log b/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log new file mode 100644 index 0000000..d694d89 --- /dev/null +++ b/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log @@ -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) + + +Terraform Site + +

Deployed with Terraform!

+

This site was created automatically.

+ + diff --git a/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png b/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png new file mode 100644 index 0000000..c77c069 Binary files /dev/null and b/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png differ diff --git a/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log b/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log new file mode 100644 index 0000000..2cb3fef --- /dev/null +++ b/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log @@ -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 | | ++-------------------------------------+---------------------------------------------------------------------------+ diff --git a/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log b/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log new file mode 100644 index 0000000..0b3ba14 --- /dev/null +++ b/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log @@ -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 | diff --git a/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png b/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png new file mode 100644 index 0000000..8832e3d Binary files /dev/null and b/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png differ diff --git a/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png b/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png new file mode 100644 index 0000000..9994c77 Binary files /dev/null and b/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png differ diff --git a/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log b/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log new file mode 100644 index 0000000..f4f3c4d --- /dev/null +++ b/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log @@ -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.compute.i:8778", "region": "kz"}, {"id": "7def2c117bad4ab3a623969de40dff7d", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8778", "region": "RegionOne"}], "id": "1f89f9dc7ad446c1a1e5a7918adf3d24", "type": "placement", "name": "placement"}, {"endpoints": [{"id": "6825f188059f4533aa8e133b895e93b8", "interface": "public", "region_id": "RegionOne", "url": "https://mcs.mail.ru/infra/karboii/v1", "region": "RegionOne"}, {"id": "a3f71e06ee2e4422a01deb9f11c0bbf3", "interface": "public", "region_id": "kz", "url": "https://kz.mcs.mail.ru/infra/karboii/v1", "region": "kz"}, {"id": "b26505cf536644fba907de25509f32c3", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8011/v1", "region": "kz"}, {"id": "e63eb3c2f45844bf9fd2e84b7b17b782", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8011/v1", "region": "RegionOne"}], "id": "2319ff5a45a742b7858742d52a395ce6", "type": "data-protect", "name": "karboii"}, {"endpoints": [{"id": "8431b670a7d246b7b2c7598e52342a15", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/api/cdn/api/v1", "region": "RegionOne"}, {"id": "ddb7371f518741ac865b649f3a56029c", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/api/cdn/api/v1", "region": "kz"}], "id": "25ba0a1398e343cab1d9b7ad789d16b1", "type": "cdn", "name": "cdn"}, {"endpoints": [{"id": "29b834cc6f0b455589cc5510ab92a05f", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:35357/v3/", "region": "RegionOne"}, {"id": "53e02c5a7a1a46af84269f5e84531f07", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:35357/v3/", "region": "kz"}, {"id": "557ca72edafe491d96896d7fcf20adfa", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:35357/v3/", "region": "kz"}, {"id": "9b0f95f3ba3743e5a4bbf585568e462c", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:35357/v3/", "region": "RegionOne"}, {"id": "c186bbf7e8394e6faa9ea2ab34395335", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/identity/v3/", "region": "RegionOne"}, {"id": "f5c119c73a064707bd49e1d1c884acf6", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/infra/identity/v3/", "region": "kz"}], "id": "2c76361a7e7841249518250629f931fa", "type": "identity", "name": "keystone"}, {"endpoints": [{"id": "2cd4b62fc62346669519cfe670f9e0f2", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8776/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "2cdbba969f6f405da2da0ead46101d7e", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8776/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "38b03f3cff1b4d3b8ade63fe9661d60f", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8776/v1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "5c191067b6e3434fb9641afbc9e76d83", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8776/v1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "78a4e4738e5141da8336e8a03d3d6c58", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8776/v1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "85bf8d0962ac4cfcb53f6534cdd63678", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8776/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "306432a23d4341869377b7e6b293cfb1", "type": "volume", "name": "cinder"}, {"endpoints": [{"id": "43ebbfd9ef304ed1b327f08ffebf092b", "interface": "internal", "region_id": "RegionOne", "url": "http://audit-admin.ep.compute.i", "region": "RegionOne"}, {"id": "fa9e50b351ea4419b329062d88a0e020", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/audit/admin/", "region": "RegionOne"}], "id": "342d51f307d54535ba72d6b5326abac2", "type": "audit", "name": "audit-admin"}, {"endpoints": [{"id": "3efcc095f3b746ba8da8863cafa3aa79", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8774/v2.1", "region": "RegionOne"}, {"id": "8fc29b38a6134db583f590f8720b4228", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8774/v2.1", "region": "kz"}, {"id": "98cac30603b544b2a6a5941f67b27ad4", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8774/v2.1", "region": "RegionOne"}, {"id": "a3918ce6289b4641be84d4ebb9b0696a", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8774/v2.1", "region": "kz"}, {"id": "a8a03077f10b490bb8392e3693263a57", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8774/v2.1", "region": "kz"}, {"id": "fa292edead4949d99057b8ce5eb23318", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8774/v2.1", "region": "RegionOne"}], "id": "351bb5974c9f4b5daa29deb4803773aa", "type": "compute", "name": "nova"}, {"endpoints": [{"id": "4c5bf723a67f4d1fb5a76edc78b09833", "interface": "public", "region_id": "RegionOne", "url": "https://mcs.mail.ru/quota-manager", "region": "RegionOne"}, {"id": "a7a07a214fd8405e88a2247ac7506402", "interface": "internal", "region_id": "kz", "url": "https://quota-manager-public-superadmin.ep.qaz.infra.devmail.ru", "region": "kz"}, {"id": "e00565b81bc6459a981dda719972007c", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru/quota-manager", "region": "kz"}, {"id": "e2c706ca82f54bb6bc6bf36b3e054ca2", "interface": "internal", "region_id": "RegionOne", "url": "http://quota-manager-public-superadmin.ep.compute.i", "region": "RegionOne"}], "id": "36d25e890ac94ed3b781d57c781f9163", "type": "quota-manager", "name": "quota-manager"}, {"endpoints": [{"id": "57388108860f4a84a4502dee0432241b", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/alerting/", "region": "RegionOne"}, {"id": "c1c6da9223a447dbb23e60803a7f891d", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/infra/alerting/", "region": "kz"}], "id": "380312363f5846b4b628f98056b5bf9c", "type": "monitoring", "name": "monitoring-alerts"}, {"endpoints": [{"id": "b0c637895a6e46e3a2d67edfc7d87802", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/atom", "region": "RegionOne"}, {"id": "b81c24e2c8ac4aa0a70b44be24033ab3", "interface": "public", "region_id": "kz", "url": "https://kz.mcs.mail.ru/atom", "region": "kz"}], "id": "3b330c1efe1f4b0d954679c5213686bb", "type": "dataplatform", "name": "atom"}, {"endpoints": [], "id": "4205af8ee84f439081d6ec31db2c6d21", "type": "cloudformation", "name": "heat-cfn"}, {"endpoints": [{"id": "43251aedd6f1428ba0dc01938860c941", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru/billing/public/v1/projects/mcs3340419193", "region": "RegionOne"}, {"id": "bbf571b99f2d482cad63f9f0aba7cb01", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru/billing/public/v1/projects/mcs3340419193", "region": "kz"}], "id": "45ab3f4e295a42baafde6476f003272b", "type": "billing", "name": "billing"}, {"endpoints": [{"id": "b50d81d7465141fca8fa367c7ee1c3a2", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:7609", "region": "RegionOne"}], "id": "475976697f0e49e7b5ec46e3067c525b", "type": "volume-resources-scheduler", "name": "storeman"}, {"endpoints": [{"id": "4fef4ded554c49f9a33615103f4565c2", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/monitoring/query/", "region": "RegionOne"}, {"id": "df99598be40c4e7f923788a2bdee79b1", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/monitoring/query/", "region": "kz"}], "id": "59e6f2c8f8844437bdd70f88fedfd65d", "type": "monitoring", "name": "monitoring-reader"}, {"endpoints": [{"id": "236fcc973d59418bb18eca259c0e111d", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8386/v1.1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "3cd48d9f4aad48beb96bd10b699f526f", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8386/v1.1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "61b66946c0ff42da96a5dea250589d84", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8386/v1.1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "7f8e611da97548b1ac95a61333be89ea", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8386/v1.1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "da9236291e394a079f2bd946487b2267", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru/infra/sahara/v1.1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "f28389f3af7f475faa4599b97fd40ead", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8386/v1.1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}], "id": "611ac9961e6a4055bab4a6435df9eeec", "type": "data-processing", "name": "sahara"}, {"endpoints": [{"id": "86df4d3c7c9b40178e5fa867f5d74666", "interface": "admin", "region_id": "RegionOne", "url": "http://scrooge-price-api-basic.ep.compute.i", "region": "RegionOne"}, {"id": "b69be3fcf4f141058b553cd71fa2f251", "interface": "internal", "region_id": "RegionOne", "url": "http://scrooge-price-api-basic.ep.compute.i", "region": "RegionOne"}], "id": "6336f65399674e79ae7c22895478038a", "type": "scrooge-price-api-s2s", "name": "scrooge-price-api-s2s"}, {"endpoints": [], "id": "651925edb9004ae6930e9973470fe20d", "type": "backup", "name": "freezer"}, {"endpoints": [{"id": "5ef69770180d4efa9b97b1cd3caa3c45", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/monitoring/dashboards/", "region": "kz"}, {"id": "a181a3ff5c98407285c94daebfd53fe3", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/monitoring/dashboards/", "region": "RegionOne"}], "id": "654ea020916f4984b97946294d2fdb49", "type": "monitoring", "name": "monitoring-dashboards"}, {"endpoints": [{"id": "0e3c1ff7234e47c09158334347a7b0df", "interface": "public", "region_id": "kz", "url": "https://kz.mcs.mail.ru/public-dns", "region": "kz"}, {"id": "cbef02385a694e96a465809fc333f364", "interface": "public", "region_id": "RegionOne", "url": "https://mcs.mail.ru/public-dns", "region": "RegionOne"}], "id": "65e4a21132f148c1899d3eb5a43fe88c", "type": "publicdns", "name": "publicdns"}, {"endpoints": [{"id": "3135b2d64ba14846870d3ccad977ec8f", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/mlplatform", "region": "RegionOne"}, {"id": "4d9e6bcbaa0b401398fa750c39f6330a", "interface": "internal", "region_id": "RegionOne", "url": "https://mlplatform.ep.compute.i", "region": "RegionOne"}], "id": "6cc8ccd1fdd645978445541401b2935c", "type": "mlplatform", "name": "mlplatform"}, {"endpoints": [{"id": "3cc23b1ff3dd4220b3d789333e180156", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/service-users/public/v1/tenants/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "dae8badb83f34b5589985241c5751d06", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/service-users/public/v1/tenants/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "6e90bf2b284445db89d27de40a43f166", "type": "service-users", "name": "service-users"}, {"endpoints": [{"id": "41eef60db33f44f881753c10a388bb80", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8776/v2/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "6126a96da3e7437ca7bd4e6d4ab49847", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8776/v2/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "6ef6897773f24b6589384819e7cca0ff", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8776/v2/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "afdc5a7effbf4b5895480c0266149c29", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8776/v2/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "c908dac135a84470b02632fb5b0b6594", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8776/v2/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "fffa98bbc7f44dafb4edd455183b5c2d", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8776/v2/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "8683f557133948e191e6230f9de408cd", "type": "volumev2", "name": "cinderv2"}, {"endpoints": [{"id": "2e7788a3b19d4a8bb66b2296ebdde28d", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:9292", "region": "RegionOne"}, {"id": "48fcb7b9c81c4810bd2fea59615a602f", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:9292", "region": "kz"}, {"id": "502dcfdc67b840e6a224b1a77242351c", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:9292", "region": "RegionOne"}, {"id": "758edd3188e04f6db5ec610bb952476f", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:9292", "region": "RegionOne"}, {"id": "d2787e2019214fabbd711a41bc05b66c", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:9292", "region": "kz"}, {"id": "d9d64af4a659452c8bc3d5d9bd366fe1", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:9292", "region": "kz"}], "id": "8c8887f888fc4e2d94145142c36258a6", "type": "image", "name": "glance"}, {"endpoints": [{"id": "4434e0e96e604c7b969c9a0424ba7be2", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/container/managed-kubernetes/v1", "region": "RegionOne"}, {"id": "58ec21018f524e0f955ef457ead8a4ce", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:9511/managed-kubernetes/v1", "region": "kz"}, {"id": "919c9c3e27a54690821b0c75b47bd3bc", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru/infra/container/managed-kubernetes/v1", "region": "kz"}, {"id": "cd2b52769c98421e98658397ef3ac902", "interface": "internal", "region_id": "RegionOne", "url": "http://172.28.3.1:9511/managed-kubernetes/v1", "region": "RegionOne"}], "id": "9013cbd8b6354159a23792c71da0d7bc", "type": "managed-k8s", "name": "managed-k8s"}, {"endpoints": [{"id": "7e808d2f18ea44f494da39dd8d5ea814", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/cloudlogs/admin/", "region": "RegionOne"}, {"id": "c1a06e965425494c8ed432cf449c711c", "interface": "internal", "region_id": "kz", "url": "http://cloudlogs-admin.ep.qaz.compute.i", "region": "kz"}, {"id": "da07d1dab25f4e39802d8b2bdd3a2f0c", "interface": "internal", "region_id": "RegionOne", "url": "http://cloudlogs-admin.ep.compute.i", "region": "RegionOne"}, {"id": "e9f50d15781042639187a9d52f7e5f7b", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/cloudlogs/admin/", "region": "kz"}], "id": "9f3d8976a3b1485bb3aaff9e24da7ab2", "type": "logging", "name": "logging-admin"}, {"endpoints": [{"id": "9fab6fd8804d4df3ba69a352f1786fd8", "interface": "internal", "region_id": "RegionOne", "url": "http://172.28.3.1:36569", "region": "RegionOne"}, {"id": "b61324212a2448bfb8c06ab498415e56", "interface": "admin", "region_id": "RegionOne", "url": "http://172.28.3.1:36569", "region": "RegionOne"}, {"id": "baa3d1fa477c4998b9b82491e8487d71", "interface": "public", "region_id": "RegionOne", "url": "https://mcs.mail.ru/scrooge", "region": "RegionOne"}], "id": "a0171be8f03b40c38dd5f3f8ee57507f", "type": "public-scrooge-api", "name": "public-scrooge-api"}, {"endpoints": [{"id": "2d7970bbd5b7429b8587d489d82bbf52", "interface": "internal", "region_id": "kz", "url": "http://managed-k8s-api-paas.ep.qaz.compute.i/managed-kubernetes/v1", "region": "kz"}, {"id": "e356078e667843aebc533d15082c370f", "interface": "internal", "region_id": "RegionOne", "url": "http://managed-k8s-api-paas.ep.compute.i/managed-kubernetes/v1", "region": "RegionOne"}], "id": "aec8565c77de4e4e83889d8d3e6cf80e", "type": "managed-k8s-api-paas", "name": "managed-k8s"}, {"endpoints": [], "id": "b1601f41f2274786b6e1fba92159df29", "type": "event", "name": "panko"}, {"endpoints": [], "id": "b3b23cd75478490bab2e62374afc1387", "type": "application-catalog", "name": "murano"}, {"endpoints": [{"id": "62b19c7fabcd40849ba433b64251c749", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8042", "region": "RegionOne"}, {"id": "6b4fe6922bec4c748b6235009180d867", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8042", "region": "RegionOne"}, {"id": "df8ded1b788d42d696abec5bfe91740d", "interface": "public", "region_id": "RegionOne", "url": "https://public.infra.mail.ru:8042", "region": "RegionOne"}], "id": "b77d62d1e7b14cd5927a8afee02a734a", "type": "alarming", "name": "aodh"}, {"endpoints": [{"id": "3330b09b50e6462087db329ddc41877e", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/cloudlogs/", "region": "RegionOne"}, {"id": "9845df0ca7074704bcf7d44fddf97f4b", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/cloudlogs/", "region": "kz"}], "id": "b886d12abef4433988ed8c9ea63bffd7", "type": "logging", "name": "logging-reader"}, {"endpoints": [{"id": "2dea96dd4f124a0da5f7c122ccb531ad", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8776/v3/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "3d3918e0a3114330a0c03483839d27fb", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8776/v3/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "6f08c367c65a4f549d47e74e0ff2d419", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8776/v3/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "b9000fcbd5e249729b9820f07a2c5b60", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8776/v3/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "c57e4d8be3144735a8ef20be6dd3c9eb", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8776/v3/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "f1bd92f502bd4e498146532253aaa1c9", "interface": "public", "region_id": "RegionOne", "url": "https://public.infra.mail.ru:8776/v3/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "bec476c9fff64199a1a00f79320a336a", "type": "volumev3", "name": "cinderv3"}, {"endpoints": [{"id": "b64f4f9a9fcd479280c0371552075284", "interface": "public", "region_id": "kz", "url": "https://kz.mcs.mail.ru/infra/container/addons", "region": "kz"}, {"id": "eb248d9f74c4494e94848c6f4f0c5ea3", "interface": "public", "region_id": "RegionOne", "url": "https://mcs.mail.ru/infra/container/addons", "region": "RegionOne"}], "id": "c239e579b5674c099ab7be9d545ab86d", "type": "manage-cluster-addons", "name": "magnum-addons"}, {"endpoints": [{"id": "3223f093be7942b5a16e20bb28b76fd6", "interface": "internal", "region_id": "kz", "url": "http://auditlogs-s2s.ep.qaz.compute.i", "region": "kz"}, {"id": "9c0147de99b14916ba6f43df67220f1c", "interface": "internal", "region_id": "RegionOne", "url": "http://auditlogs-s2s.ep.compute.i", "region": "RegionOne"}], "id": "cbc542a586544441a15ab71e6635795f", "type": "audit", "name": "audit-writer"}, {"endpoints": [], "id": "d151fc9156fb4c50ad1953df061dcc72", "type": "logging", "name": "logging-writer"}, {"endpoints": [{"id": "73d3238253d04ab9a0435576d404ef18", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/audit/reader/", "region": "RegionOne"}], "id": "d2f507b5e8c44f9eab07696ad77f5382", "type": "audit", "name": "audit-reader"}, {"endpoints": [{"id": "437f3a1729fa449cb7b7a3d219b7d6f2", "interface": "public", "region_id": "RegionOne", "url": "https://public.infra.mail.ru:8799/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "5b0bce75fb704e32ac7d953e8b7ee4db", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8799/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "b697503a76df4946b25377073233475d", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8799/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "d9911111357749caab7fd33805817531", "type": "data-protect", "name": "karbor"}, {"endpoints": [], "id": "de87e124aa8d4c29adc0fb779a3b8c4f", "type": "scrooge-user-api", "name": "scrooge-user-api"}, {"endpoints": [{"id": "320999a0d65f48768c392ffb283ccf15", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8786/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "72d3cf532265427c9ae56ffa58c74325", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8786/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "7e4aa6c5c3694118ab2f5ccbaa49591d", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8786/v1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "8eafddaaaea64a12b772041480f4e081", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8786/v1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "d0ce6f56a1ce417b981cdf92e91a1ba2", "interface": "public", "region_id": "RegionOne", "url": "https://public.infra.mail.ru:8786/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "f2468a623ba3431697758fd642de2de0", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8786/v1/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}], "id": "e065e907698646a5bbb65e8d597276c6", "type": "share", "name": "manila"}, {"endpoints": [], "id": "e12fa632d7ba4496848ffc46d2dc7321", "type": "object-store", "name": "swift"}, {"endpoints": [{"id": "bafb686483d748bfaefa5968c7e8c5be", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:7610", "region": "RegionOne"}], "id": "e14dbde072f940edb0397c97b23f8f9e", "type": "incidents", "name": "unotify"}, {"endpoints": [{"id": "6129a6031fb340a890f44aae8a0457f5", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:9696", "region": "RegionOne"}, {"id": "861c3b9d4c664ff3bcef1696407e2333", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:9696", "region": "kz"}, {"id": "8b2c4d6948044788ac80d3e711c18b91", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:9696", "region": "RegionOne"}, {"id": "8c8312bd6ab34f668f102166f0a98380", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:9696", "region": "kz"}, {"id": "c5c8c528cc664b9da249ffd5e73e294a", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:9696", "region": "RegionOne"}, {"id": "e5a6545b60dc4f9fbbfd6dc330d342d9", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:9696", "region": "kz"}], "id": "e1f852ee508d4b56b3dea7a7fa6d298f", "type": "network", "name": "neutron"}, {"endpoints": [], "id": "eb51d9cfe98c49beb98806cf74b2f5d9", "type": "metering", "name": "ceilometer"}, {"endpoints": [{"id": "5810a38a5695455c95db0d48e6c72175", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8786/v2/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "877a86ff1a79479892f9fb2c51cd5952", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:8786/v2/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "8ee961e1567b4621905ca27cf6d17ad4", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8786/v2/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "c20bdd6d33ba44d3b3f26d214b900e82", "interface": "public", "region_id": "RegionOne", "url": "https://public.infra.mail.ru:8786/v2/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "c508f23af5d44fb795322bf5d64fe195", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8786/v2/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "d72e01c3fa474556abb5ed002e92e675", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8786/v2/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}], "id": "eee73ac2914a40d9bb64b0ea609157e7", "type": "sharev2", "name": "manilav2"}, {"endpoints": [{"id": "44e3dd566250444b9d4c459473c7f7aa", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:9511/v1", "region": "RegionOne"}, {"id": "4c9e8ffa56874536a088884b8f354513", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:9511/v1", "region": "RegionOne"}, {"id": "7813407d694147dcabd4dd9275f59f0c", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:9511/v1", "region": "kz"}, {"id": "82a33bd57deb4afc9b244d9f1eb64aaa", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:9511/v1", "region": "kz"}, {"id": "88302e5a77e741efb9e085ec7d6d35eb", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru/infra/kubernetes/v1", "region": "kz"}, {"id": "9ce97fe294de45afa19c9f0a03fab90d", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:9511/v1", "region": "RegionOne"}], "id": "f0693567e98c4b95a488861b8e447533", "type": "container-infra", "name": "magnum"}, {"endpoints": [{"id": "00827960ee794000bf4b93a7370ab9e3", "interface": "admin", "region_id": "RegionOne", "url": "http://172.28.3.1:21107/v1", "region": "RegionOne"}, {"id": "7db1d051b2be499aae4da8cbe7fb0b96", "interface": "internal", "region_id": "RegionOne", "url": "http://172.28.3.1:21107/v1", "region": "RegionOne"}, {"id": "95c3d7faf64e47468ca5cf73c7241512", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru/bmaas/v1", "region": "RegionOne"}], "id": "f5c97fad1b714735b3df0d765b832f71", "type": "baremetal", "name": "bmaas"}, {"endpoints": [{"id": "50ae762988b94dccad89c9574d263f01", "interface": "public", "region_id": "RegionOne", "url": "https://mcs.mail.ru/auditlogs/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "cbf0da2499d54cc08cf6909982907a4d", "interface": "internal", "region_id": "RegionOne", "url": "https://mcs.mail.ru/auditlogs/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "e74844f6f29746199a68595add56fd5a", "interface": "admin", "region_id": "RegionOne", "url": "https://mcs.mail.ru/auditlogs/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "f6afe38d8f6f45e38777350172c2c48a", "type": "audit", "name": "audit"}, {"endpoints": [], "id": "f6f95beabaa44f18b17b69eb65671cef", "type": "metric", "name": "gnocchi"}, {"endpoints": [{"id": "1bab0f7216a24639867f740e8fcb4e7b", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/infra/keymanager", "region": "kz"}, {"id": "3aa9fa04ad374cb6a35f02b1c94d019c", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru/infra/keymanager", "region": "kz"}, {"id": "ac69da08e30f4bbfaba5f4b2acbcfdae", "interface": "admin", "region_id": "RegionOne", "url": "http://barbican.ep.compute.i", "region": "RegionOne"}, {"id": "d230e2a035244976a190dfee93077814", "interface": "internal", "region_id": "kz", "url": "http://barbican.ep.qaz.compute.i", "region": "kz"}, {"id": "d59d32518ef448039e1028473928bc21", "interface": "internal", "region_id": "RegionOne", "url": "http://barbican.ep.compute.i", "region": "RegionOne"}, {"id": "d642224dbe4c458aae2ce820260c5c62", "interface": "admin", "region_id": "kz", "url": "http://barbican.ep.qaz.compute.i", "region": "kz"}, {"id": "f4861db9ec60454db118720d702994d9", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/keymanager", "region": "RegionOne"}], "id": "fad1d54812a8404b88ac6f725e8b22a1", "type": "key-manager", "name": "barbican"}, {"endpoints": [{"id": "4cd2e237b33b42f4b00ad66531daef13", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:9876", "region": "kz"}, {"id": "77dc6a28caf74d649ebf392b3f9b5ff3", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.compute.i:9876", "region": "kz"}, {"id": "a1e98df2e57444aca4c36b1d614b73d6", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:9876", "region": "RegionOne"}, {"id": "b304c733ddc848819e39bef4cfc712a5", "interface": "public", "region_id": "RegionOne", "url": "https://public.infra.mail.ru:9876", "region": "RegionOne"}, {"id": "b393c92b9e2a4c45ad8da71a14e6e39e", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:9876", "region": "RegionOne"}, {"id": "e3096b8a779444069b896ab837492061", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:9876", "region": "kz"}], "id": "fffc7c3275fc48b1b0dbcc22d22208ef", "type": "load-balancer", "name": "octavia"}], "expires_at": "2026-06-14T13:25:05.000000Z", "issued_at": "2026-06-14T12:25:05.000000Z"}}% + + ~/rosatom +nix-shell ❯ TOKEN="gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo" + diff --git a/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log b/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log new file mode 100644 index 0000000..2e56976 --- /dev/null +++ b/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log @@ -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"}}% diff --git a/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log b/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log new file mode 100644 index 0000000..8014a8a --- /dev/null +++ b/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log @@ -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" + } +] diff --git a/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..e88de69 --- /dev/null +++ b/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf @@ -0,0 +1,4 @@ +resource "vkcs_compute_keypair" "my_key" { + name = "terraform-key-local" + public_key = file("~/.ssh/terraform_rsa.pub") +} diff --git a/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..4f700d9 --- /dev/null +++ b/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf @@ -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 diff --git a/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..7accc56 --- /dev/null +++ b/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf @@ -0,0 +1,36 @@ +data "vkcs_networking_network" "ext_net" { + name = "internet" +} + +data "vkcs_networking_router" "existing" { + id = "913bdd47-9155-45b2-b404-5c10d0086132" +} + +resource "vkcs_networking_network" "lab1_vpc" { + name = "lab1-vpc" + admin_state_up = true +} + +resource "vkcs_networking_subnet" "public" { + name = "lab1-public" + network_id = vkcs_networking_network.lab1_vpc.id + cidr = "10.0.1.0/24" + dns_nameservers = ["8.8.8.8", "8.8.4.4"] +} + +resource "vkcs_networking_subnet" "private" { + name = "lab1-private" + network_id = vkcs_networking_network.lab1_vpc.id + cidr = "10.0.2.0/24" + dns_nameservers = ["8.8.8.8", "8.8.4.4"] +} + +resource "vkcs_networking_router_interface" "public" { + router_id = data.vkcs_networking_router.existing.id + subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_networking_router_interface" "private" { + router_id = data.vkcs_networking_router.existing.id + subnet_id = vkcs_networking_subnet.private.id +} diff --git a/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..02e33f3 --- /dev/null +++ b/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf @@ -0,0 +1,5 @@ +output "lb_public_ip" { + value = vkcs_lb_loadbalancer.main.vip_address +} + +# bastion_ip и web_ips_private удали, так как ВМ больше не в Terraform diff --git a/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..5788a63 --- /dev/null +++ b/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf @@ -0,0 +1,12 @@ +# Указываем версию провайдера +terraform { + required_providers { + vkcs = { + source = "vk-cs/vkcs" + version = "~> 0.1" + } + } +} + +# Настройка провайдера (использует переменные окружения из RC-файла) +provider "vkcs" {} diff --git a/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..73de2a4 --- /dev/null +++ b/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf @@ -0,0 +1,46 @@ +resource "vkcs_networking_secgroup" "bastion_sg" { + name = "bastion-sg" + description = "SSH from my IP" +} +resource "vkcs_networking_secgroup_rule" "bastion_ssh" { + direction = "ingress" + protocol = "tcp" + port_range_min = 22 + port_range_max = 22 + remote_ip_prefix = var.my_ip + security_group_id = vkcs_networking_secgroup.bastion_sg.id +} + +resource "vkcs_networking_secgroup" "web_sg" { + name = "web-sg" + description = "SSH from bastion, HTTP from LB" +} +resource "vkcs_networking_secgroup_rule" "web_ssh" { + direction = "ingress" + protocol = "tcp" + port_range_min = 22 + port_range_max = 22 + remote_group_id = vkcs_networking_secgroup.bastion_sg.id + security_group_id = vkcs_networking_secgroup.web_sg.id +} +resource "vkcs_networking_secgroup_rule" "web_http" { + direction = "ingress" + protocol = "tcp" + port_range_min = 80 + port_range_max = 80 + remote_group_id = vkcs_networking_secgroup.lb_sg.id + security_group_id = vkcs_networking_secgroup.web_sg.id +} + +resource "vkcs_networking_secgroup" "lb_sg" { + name = "lb-sg" + description = "HTTP from internet" +} +resource "vkcs_networking_secgroup_rule" "lb_http" { + direction = "ingress" + protocol = "tcp" + port_range_min = 80 + port_range_max = 80 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = vkcs_networking_secgroup.lb_sg.id +} diff --git a/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars b/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars new file mode 100644 index 0000000..26b2f25 --- /dev/null +++ b/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars @@ -0,0 +1 @@ +my_ip = "95.37.52.68/32" diff --git a/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf b/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf new file mode 100644 index 0000000..13dd5e4 --- /dev/null +++ b/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf @@ -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" +} diff --git a/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf b/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf new file mode 100644 index 0000000..00efe93 --- /dev/null +++ b/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf @@ -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 +}