Достижение замены ресурсов в Terraform: методы развертывания новых экземпляров с сохранением существующих ресурсов

В 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