Инстанс 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, где атрибут есть).
47 lines
3.2 KiB
Terraform
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
|
|
}
|