Переименуйте ресурс Terraform без уничтожения/пересоздания — допишите блок moved
Вы переименовали ресурс с aws_instance.web на aws_instance.app в конфиге. Голый plan теперь хочет уничтожить web и создать app — ненужная замена живого сервера. Отрефакторьте так, чтобы Terraform счёл это переименованием, без уничтожения/пересоздания, через блок moved (без ручного terraform state mv).
Ограничения:
- Ресурсный блок уже переименован в
aws_instance.app. - Используйте блок
moved, чтобы переименование ревьюилось и повторялось в CI. - После
applyкомандаplanдолжна показывать отсутствие изменений.
resource "aws_instance" "app" {
ami = "ami-123"
instance_type = "t3.small"
}
# Добавьте блок, говорящий Terraform, что "app" — это переименованный "web".
Завершите рефакторинг.
Добавьте блок moved, сопоставляющий старый адрес aws_instance.web с новым aws_instance.app. На следующем plan Terraform перепишет адрес в state, поэтому ничего не уничтожается и не создаётся. Это декларативно и ревьюится, в отличие от разового terraform state mv.
- ✗Считать, что голое переименование сопоставляется по атрибутам, а не по адресу
- ✗Хвататься за
terraform state mvвместо ревьюируемого блокаmoved - ✗Думать, что
prevent_destroyвыполняет переименование
- →Когда разовый
terraform state mvвсё же уместнее блокаmoved? - →Чем блоки
movedпомогают при выносе ресурсов в модуль?
moved объявляет, что новый адрес — это переименованный старый. Terraform переписывает адрес в state на месте, а не считает их разными ресурсами.
resource "aws_instance" "app" {
ami = "ami-123"
instance_type = "t3.small"
}
moved {
from = aws_instance.web
to = aws_instance.app
}
После apply следующий plan показывает «No changes». Блок можно удалить, когда рефакторинг раскатан везде. В отличие от terraform state mv, это видно в code review и одинаково выполняется в CI.