core code helper

Terraform хоче перестворити базу після перенесення ресурсу в модуль — як цього уникнути?

Поставити питання
Запитано Активність 22 перегляди Є найкраща відповідь
0

Рефакторю старий Terraform-код: виніс aws_db_instance.main і пов'язані ресурси (subnet group, parameter group) у модуль modules/rds. Тепер terraform plan показує:

  # aws_db_instance.main will be destroyed
  - resource "aws_db_instance" "main" { ... }

  # module.rds.aws_db_instance.this will be created
  + resource "aws_db_instance" "this" { ... }

Plan: 3 to add, 0 to change, 3 to destroy.

Це продакшен-база, перестворювати її не можна. Як пояснити Terraform, що це той самий ресурс?

Андрій Мельникзапитання · 14 жовтня 2026 р.

1 відповідь

0
Найкраща відповідь — на думку автора питання

Для цього є блоки moved — додайте їх поруч з викликом модуля:

moved {
  from = aws_db_instance.main
  to   = module.rds.aws_db_instance.this
}

moved {
  from = aws_db_subnet_group.main
  to   = module.rds.aws_db_subnet_group.this
}

moved {
  from = aws_db_parameter_group.main
  to   = module.rds.aws_db_parameter_group.this
}

Після цього plan має показати has moved to і 0 to destroy. Якщо залишились зміни (~), уважно подивіться, які саме аргументи відрізняються: це вже різниця між старим кодом і модулем, а не перенесення.

Переваги moved перед terraform state mv:

  • зміна проходить code review і видна в історії Git;
  • працює однаково для всіх, хто застосовує цей код (і в CI);
  • план показує переміщення до apply — нічого не робиться «наосліп».

Блоки moved можна прибрати через кілька релізів, коли всі середовища вже застосували зміну.

І на майбутнє для продакшен-бази:

resource "aws_db_instance" "this" {
  # ...
  deletion_protection = true

  lifecycle {
    prevent_destroy = true
  }
}

prevent_destroy змусить Terraform впасти з помилкою, якщо план колись знову спробує її знищити, а deletion_protection захистить і від видалення в консолі AWS.

Максим Ткаченковідповідь ·

Знаєте відповідь?

Увійдіть через Google — і зможете відповідати, голосувати й ставити власні питання. Це безкоштовно.

Увійти через Google