Sobes.tech
Middle

Jakie podejście stosuje Terraform podczas ponownego tworzenia zasobów?

sobes.tech AI

Odpowiedź od AI

Terraform używa podejścia "zniszcz i stwórz" (destroy and create).

W przypadku konieczności pełnej aktualizacji lub zmiany zasobu, którego nie można zaktualizować na miejscu (in-place update), Terraform wykonuje następujące kroki:

  1. Zniszczenie istniejącego zasobu: Terraform usuwa zasób z infrastruktury, wywołując odpowiednie API dostawcy.
  2. Utworzenie nowego zasobu: Po pomyślnym usunięciu, Terraform tworzy nową instancję zasobu z nowymi parametrami.

Dzieje się tak, gdy zmiany w konfiguracji Terraform wymagają pełnej wymiany zasobu. Na przykład zmiana typu podsieci w chmurze (z publicznej na prywatną), co nie jest obsługiwane przez aktualizację in-place dostawcy. Terraform sam określa konieczność takiego podejścia podczas wykonywania polecenia terraform plan. W planie wyraźnie wskaże, że zasób zostanie zniszczony i odtworzony.

// Przykład zasobu, który może zostać odtworzony przy zmianie określonych atrybutów
resource "aws_instance" "example" {
  ami           = "ami-0abcdef1234567890" # Zmiana AMI zwykle wymaga odtworzenia
  instance_type = "t2.micro"           # Zmiana typu instancji może również wymagać odtworzenia
  subnet_id     = "subnet-0123456789abcdef0" // Zmiana ID podsieci prawie zawsze wymaga odtworzenia

  tags = {
    Name = "ExampleInstance"
  }
}

Przykład wyjścia terraform plan, wskazującego na odtworzenie:

Plan: 1 do dodania, 0 do zmiany, 1 do zniszczenia.

Terraform wykona następujące działania:

  # aws_instance.example zostanie zniszczony
  - resource "aws_instance" "example" {
      - ami                    = "ami-old-id" -> null
      - arn                    = "arn:aws:ec2:..." -> null
      ... (pozostałe atrybuty)
    }

  # aws_instance.example zostanie utworzony
  + resource "aws_instance" "example" {
      + ami           = "ami-new-id"
      + instance_type = "t2.micro"
      + subnet_id     = "subnet-0123456789abcdef0"
      ... (pozostałe atrybuty)
    }