From e8c03d8dedc41055ecd3130e9de4d3711f565d17 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 1 Oct 2026 16:08:30 +0300 Subject: [PATCH] =?UTF-8?q?test=5Fstand/crud:=20keep=5Fon=5Fdestroy=3Dtrue?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B8=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=20PostgreSQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Инстанс 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, где атрибут есть). --- TEST_STAND/CRUD/postgres_user_db.tf | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/TEST_STAND/CRUD/postgres_user_db.tf b/TEST_STAND/CRUD/postgres_user_db.tf index cb6c72b..a62687f 100644 --- a/TEST_STAND/CRUD/postgres_user_db.tf +++ b/TEST_STAND/CRUD/postgres_user_db.tf @@ -1,11 +1,39 @@ # ============================================================================= # 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" { @@ -13,4 +41,6 @@ resource "nubes_postgres_database" "pg_db" { 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 }