Sobes.tech
Middle

Какъв подход използва Terraform при повторното създаване на ресурси?

sobes.tech AI

Отговор от AI

Terraform използва подхода "унищожи и създай" (destroy and create).

В случай, че е необходима пълна актуализация или промяна на ресурс, който не може да бъде актуализиран на място (in-place update), Terraform изпълнява следните стъпки:

  1. Унищожаване на съществуващия ресурс: Terraform премахва ресурса от инфраструктурата чрез извикване на съответния API на доставчика.
  2. Създаване на нов ресурс: След успешно унищожаване, Terraform създава нов екземпляр на ресурса с новите параметри.

Това се случва, когато промените в конфигурацията на Terraform изискват пълна замяна на ресурса. Например, промяна на типа на подсистемата в облака (от публична към частна), което не се поддържа от актуализацията на място от доставчика. Terraform определя необходимостта от този подход при изпълнение на командата terraform plan. В изхода на плана ясно ще бъде посочено, че ресурсът ще бъде унищожен и създаден наново.

// Пример за ресурс, който може да бъде преустановен при промяна на определени атрибути
resource "aws_instance" "example" {
  ami           = "ami-0abcdef1234567890" # Промяната на AMI обикновено изисква преустановяване
  instance_type = "t2.micro"           # Промяната на типа на инстанцията също може да изисква преустановяване
  subnet_id     = "subnet-0123456789abcdef0" // Промяната на ID на подсистемата почти винаги изисква преустановяване

  tags = {
    Name = "ExampleInstance"
  }
}

Пример за изход от terraform plan, който показва преустановяване:

Plan: 1 за добавяне, 0 за промяна, 1 за унищожаване.

Terraform ще изпълни следните действия:

  # aws_instance.example ще бъде унищожен
  - resource "aws_instance" "example" {
      - ami                    = "ami-old-id" -> null
      - arn                    = "arn:aws:ec2:..." -> null
      ... (други атрибути)
    }

  # aws_instance.example ще бъде създаден
  + resource "aws_instance" "example" {
      + ami           = "ami-new-id"
      + instance_type = "t2.micro"
      + subnet_id     = "subnet-0123456789abcdef0"
      ... (други атрибути)
    }