Запитано Активність 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, що це той самий ресурс?
Для цього є блоки 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 можна прибрати через кілька релізів, коли всі середовища вже застосували зміну.
prevent_destroy змусить Terraform впасти з помилкою, якщо план колись знову спробує її знищити, а deletion_protection захистить і від видалення в консолі AWS.