В Terraform замена ресурса обычно означает уничтожение существующего ресурса и создание нового. Однако существуют сценарии, в которых вам может потребоваться сохранить старый ресурс нетронутым при развертывании нового экземпляра. В этой статье блога мы рассмотрим несколько способов добиться этого в Terraform, а также приведем примеры кода.
Метод 1: Дублирование ресурса
Один подход заключается в дублировании существующего ресурса с новым именем и изменении необходимых атрибутов для создания нового экземпляра. Вот пример использования экземпляра AWS EC2:
resource "aws_instance" "existing_instance" {
ami = "ami-0c94855ba95c71c99"
instance_type = "t2.micro"
# ... other attributes
}
resource "aws_instance" "new_instance" {
ami = "ami-0c94855ba95c71c99"
instance_type = "t2.micro"
# ... modify other attributes as needed
}
Метод 2: клонирование ресурса
Другой подход заключается в клонировании существующего ресурса с использованием метааргумента cloneTerraform. При этом создается новый экземпляр с теми же атрибутами, что и исходный ресурс. Вот пример:
resource "aws_instance" "existing_instance" {
ami = "ami-0c94855ba95c71c99"
instance_type = "t2.micro"
# ... other attributes
}
resource "aws_instance" "new_instance" {
clone {
aws_instance.existing_instance
}
# ... modify other attributes as needed
}
Метод 3: Импорт состояния Terraform
Если у вас есть существующий ресурс, управляемый вне Terraform, вы можете импортировать его в состояние Terraform с помощью команды terraform import. После импорта вы можете создать новый экземпляр, не изменяя существующий ресурс. Вот пример:
terraform import aws_instance.existing_instance i-0123456789abcdef0
resource "aws_instance" "new_instance" {
ami = "ami-0c94855ba95c71c99"
instance_type = "t2.micro"
# ... other attributes
}
Метод 4: Модули Terraform
Вы можете инкапсулировать существующий ресурс и новый экземпляр как отдельные модули. Используя композицию модулей, вы можете управлять ими независимо, сохраняя при этом старый ресурс нетронутым. Вот пример структуры каталогов:
├── main.tf
├── old_instance
│ ├── main.tf
│ └── variables.tf
└── new_instance
├── main.tf
└── variables.tf