Sobes.tech
Middle

Ποια προσέγγιση χρησιμοποιεί το Terraform κατά την αναδημιουργία πόρων;

sobes.tech AI

Απάντηση από AI

Το Terraform χρησιμοποιεί μια προσέγγιση "καταστροφή και δημιουργία" (destroy and create).

Σε περίπτωση που απαιτείται πλήρης ενημέρωση ή αλλαγή σε μια πόρο που δεν μπορεί να ενημερωθεί στην θέση (in-place update), το Terraform εκτελεί τα ακόλουθα βήματα:

  1. Καταστροφή του υπάρχοντος πόρου: Το Terraform διαγράφει τον πόρο από την υποδομή καλώντας το αντίστοιχο API του παρόχου.
  2. Δημιουργία νέου πόρου: Μετά την επιτυχή διαγραφή, το Terraform δημιουργεί ένα νέο αντίγραφο του πόρου με τις νέες παραμέτρους.

Αυτό συμβαίνει όταν οι αλλαγές στη διαμόρφωση του Terraform απαιτούν πλήρη αντικατάσταση του πόρου. Για παράδειγμα, η αλλαγή του τύπου υποδικτύου στο cloud (από δημόσιο σε ιδιωτικό), που δεν υποστηρίζεται από την in-place ενημέρωση του παρόχου. Το 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"
      ... (άλλα χαρακτηριστικά)
    }