Files
CloudRouterAdvanced/docs/changes/2026-09-06-provider-auth-wiring-summary.md
T
ayurishchevandClaude Sonnet 5 8886c1baad Fix real-deployment blockers and scope down to router-only VMs
Confirmed working against a real VK Cloud PROD deployment (3 routers,
19 resources, apply succeeded end to end). Fixes found along the way:

- provider "vkcs" was never configured (versions.tf) - username/password/
  project_id/region were declared but wired to nothing; added auth_url and
  user_domain_name to complete it.
- Nova keypairs are per-user, not per-project - added an optional
  vkcs_compute_keypair resource (var.ssh_public_key) so Terraform can
  register a keypair under the deploying service account itself.
- router_priv_port used a hand-computed fixed_ip offset that collided with
  VKCS's own auto-created service ports on each network (observed: a
  "network:dns" port) - now left unset so Neutron's IPAM auto-assigns,
  which is collision-free by construction.
- vkcs_compute_instance set image_id at the top level while also booting
  from a volume via block_device - the provider docs say not to do this;
  Nova echoes back a sentinel string for image_id on a volume-booted
  server, which Terraform read as drift on a ForceNew attribute and
  wanted to destroy+recreate every already-created instance on every
  subsequent plan.
- private_network_cidrs bumped from /29 to /28 - too tight once the
  platform's own reserved ports are accounted for.

Also removed the priv_srv_01/02/03 demo instances and the LAN network/
security group only they used - this deployment provisions router VMs
only, confirmed with the user.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
2026-09-07 08:55:15 +03:00

5.0 KiB
Raw Blame History

Summary: подключение provider "vkcs" и безопасная передача PROD-credentials

Дата: 2026-09-06 План: 2026-09-06-provider-auth-wiring-plan.md

Что сделано

terraform/versions.tf

Добавлен блок:

provider "vkcs" {
  auth_url         = var.auth_url
  username         = var.username
  password         = var.password
  project_id       = var.project_id
  region           = var.region
  user_domain_name = var.user_domain_name
}

До этого username/password/project_id/region были orphaned-переменными — объявлены, но нигде не использовались.

terraform/variables.tf

  • Добавлены auth_url (default "https://infra.mail.ru:35357/v3/") и user_domain_name (default "users", для сервисных аккаунтов — "service-users").
  • Исправлен дефолт region: было "ME1" (код availability zone, спутан с регионом), стало "RegionOne" (реальный OpenStack-регион VK Cloud, подтверждено openrc.sh пользователя — OS_REGION_NAME=RegionOne). Раньше это не проявлялось, т.к. переменная не была подключена ни к чему.

.gitignore

Добавлены *.auto.tfvars, *.auto.tfvars.json, terraform.tfvars.local — реальные credentials передаются через автоматически подхватываемый Terraform overlay-файл, а не через правки закоммиченного terraform.tfvars.

terraform/prod.auto.tfvars.example (новый файл, без секретов)

Документирует паттерн и маппинг полей openrc.sh (OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_PROJECT_ID, OS_REGION_NAME, OS_USER_DOMAIN_NAME) → переменные Terraform.

terraform/tests/test_terraform_delivery.py

Добавлены тесты: test_provider_vkcs_wires_all_auth_variables (regression guard — provider-блок реально подключает все 6 auth-переменных), test_auth_variable_has_a_default (auth_url/user_domain_name/region — есть дефолт), test_gitignore_excludes_auto_tfvars_overlay, test_prod_auto_tfvars_example_is_not_gitignored, test_tfvars_template_has_no_auth_credentials (в закоммиченном terraform.tfvars не должно быть auth_url/user_domain_name). Итог: 48 passed (было 38).

README.md / docs/QUICKSTART.md

Добавлен раздел "Provider authentication" / обновлён шаг 2 Quick Start — описан paттерн *.auto.tfvars и маппинг полей openrc.sh.

Реальная проверка с PROD credentials

Пользователь передал openrc.sh сервисного аккаунта. Во временной директории вне репозитория (не в git, удалена сразу после проверки) собран overlay-файл с реальными значениями (auth_url, username, password, project_id, region=RegionOne, user_domain_name=service-users), поверх закоммиченного terraform.tfvars. Выполнены:

  • terraform init — успех, провайдер и бэкенд инициализированы.
  • terraform plan (read-only, ничего не создано) — успех: Plan: 24 to add, 0 to change, 0 to destroy. Подтверждена реальная аутентификация к https://infra.mail.ru:35357/v3/ и успешный резолвинг всех трёх data source'ов (vkcs_images_image.ubuntu24, vkcs_networking_network.extnet по name="internet", vkcs_networking_secgroup.default по name="default") — т.е. соответствующие объекты реально существуют в проекте с ожидаемыми именами.

Пароль и прочие секреты нигде не сохранялись в репозитории; временная директория удалена немедленно после проверки (подтверждено).

Верификация

  • terraform fmt -check -recursive → чисто.
  • Реальные terraform init/validate (локальный provider-mirror) → успех.
  • Реальный terraform plan с PROD credentials (вне репозитория) → успех, 24 ресурса к созданию, 0 ошибок.
  • venv/bin/pytest terraform/tests -v → 48 passed.

Следующий шаг

terraform apply для реального PROD-развёртывания (3 роутера) пользователем ещё не подтверждён — это отдельное, необратимое действие, требующее явного разрешения.