Resolve the default security group UUID dynamically instead of hardcoding it
The "default" security group VK Cloud auto-creates in every project has a UUID unique to that project, but main.tf hardcoded one project's UUID across all 4 instance resources (router, priv_srv_01/02/03) - not portable to another project. Replaced with data.vkcs_networking_secgroup (matched by name = "default", verified against the real provider schema via terraform providers schema -json on the local provider mirror) behind local.default_security_group_id. The new default_security_group_id variable is a last-resort manual override via coalesce() for projects where the lookup doesn't fit (non-standard name/SDN) - not the normal path. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
This commit is contained in:
1 parent
1ef4b12143
commit
b5d6367fd8
7 files changed
+174
-6
No files matched your search
@@ -26,6 +26,8 @@ private_network_cidrs = [
|
||||
|
||||
`private_network_cidrs` — обязательная переменная без значения по умолчанию: один CIDR-префикс на каждую приватную сеть, к которой будут подключены интерфейсы роутеров (один префикс = одна общая сеть = один приватный интерфейс на роутер). Автоматической нарезки нет — префиксы не должны пересекаться и должны вмещать минимум `router_count + 2` адреса.
|
||||
|
||||
UUID системной Security Group `default` (уникален для каждого проекта VK Cloud) вычисляется автоматически через `data.vkcs_networking_secgroup`, вручную задавать не нужно. Переменная `default_security_group_id` — override только на крайний случай (нестандартное имя/SDN группы в проекте), не для обычного использования.
|
||||
|
||||
## 3. (Опционально) масштабирование
|
||||
|
||||
По умолчанию: 2 роутера × 3 интерфейса (1 публичный + 2 приватных, по числу префиксов в `private_network_cidrs`). Меняется без правки кода — либо через `terraform.tfvars`, либо через переменные окружения:
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# План внедрения: динамическое вычисление UUID Default Security Group
|
||||
|
||||
Дата: 2026-09-04
|
||||
|
||||
## Проблема
|
||||
|
||||
В `terraform/main.tf` в 4 местах (router, priv_srv_01/02/03) захардкожен литерал `"d479b4d7-55b3-4ff1-bf8d-24d826a38f11"` — UUID системной Security Group `default`, автоматически создаваемой в каждом проекте VK Cloud, но **уникальной по UUID для каждого проекта**. Код не переносим между проектами без ручной правки.
|
||||
|
||||
## Решение
|
||||
|
||||
Провайдер `vkcs` предоставляет data source `vkcs_networking_secgroup` (проверено локально через `terraform providers schema -json` на уже установленном provider-mirror v0.17.2) с фильтром по `name`/`sdn` и computed-атрибутом `id`. Автосозданная группа по умолчанию называется `default` (подтверждено пользователем для целевого проекта).
|
||||
|
||||
Явная передача UUID через переменную (в т.ч. `TF_VAR_default_security_group_id`) остаётся только как fallback на крайний случай — через `coalesce()`.
|
||||
|
||||
## Шаги
|
||||
|
||||
1. `terraform/main.tf`: добавить `data "vkcs_networking_secgroup" "default" { name = "default"; sdn = "sprut" }` и `locals.default_security_group_id = coalesce(var.default_security_group_id, data.vkcs_networking_secgroup.default.id)`; заменить 4 вхождения литерала на `local.default_security_group_id`.
|
||||
2. `terraform/variables.tf`: добавить `default_security_group_id` (string, default `null`, без validation — это осознанный override).
|
||||
3. `terraform/tests/test_terraform_delivery.py`: regression-guard на отсутствие старого UUID-литерала; проверка, что data source и локаль существуют и используются; расширить `variables.tf`-only plan-тест на новую переменную.
|
||||
4. `README.md`/`docs/QUICKSTART.md`: кратко описать механизм и его fallback-статус.
|
||||
5. Summary-документ по завершении.
|
||||
|
||||
## Верификация
|
||||
|
||||
- `terraform fmt -check -recursive`.
|
||||
- Реальные `terraform init`/`validate` через локальный provider-mirror.
|
||||
- `venv/bin/pytest terraform/tests -v`.
|
||||
- Реальный lookup (`plan`/`apply` с настоящими credentials) проверяется пользователем самостоятельно в VK Cloud — вне офлайн-песочницы.
|
||||
@@ -0,0 +1,34 @@
|
||||
# Summary: динамическое вычисление UUID Default Security Group
|
||||
|
||||
Дата: 2026-09-04
|
||||
План: [2026-09-04-dynamic-default-secgroup-plan.md](2026-09-04-dynamic-default-secgroup-plan.md)
|
||||
|
||||
## Что сделано
|
||||
|
||||
### `terraform/main.tf`
|
||||
Добавлен `data "vkcs_networking_secgroup" "default" { name = "default"; sdn = "sprut" }` и `locals.default_security_group_id = coalesce(var.default_security_group_id, data.vkcs_networking_secgroup.default.id)`. Все 4 вхождения захардкоженного литерала `"d479b4d7-55b3-4ff1-bf8d-24d826a38f11"` (в `security_group_ids` роутера и `priv_srv_01/02/03`) заменены на `local.default_security_group_id`.
|
||||
|
||||
Точное имя автосозданной группы (`default`, нижний регистр) подтверждено пользователем для целевого проекта. Data source и его атрибуты (`id` актуален, `secgroup_id` deprecated) проверены локально через `terraform providers schema -json` на уже установленном filesystem-mirror провайдера v0.17.2 — без обращения к реальному облаку.
|
||||
|
||||
### `terraform/variables.tf`
|
||||
Добавлена `default_security_group_id` (string, default `null`, без validation) — explicit override как крайняя мера; при `null` (значение по умолчанию) используется динамический lookup.
|
||||
|
||||
### `terraform/tests/test_terraform_delivery.py`
|
||||
Добавлены хелперы `find_local()` (main.tf теперь содержит два отдельных блока `locals {}`, поэтому старое обращение по индексу `main["locals"][0]` было неверным — исправлено) и `find_data_sources()`. Новые тесты:
|
||||
- `test_default_security_group_data_source_exists` — data source объявлен с `name = "default"`;
|
||||
- `test_default_security_group_id_local_prefers_override_then_lookup` — точная проверка выражения `coalesce(...)`;
|
||||
- `test_no_hardcoded_security_group_uuid_in_main` — regression-guard: в `main.tf` не должно быть ни одного литерала в форме UUID;
|
||||
- `test_all_instances_use_default_security_group_local` — все `vkcs_compute_instance` ссылаются на `local.default_security_group_id`, а не на литерал;
|
||||
- `test_default_security_group_id_override_accepted` — реальный `terraform plan` на изолированном `variables.tf` принимает и `null` (по умолчанию), и явный override.
|
||||
|
||||
Итог сьюта: **38 passed** (было 32).
|
||||
|
||||
### `README.md` / `docs/QUICKSTART.md`
|
||||
Добавлено краткое описание механизма и явная пометка override-переменной как "крайняя мера".
|
||||
|
||||
## Верификация
|
||||
|
||||
- `terraform fmt -check -recursive` → чисто.
|
||||
- Реальные `terraform init`/`validate` (локальный provider-mirror) — с override и без → оба успешны.
|
||||
- `venv/bin/pytest terraform/tests -v` → **38 passed**.
|
||||
- Реальный lookup данных (`vkcs_networking_secgroup.default` резолвится в существующую группу проекта) можно проверить только `terraform plan`/`apply` с настоящими credentials в самом VK Cloud — вне рамок этой офлайн-песочницы; это отдельный шаг для пользователя при первом реальном деплое.
|
||||
Reference in new issue
Block a user