Files
tf_provider/TEST_STAND/CRUD/postgres_user_db.tf
T
Repinoid e8c03d8ded test_stand/crud: keep_on_destroy=true для пользователя и базы PostgreSQL
Инстанс PG при destroy уходит в Suspend (suspend_on_destroy_default: true в
90_postgres.yaml), а не удаляется. Без keep_on_destroy подресурсы (create_user/
create_database) удалялись бы из живого кластера — после resume приложения
работали бы с пустой БД, данные базы были бы потеряны.

keep_on_destroy=true → режим state_only: при destroy подресурс остаётся в облаке
и только убирается из state. В паре с adopt_existing_on_create=true следующий
apply усыновляет существующий объект, а не падает на 'уже существует'.

Проверено: terraform validate — Success (провайдером 3.0.0, где атрибут есть).
2026-10-01 16:08:30 +03:00

47 lines
3.2 KiB
Terraform

# =============================================================================
# PostgreSQL — пользователи и базы данных
# =============================================================================
#
# ЗАЧЕМ ЗДЕСЬ keep_on_destroy = true (не удалять подресурс при destroy):
#
# У самого кластера PostgreSQL режим по умолчанию — suspend_on_destroy = true
# (generated/test/resources_yaml/90_postgres.yaml → lifecycle.suspend_on_destroy_default: true).
# То есть `terraform destroy` НЕ удаляет кластер в облаке, а переводит его в Suspend.
#
# Пользователь и база — это отдельные операции (create_user / create_database),
# и по умолчанию при destroy Terraform выполнил бы delete_user / delete_database.
# Получилось бы расхождение: кластер в облаке жив (Suspend), а пользователь и база
# из него удалены. После resume приложения работали бы с пустой БД, а следующий apply
# создавал бы всё заново (для базы это потеря данных).
#
# keep_on_destroy = true переводит подресурс в режим state_only: при destroy он
# НЕ удаляется и НЕ меняется в облаке, а только убирается из terraform state.
# Провайдер печатает предупреждение «Подресурс оставлен как есть, а не удалён».
#
# Пара к keep_on_destroy = true обязательна:
# adopt_existing_on_create = true — иначе следующий `terraform apply` попытается
# СОЗДАТЬ уже существующие в облаке пользователя/базу и получит ошибку «уже существует».
# С true провайдер усыновляет существующий объект обратно в state (авто-import).
#
# Как удалить по-настоящему: выставить keep_on_destroy = false и выполнить apply/destroy —
# пойдут обычные delete_user / delete_database.
# =============================================================================
resource "nubes_postgres_user" "crud_user_0" {
postgres_id = nubes_postgres.main_pg.id
username = local.pg_username
role = local.pg_role
adopt_existing_on_create = true
# destroy: пользователя из кластера не удалять (кластер уходит в Suspend, а не удаляется)
keep_on_destroy = true
}
resource "nubes_postgres_database" "pg_db" {
postgres_id = nubes_postgres.main_pg.id
db_name = local.pg_db_name
db_owner = nubes_postgres_user.crud_user_0.username
adopt_existing_on_create = true
# destroy: базу из кластера не удалять — иначе данные пропадут после resume
keep_on_destroy = true
}