Έργο 01 — Terraform τοπικά

Καθοδηγούμενη πρακτική44 λεπτά

pratique: true

Έργο 01 — Terraform τοπικά

Διάρκεια
60 έως 90 λεπτά (εκ των οποίων 30 λεπτά προετοιμασίας του σταθμού την πρώτη φορά)
Ενότητα
1/7
Θα κατασκευάσεις
ένα πρώτο πλήρες έργο Terraform στο μηχάνημά σου, ένα αρχείο message.txt που δημιουργείται, τροποποιείται και μετά καταστρέφεται από το Terraform, και έναν σταθμό έτοιμο για τα έργα cloud (Terraform, AWS CLI, λογαριασμός εργαστηρίου AWS)
Παραδοτέο
ο φάκελος projet-01-local με το main.tf του, την έξοδο του terraform state list πριν και μετά το destroy, και τρεις γραμμές δικές σου για τον ρόλο του terraform.tfstate
Κόστος
κανένα, ο provider local δεν καλεί κανένα API cloud

Πώς να διαβάσεις αυτή τη σελίδα. Κάθε ενότητα είναι διπλωμένη κάτω από τον τίτλο της: κάνε κλικ στο «Afficher …» για να την ανοίξεις, κλείσε την όταν τελειώσεις. Σειρά ανάγνωσης: Στόχος, μετά Εν συντομία (όλες οι εντολές, για αντιγραφή με τη σειρά), μετά Ο κώδικας (το αρχείο main.tf επεξηγημένο γραμμή προς γραμμή), μετά Terraform, στο τερματικό (T1 έως T13, μία εντολή τη φορά με την πραγματική της έξοδο). Το αναλυτικό βήμα προς βήμα, με την εγκατάσταση των εργαλείων, την προετοιμασία του λογαριασμού AWS και την αναμενόμενη έξοδο κάθε κίνησης, βρίσκεται στο παράρτημα: παράρτημα A για Windows (PowerShell), παράρτημα B για Linux, macOS, WSL 2 και Git Bash. Άνοιξε ένα μόνο παράρτημα, αυτό του δικού σου συστήματος. Το παράρτημα Γ, κοινό, συγκεντρώνει τις περιπτώσεις όπου κάτι κολλάει.

Στόχος

Μπαίνεις σε μια ομάδα που διαχειρίζεται όλη την υποδομή της με το Terraform. Πριν σε αφήσει να αγγίξεις τον λογαριασμό AWS, η προϊσταμένη σου σου ζητά ένα πράγμα: «Δείξε μου ότι κατέχεις τον πλήρη κύκλο στο μηχάνημά σου. Ένα αρχείο αρκεί. Θέλω να δω το plan πριν το apply, το state μετά, την τροποποίηση να εντοπίζεται, και έναν καθαρό φάκελο στο τέλος.» Αυτό ακριβώς είναι αυτό το έργο. Ο provider local γράφει ένα αρχείο κειμένου στον δίσκο σου αντί να δημιουργήσει έναν διακομιστή, αλλά οι εντολές, οι φράσεις που εμφανίζονται και τα αρχεία που παράγονται είναι τα ίδια όπως για ένα bucket S3 ή ένα αποθετήριο GitHub. Όλα όσα διαβάζεις εδώ, θα τα ξαναδιαβάσεις στα οκτώ επόμενα έργα.

Τα δέκα βήματα αυτού του διαγράμματος αναλύονται, με την αναμενόμενη έξοδο κάθε εντολής, στο παράρτημα A (Windows) ή στο παράρτημα B (Linux, macOS, WSL 2, Git Bash) στο τέλος της σελίδας. Οι ίδιες οι εντολές Terraform, ταυτόσημες σε όλα τα συστήματα, επεξηγούνται μία προς μία στο Terraform, στο τερματικό.

Εν συντομία: οι εντολές του έργου

Εμφάνιση των εντολών

Κιτ του μαθήματος: https://github.com/hrhouma2/aiopsatlas-terraform-labo-fr

Κλωνοποιείς το κιτ σε έναν φάκελο lab-terraform, ελέγχεις τα εργαλεία σου, δημιουργείς έναν άδειο φάκελο εργασίας, γράφεις μόνος σου το main.tf μέσα, και μετά ξεδιπλώνεις τον κύκλο: init, fmt, validate, plan, apply, επαλήθευση, state, τροποποίηση, destroy. Στο τέλος, το terraform state list δεν εμφανίζει πλέον τίποτα και το etat λέει Ressources encore gérées : 0 (0 attendu à la fin d'une séance). Το κιτ περιέχει το διορθωμένο στο projets/01-terraform-local/, για να το ανοίξεις μόνο αν κολλήσεις: ο στόχος είναι να γράψεις το αρχείο με το χέρι.

Windows (PowerShell)

powershell
git clone https://github.com/hrhouma2/aiopsatlas-terraform-labo-fr.git lab-terraform
cd lab-terraform
dir                                  # explorer : labo.ps1, labo.sh, README.md, projets\
.\labo.ps1 prerequis                 # attendu : Prérequis : 4 outils requis présents sur 4.
.\labo.ps1 nouveau projet-01-local   # crée travail\projet-01-local
cd travail\projet-01-local
code .                               # VS Code : créer main.tf, coller le code de la section « Le code »
terraform init                       # attendu : Terraform has been successfully initialized!
terraform fmt
terraform validate                   # attendu : Success! The configuration is valid.
terraform plan                       # attendu : Plan: 1 to add, 0 to change, 0 to destroy.
terraform apply                      # répondre yes ; attendu : Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Get-Content .\message.txt            # attendu : Bonjour, ce fichier a été créé avec Terraform.
Get-ChildItem -Force                 # .terraform, .terraform.lock.hcl, main.tf, message.txt, terraform.tfstate
terraform state list                 # attendu : local_file.message
terraform state show local_file.message
# modifier la ligne content dans main.tf (voir T10), puis :
terraform plan                       # attendu : Plan: 1 to add, 0 to change, 1 to destroy.
terraform apply                      # répondre yes ; attendu : Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Get-Content .\message.txt            # attendu : Deuxième version du fichier créée avec Terraform.
terraform destroy                    # répondre yes ; attendu : Destroy complete! Resources: 1 destroyed.
terraform state list                 # attendu : rien
cd ..\..
.\labo.ps1 etat                      # attendu : Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

Αν το PowerShell αρνείται το .\labo.ps1 (« l'exécution de scripts est désactivée sur ce système ») : Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, απάντησε O, ξανατρέξε.

Linux, macOS, WSL 2, Git Bash

bash
git clone https://github.com/hrhouma2/aiopsatlas-terraform-labo-fr.git lab-terraform
cd lab-terraform
ls                                   # explorer : labo.ps1, labo.sh, README.md, projets/
./labo.sh prerequis                  # attendu : Prérequis : 4 outils requis présents sur 4.
./labo.sh nouveau projet-01-local    # crée travail/projet-01-local
cd travail/projet-01-local
code .                               # VS Code : créer main.tf, coller le code de la section « Le code »
terraform init                       # attendu : Terraform has been successfully initialized!
terraform fmt
terraform validate                   # attendu : Success! The configuration is valid.
terraform plan                       # attendu : Plan: 1 to add, 0 to change, 0 to destroy.
terraform apply                      # répondre yes ; attendu : Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
cat message.txt                      # attendu : Bonjour, ce fichier a été créé avec Terraform.
ls -la                               # .terraform, .terraform.lock.hcl, main.tf, message.txt, terraform.tfstate
terraform state list                 # attendu : local_file.message
terraform state show local_file.message
# modifier la ligne content dans main.tf (voir T10), puis :
terraform plan                       # attendu : Plan: 1 to add, 0 to change, 1 to destroy.
terraform apply                      # répondre yes ; attendu : Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
cat message.txt                      # attendu : Deuxième version du fichier créée avec Terraform.
terraform destroy                    # répondre yes ; attendu : Destroy complete! Resources: 1 destroyed.
terraform state list                 # attendu : rien
cd ../..
./labo.sh etat                       # attendu : Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

Αν το ./labo.sh απαντά Permission denied : chmod +x labo.sh, μία μόνο φορά.

Ο κώδικας: αρχείο προς αρχείο

Εμφάνιση του αρχείου main.tf και της εξήγησής του γραμμή προς γραμμή

Το έργο χωράει σε ένα μόνο αρχείο, το main.tf, που δημιουργείς μέσα στο travail/projet-01-local/. Πληκτρολόγησέ το ή επικόλλησέ το ακριβώς έτσι (είναι λέξη προς λέξη το διορθωμένο του κιτ, projets/01-terraform-local/main.tf):

hcl
terraform {
  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "~> 2.5"
    }
  }
}

provider "local" {}

resource "local_file" "message" {
  filename = "${path.module}/message.txt"
  content  = "Bonjour, ce fichier a été créé avec Terraform."
}

Τρία μπλοκ, από το πιο γενικό στο πιο συγκεκριμένο.

ΓραμμήΤι λέει στο Terraform
terraform { … }Οι ρυθμίσεις του Terraform του ίδιου για αυτόν τον φάκελο.
required_providers { local = { … } }«Αυτό το έργο χρειάζεται ένα plugin που ονομάζεται local
source = "hashicorp/local"Από πού να το κατεβάσει: ο provider local που δημοσιεύει η HashiCorp στο Terraform Registry.
version = "~> 2.5"Ποια έκδοση να δεχτεί: 2.5 ή νεότερη, αλλά όχι 3.0. Στο μηχάνημα του μαθήματος, το init επέλεξε το v2.9.1.
provider "local" {}«Ενεργοποίησε αυτόν τον provider.» Τα άγκιστρα είναι άδεια επειδή ο provider local δεν έχει τίποτα να διαμορφώσει (καμία περιοχή, κανένας λογαριασμός).
resource "local_file" "message" { … }«Διαχειρίσου ένα αντικείμενο τύπου local_file, που ονομάζω message στον κώδικά μου.» Ο τύπος έρχεται από τον provider (local_ + file)· το όνομα είναι δικό σου. Μαζί σχηματίζουν τη διεύθυνση local_file.message.
filename = "${path.module}/message.txt"Πού να γράψει το αρχείο. Το path.module είναι ο φάκελος που περιέχει αυτό το main.tf· το Terraform θα το εμφανίσει ως ./message.txt.
content = "Bonjour, ce fichier a été créé avec Terraform."Το κείμενο που θα γραφτεί μέσα. Αυτή είναι η γραμμή που θα αλλάξεις στο βήμα T10.
Για να καταλάβεις καλύτερα: γιατί `${path.module}` και όχι απλά `message.txt`;

Το Terraform εκτελεί τις εντολές από τον τρέχοντα φάκελο. Αν γράψεις filename = "message.txt", το αρχείο δημιουργείται εκεί όπου πληκτρολογείς terraform apply, που είναι γενικά ο σωστός φάκελος, αλλά όχι πάντα (όταν ο κώδικας καλείται ως module από άλλον φάκελο, στην ενότητα 5). Το path.module δηλώνει πάντα τον φάκελο του αρχείου .tf, ανεξάρτητα από το σημείο από όπου εκτελείται το Terraform. Η σύνταξη ${…} εισάγει την τιμή μιας έκφρασης μέσα σε μια συμβολοσειρά: το "${path.module}/message.txt" γίνεται "./message.txt".

Για να καταλάβεις καλύτερα: κι αν αφαιρέσω το μπλοκ `terraform { required_providers … }`;

Λειτουργεί παρόλα αυτά: το Terraform συνάγει από τον τύπο local_file ότι χρειάζεται τον provider hashicorp/local, και το init εμφανίζει Finding latest version of hashicorp/local... αντί για Finding hashicorp/local versions matching "~> 2.5".... Αυτό κάνουν τα δύο εργαστήρια θεμελίωσης αυτής της ενότητας, για να πάνε στο πιο σύντομο. Όμως χωρίς περιορισμό έκδοσης, δύο συνάδελφοι που τρέχουν init με έξι μήνες διαφορά μπορούν να πάρουν δύο διαφορετικές εκδόσεις του provider. Σε ένα πραγματικό έργο, γράφουμε πάντα το μπλοκ.

Terraform, στο τερματικό

Εμφάνιση των 13 εντολών Terraform (T1 έως T13)

Οι εντολές αυτής της ενότητας πληκτρολογούνται μέσα στον φάκελο travail/projet-01-local, μόλις γραφτεί το main.tf. Είναι ταυτόσημες σε Windows, Linux και macOS: το Terraform είναι το ίδιο πρόγραμμα παντού. Οι έξοδοι είναι αυτές του μηχανήματος του μαθήματος (Terraform 1.12.2, Windows 11), καταγραμμένες όπως είναι· μόνο τα αναγνωριστικά (id=ff6b93dc…) και τα αποτυπώματα αλλάζουν από μηχάνημα σε μηχάνημα. Οι εντολές που εξαρτώνται από το σύστημα (ανάγνωση αρχείου, λίστα φακέλου) βρίσκονται στο παράρτημά σου.

Μια εικόνα να κρατήσεις για όλη την ενότητα: το μάθημα 01 σου παρουσίασε τον αρχιτέκτονα. Κάθε εντολή παρακάτω είναι μία από τις κινήσεις του. Το init ανοίγει το εργοτάξιο, το plan γράφει την προσφορά, το apply την εκτελεί, το state ξαναδιαβάζει την καταγραφή, το destroy αποσυναρμολογεί τα πάντα.

Ο κανόνας: μία μόνο καινοτομία ανά εντολή. Ξεκινάμε με την εντολή που δεν δέχεται καμία παράμετρο και δεν αγγίζει τίποτα.

T1. Ποια έκδοση Terraform;

text
terraform version
text
Terraform v1.12.2
on windows_amd64

Τι ζητά η εντολή: «Terraform, ποια έκδοση είσαι, και σε ποιο σύστημα;» Καμία παράμετρος, κανένα αρχείο διαβάζεται, τίποτα δεν τροποποιείται. Αν αυτή η εντολή αποτύχει (terraform : Le terme «terraform» n'est pas reconnu… ή command not found), τίποτα άλλο δεν θα δουλέψει: είναι η εγκατάσταση ή το PATH, δες το παράρτημα A.1 ή B.1. Στο μηχάνημα του μαθήματος, το Terraform προσθέτει μερικές φορές δύο γραμμές Your version of Terraform is out of date!: είναι πληροφορία, όχι σφάλμα.

Το γνωστό αντίστοιχο: aws --version, git --version, python --version. Ίδια κίνηση, ίδιος σκοπός.

T2. Άνοιγμα του εργοταξίου

text
terraform init
text
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/local versions matching "~> 2.5"...
- Installing hashicorp/local v2.9.1...
- Installed hashicorp/local v2.9.1 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

Τι ζητά η εντολή: «Διάβασε το main.tf μου, κατέβασε τους providers που απαιτεί, και προετοίμασε αυτόν τον φάκελο για δουλειά.»

Μία μόνο καινοτομία: ο φάκελος γίνεται ένα έργο Terraform. Διάβασε την έξοδο γραμμή προς γραμμή:

ΓραμμήΤι συνέβη
Initializing the backend...Το backend είναι το σημείο όπου θα αποθηκευτεί το state. Τίποτα δεν καθορίζεται στο main.tf, άρα θα είναι ένα τοπικό αρχείο, το terraform.tfstate.
Finding hashicorp/local versions matching "~> 2.5"...Το Terraform διάβασε τον περιορισμό έκδοσής σου και ψάχνει στο Registry.
Installing hashicorp/local v2.9.1...Επέλεξε την πιο πρόσφατη που τηρεί το ~> 2.5, και την κατεβάζει στο .terraform/.
(signed by HashiCorp)Το plugin είναι υπογεγραμμένο: έχεις πράγματι τον αυθεντικό provider.
Terraform has created a lock file .terraform.lock.hclΗ επιλεγμένη έκδοση σημειώνεται σε ένα αρχείο που πρέπει να κρατηθεί στο Git: το επόμενο init, σε έναν συνάδελφο, θα πάρει την ίδια.
Terraform has been successfully initialized!Η φράση που πρέπει να περιμένεις.

Δύο πράγματα εμφανίστηκαν στον φάκελό σου: ο κρυφός κατάλογος .terraform/ (ο κατεβασμένος provider, περίπου 18 MB στο μηχάνημα του μαθήματος, να μην μπει ποτέ στο Git) και το αρχείο .terraform.lock.hcl (22 γραμμές, να μπει στο Git). Θα τα δεις στο παράρτημα, βήμα A.6 ή B.6.

Το γνωστό αντίστοιχο: npm install ή pip install -r requirements.txt. Διαβάζεις μια λίστα εξαρτήσεων, κατεβάζεις, κλειδώνεις τις εκδόσεις (package-lock.json).

Για να καταλάβεις καλύτερα: τι συμβαίνει αν ξεχάσω το `init`;

Το Terraform αρνείται να συνεχίσει και σου λέει τι να κάνεις. Το terraform plan χωρίς init απαντά:

text
Error: Inconsistent dependency lock file

The following dependency selections recorded in the lock file are
inconsistent with the current configuration:
  - provider registry.terraform.io/hashicorp/local: required by this configuration but no version is selected

To make the initial dependency selections that will initialize the dependency
lock file, run:
  terraform init

και το terraform validate χωρίς init:

text
Error: Missing required provider

This configuration requires provider registry.terraform.io/hashicorp/local,
but that provider isn't available. You may be able to install it
automatically by running:
  terraform init

Στις δύο περιπτώσεις, η τελευταία γραμμή είναι η λύση. Το init ξανατρέχει χωρίς κίνδυνο όσες φορές θέλεις· δεν αγγίζει ποτέ τους πόρους σου.

T3. Καθαρισμός του κώδικα

text
terraform fmt
text

Τι ζητά η εντολή: «Ευθυγράμμισε ξανά τα κενά και την εσοχή των αρχείων μου .tf σύμφωνα με το επίσημο στιλ.»

Μία μόνο καινοτομία: η άδεια έξοδος. Το fmt εμφανίζει το όνομα κάθε αρχείου που τροποποίησε· αν επικόλλησες τον κώδικα όπως είναι, δεν έχει τίποτα να διορθώσει και δεν εμφανίζει τίποτα. Δεν είναι σφάλμα, είναι η καλύτερη δυνατή απάντηση. Αν είχες κάνει λάθος εσοχή σε μια γραμμή, θα εμφανιζόταν το main.tf και θα ξανάγραφε το αρχείο.

Το γνωστό αντίστοιχο: prettier --write, black, gofmt. Το κιτ ελέγχει αυτό το σημείο με το terraform fmt -check -recursive, που δεν τροποποιεί τίποτα και εξέρχεται με σφάλμα (κωδικός 3) αν κάποιο αρχείο δεν είναι στη σωστή μορφή.

T4. Έλεγχος της σύνταξης

text
terraform validate
text
Success! The configuration is valid.

Τι ζητά η εντολή: «Ξαναδιάβασε τα μπλοκ μου. Υπάρχουν τα ονόματα ορισμάτων, είναι κλειστά τα άγκιστρα, δείχνουν οι αναφορές σε κάτι;»

Μία μόνο καινοτομία: το Terraform συμβουλεύεται τον provider για να γνωρίζει τα έγκυρα ορίσματα ενός local_file. Γι' αυτό το validate απαιτεί init πριν. Δεν διαβάζει το state, δεν επικοινωνεί με κανένα API, δεν δημιουργεί τίποτα. Η φράση που πρέπει να περιμένεις: Success! The configuration is valid.

Τι πιάνει: contenu αντί για content (An argument named "contenu" is not expected here. Did you mean "content"?), ένα ξεχασμένο άγκιστρο (Error: Unclosed configuration block), ένα μη κλειστό εισαγωγικό (Error: Unterminated template string), έναν ανύπαρκτο τύπο (The provider hashicorp/local does not support resource type "local_fichier".). Το παράρτημα Γ τα παρουσιάζει ένα προς ένα.

Τι δεν πιάνει: μια διαδρομή που δεν υπάρχει, ένα όνομα bucket που έχει ήδη πιαστεί, μια κακή αρχιτεκτονική. Το validate λέει «είναι σωστό HCL», όχι «είναι καλή ιδέα».

T5. Γραφή της προσφοράς

text
terraform plan
text
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # local_file.message will be created
  + resource "local_file" "message" {
      + content              = "Bonjour, ce fichier a été créé avec Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./message.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

Τι ζητά η εντολή: «Σύγκρινε ό,τι περιγράφει ο κώδικάς μου με ό,τι ήδη γνωρίζεις, και πες μου τι θα έκανες, χωρίς να το κάνεις.»

Μία μόνο καινοτομία: η προσφορά. Τίποτα δεν δημιουργήθηκε· το message.txt δεν υπάρχει ακόμη. Διάβασέ το από πάνω προς τα κάτω:

ΓραμμήΠώς να τη διαβάσεις
+ createΗ λεζάντα: σε αυτό το plan, υπάρχουν μόνο δημιουργίες.
# local_file.message will be createdΗ διεύθυνση του πόρου (τύπος . όνομα) και η τύχη του.
+ resource "local_file" "message" {Ολόκληρο το μπλοκ έχει μπροστά ένα +: όλα είναι νέα.
+ content = "Bonjour, …"Μια ιδιότητα που έγραψες: το Terraform γνωρίζει την τιμή της.
+ content_md5 = (known after apply)Μια ιδιότητα που θα υπολογίσει ο provider μετά τη δημιουργία: το αποτύπωμα του περιεχομένου. Το Terraform δεν μπορεί να το μαντέψει πριν.
+ directory_permission = "0777"Μια ιδιότητα που δεν έγραψες: ο provider έχει μια προεπιλεγμένη τιμή.
+ filename = "./message.txt"Το δικό σου ${path.module}/message.txt, επιλυμένο.
Plan: 1 to add, 0 to change, 0 to destroy.Η γραμμή που διαβάζεται πρώτη, πάντα. Μία δημιουργία, καμία τροποποίηση, καμία καταστροφή.
Note: You didn't use the -out option…Πληροφορία: αυτή η προσφορά δεν αποθηκεύεται· το apply θα υπολογίσει ξανά μία. Χωρίς σημασία εδώ.

Το γνωστό αντίστοιχο: git diff πριν από git commit, ή η λειτουργία «προσομοίωσης» (--dry-run, -WhatIf) ενός script. Η διαφορά: ένα script --dry-run σου δείχνει τι θα κάνει· το terraform plan σου δείχνει τι λείπει ανάμεσα στον κώδικα και στην πραγματικότητα, αφού έχει ξαναδιαβάσει την πραγματικότητα.

Για να καταλάβεις καλύτερα: γιατί τόσες γραμμές για ένα αρχείο κειμένου;

Ο provider local εκθέτει, για ένα local_file, όλα όσα ξέρει να υπολογίζει: έξι αποτυπώματα του περιεχομένου (md5, sha1, sha256, sha512, και δύο εκδόσεις κωδικοποιημένες σε base64), τα δικαιώματα, το αναγνωριστικό. Έγραψες μόνο δύο (filename, content)· τα άλλα είναι ιδιότητες που συμπληρώνει ο provider. Το ίδιο συμβαίνει με ένα bucket S3: γράφεις τρεις γραμμές, το plan εμφανίζει τριάντα (ARN, περιοχή, αναγνωριστικό ιδιοκτήτη…). Μάθε να εντοπίζεις τις δικές σου και να διαβάζεις γρήγορα τις άλλες, εκτός από την τελευταία γραμμή Plan: που δεν διαβάζεται ποτέ βιαστικά.

T6. Εκτέλεση της προσφοράς

text
terraform apply
text
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # local_file.message will be created
  + resource "local_file" "message" {
      + content              = "Bonjour, ce fichier a été créé avec Terraform."

      + filename             = "./message.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

local_file.message: Creating...
local_file.message: Creation complete after 0s [id=ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Τι ζητά η εντολή: «Υπολόγισε ξανά την προσφορά, δείξε τη μου, και αν απαντήσω yes, κάν' το.»

Μία μόνο καινοτομία: η ερώτηση. Το Terraform σταματά στο Enter a value: και περιμένει. Πληκτρολόγησε yes ολόκληρο, μετά Enter. Το y, το Y, το oui ή μια κενή γραμμή δίνουν Apply cancelled. και τίποτα δεν αγγίζεται: είναι προστασία, όχι σφάλμα. Μετά τρεις γραμμές: Creating..., Creation complete after 0s [id=…] (το αναγνωριστικό που το plan ανακοίνωνε ως (known after apply) είναι πλέον γνωστό), και η φράση που πρέπει να περιμένεις: Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Οι τρεις αριθμοί είναι αυτοί του plan.

Τώρα, το message.txt υπάρχει στον φάκελό σου, και ένα νέο αρχείο εμφανίστηκε δίπλα: το terraform.tfstate. Πήγαινε να το επαληθεύσεις με το παράρτημά σου (A.6 ή B.6) πριν συνεχίσεις: το αρχείο περιέχει πράγματι Bonjour, ce fichier a été créé avec Terraform.

Το γνωστό αντίστοιχο: ένα script που γράφει το αρχείο, Set-Content ή echo > message.txt. Η διαφορά: το script γράφει και ξεχνά· το Terraform γράφει και σημειώνει στην καταγραφή του ότι έγραψε, με ποιο αναγνωριστικό, με ποιο περιεχόμενο.

T7. Ξαναδιάβασμα της καταγραφής: η λίστα

text
terraform state list
text
local_file.message

Τι ζητά η εντολή: «Απαρίθμησε όλα όσα διαχειρίζεσαι σε αυτόν τον φάκελο.»

Μία μόνο καινοτομία: το state διαβάζεται. Μία γραμμή, ένας πόρος: η διεύθυνση local_file.message, η ίδια όπως στο plan. Αυτή η γραμμή αποδεικνύει ότι το Terraform συνέδεσε το μπλοκ του κώδικά σου με το πραγματικό αρχείο: αυτό είναι που θα του επιτρέψει να το τροποποιήσει ή να το καταστρέψει αργότερα χωρίς να χρειαστεί να του ξαναπείς ποιο.

Πριν από το apply, η ίδια εντολή απαντούσε No state file was found!: η καταγραφή δεν υπήρχε ακόμη. Μετά το destroy (T12), δεν θα απαντήσει πλέον τίποτα.

Το γνωστό αντίστοιχο: docker ps, kubectl get pods, aws s3 ls. «Τι τρέχει, τι υπάρχει;» Με τη διαφορά ότι το state list δεν πηγαίνει να δει την πραγματικότητα: διαβάζει το τετράδιό του.

T8. Ξαναδιάβασμα της καταγραφής: η λεπτομέρεια

text
terraform state show local_file.message
text
# local_file.message:
resource "local_file" "message" {
    content              = "Bonjour, ce fichier a été créé avec Terraform."
    content_base64sha256 = "G+tDdGue1Lx5hU3LpqBWf3y3haa0ggckj6t/9bj5ocs="
    content_base64sha512 = "oB7gPsGHBDNnXe9Hzx4zQ3/nAF1kM9wlfDV/OdMjPybCPurPeN4P8myOoZxFg3dwvs+xLBRJxo4Q3H0qGS8l5g=="
    content_md5          = "6daf774f0eb6d3da439c871afec7cf90"
    content_sha1         = "ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45"
    content_sha256       = "1beb43746b9ed4bc79854dcba6a0567f7cb785a6b48207248fab7ff5b8f9a1cb"
    content_sha512       = "a01ee03ec1870433675def47cf1e33437fe7005d6433dc257c357f39d3233f26c23eeacf78de0ff26c8ea19c45837770becfb12c1449c68e10dc7d2a192f25e6"
    directory_permission = "0777"
    file_permission      = "0777"
    filename             = "./message.txt"
    id                   = "ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45"
}

Τι ζητά η εντολή: «Δείξε μου όλα όσα ξέρεις για τον πόρο local_file.message

Μία μόνο καινοτομία: η εντολή δέχεται μια παράμετρο, τη διεύθυνση που διαβάστηκε στο T7. Σύγκρινε με το plan του T5: όλες οι τιμές (known after apply) είναι τώρα συμπληρωμένες. Το id είναι το αποτύπωμα SHA-1 του περιεχομένου, η ίδια τιμή με το content_sha1 και με το [id=…] που εμφάνισε το apply. Είναι η καταγραφή του αρχιτέκτονα, κομμάτι προς κομμάτι.

Αν κάνεις λάθος στη διεύθυνση (local_file.mesage), το Terraform απαντά No instance found for the given address! και σε παραπέμπει στο terraform state list.

Για να καταλάβεις καλύτερα: τι περιέχει το `terraform.tfstate`, και γιατί δεν το επεξεργαζόμαστε ποτέ

Το αρχείο terraform.tfstate είναι JSON: ένας σειριακός αριθμός ("serial"), η έκδοση του Terraform, και μια λίστα "resources" όπου κάθε πόρος έχει ακριβώς τις ιδιότητες που σου εμφανίζει το state show. Μπορείς να το ανοίξεις για να το διαβάσεις. Δεν το τροποποιείς ποτέ με το χέρι: ένα κόμμα που μετακινήθηκε, και το Terraform δεν αναγνωρίζει πλέον τι έχει κατασκευάσει, ή πιστεύει ότι διαχειρίζεται κάτι που δεν υπάρχει πλέον. Για να ενεργήσεις στο state, υπάρχουν εντολές (terraform state rm, terraform state mv, terraform import) που θα δεις στην ενότητα 4.

Δύο ακόμη κανόνες, από σήμερα. Το state μπορεί να περιέχει μυστικά (εδώ, το κείμενο του αρχείου· αλλού, έναν κωδικό πρόσβασης βάσης δεδομένων): δεν μοιράζεται με μήνυμα ούτε γίνεται commit στο Git. Και είναι η μνήμη του Terraform: αν το διαγράψεις, το Terraform πιστεύει ότι τίποτα δεν υπάρχει και προτείνει να ξανακατασκευάσει τα πάντα, ενώ οι πόροι είναι ακόμα εκεί και, στο cloud, ακόμα χρεωμένοι.

T9. Ζητώντας τα outputs ενός έργου που δεν έχει

text
terraform output
text
Warning: No outputs found

The state file either has no outputs defined, or all the defined outputs are
empty. Please define an output in your configuration with the `output`
keyword and run `terraform refresh` for it to become available. If you are
using interpolation, please verify the interpolated value is not empty. You
can use the `terraform console` command to assist.

Τι ζητά η εντολή: «Εμφάνισε τις τιμές που ο κώδικας επέλεξε να εκθέσει με μπλοκ output

Μία μόνο καινοτομία: μια προειδοποίηση (Warning), όχι σφάλμα. Το main.tf σου δεν έχει κανένα μπλοκ output, άρα το Terraform δεν έχει τίποτα να εμφανίσει και σου το λέει. Θα γράψεις τα πρώτα σου outputs στο έργο 02· εδώ, η εντολή χρησιμεύει για να δεις τη διαφορά ανάμεσα σε «αποτυχία» (Error:) και «δεν υπάρχει τίποτα να δείξω» (Warning:).

T10. Τροποποίηση του κώδικα και ξαναδιάβασμα της προσφοράς

Άνοιξε το main.tf, αντικατέστησε τη γραμμή content με αυτή, αποθήκευσε:

hcl
  content  = "Deuxième version du fichier créée avec Terraform."

Μετά:

text
terraform plan
text
local_file.message: Refreshing state... [id=ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # local_file.message must be replaced
-/+ resource "local_file" "message" {
      ~ content              = "Bonjour, ce fichier a été créé avec Terraform." -> "Deuxième version du fichier créée avec Terraform." # forces replacement
      ~ content_base64sha256 = "G+tDdGue1Lx5hU3LpqBWf3y3haa0ggckj6t/9bj5ocs=" -> (known after apply)
      ~ content_base64sha512 = "oB7gPsGHBDNnXe9Hzx4zQ3/nAF1kM9wlfDV/OdMjPybCPurPeN4P8myOoZxFg3dwvs+xLBRJxo4Q3H0qGS8l5g==" -> (known after apply)
      ~ content_md5          = "6daf774f0eb6d3da439c871afec7cf90" -> (known after apply)
      ~ content_sha1         = "ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45" -> (known after apply)
      ~ content_sha256       = "1beb43746b9ed4bc79854dcba6a0567f7cb785a6b48207248fab7ff5b8f9a1cb" -> (known after apply)
      ~ content_sha512       = "a01ee03ec1870433675def47cf1e33437fe7005d6433dc257c357f39d3233f26c23eeacf78de0ff26c8ea19c45837770becfb12c1449c68e10dc7d2a192f25e6" -> (known after apply)
      ~ id                   = "ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45" -> (known after apply)
        # (3 unchanged attributes hidden)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Τι ζητά η εντολή: το ίδιο πράγμα όπως στο T5. Αλλά αυτή τη φορά το Terraform έχει μια καταγραφή για να συγκρίνει.

Μία μόνο καινοτομία: το σύμβολο -/+, «καταστροφή και μετά ανακατασκευή». Τρεις ενδείξεις σου το λένε, και πρέπει να ξέρεις να τις εντοπίζεις:

ΈνδειξηΠούΤι λέει
must be replacedο τίτλος # local_file.message must be replacedΔεν είναι will be updated in-place.
# forces replacementστο τέλος της γραμμής ~ content = "…" -> "…"Αυτή η ιδιότητα υποχρεώνει σε αντικατάσταση. Το ~ μπροστά λέει ότι η τιμή αλλάζει· το σχόλιο λέει ότι αυτή η αλλαγή δεν μπορεί να γίνει επί τόπου.
Plan: 1 to add, 0 to change, 1 to destroy.η τελευταία γραμμήΜία καταστροφή και μία δημιουργία, καμία τροποποίηση.

Δες επίσης την πρώτη γραμμή, νέα: Refreshing state... [id=…]. Πριν συγκρίνει, το Terraform πήγε να ξαναδιαβάσει το πραγματικό αρχείο για να επιβεβαιώσει ότι εξακολουθεί να ταιριάζει με την καταγραφή του. Εκεί θα εντόπιζε μια απόκλιση (μάθημα 01), αν είχες τροποποιήσει το message.txt με το χέρι.

Η ουσιαστική διαφορά ανάμεσα στο ~ και το -/+. Για ένα αρχείο κειμένου, το να αντικατασταθεί ή να τροποποιηθεί επί τόπου καταλήγει στο ίδιο: στο τέλος, το περιεχόμενο είναι το νέο. Για μια βάση δεδομένων, έναν δίσκο ή έναν χρήστη, το -/+ σημαίνει απώλεια του αντικειμένου και του αναγνωριστικού του: τα δεδομένα του δίσκου, ο κωδικός πρόσβασης του χρήστη, η διεύθυνση IP του διακομιστή. Ο provider αποφασίζει, ιδιότητα προς ιδιότητα, τι υποχρεώνει σε αντικατάσταση· εσύ το διαβάζεις στο plan πριν πεις yes. Ο provider local αντικαθιστά το αρχείο μόλις αλλάξει το content: ποτέ απλό ~ για αυτή την ιδιότητα.

T11. Εφαρμογή της αντικατάστασης

text
terraform apply
text

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

local_file.message: Destroying... [id=ff6b93dc92e7e1d2ba4f9dad3cc16e03ac649b45]
local_file.message: Destruction complete after 0s
local_file.message: Creating...
local_file.message: Creation complete after 0s [id=1df9196ac94445f0943c35b75c8c2e1bdf3e0cd6]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

Τι ζητά η εντολή: το ίδιο πράγμα όπως στο T6.

Τίποτα νέο στην εντολή· όλα βρίσκονται στην έξοδο. Τέσσερις γραμμές ενέργειας αντί για δύο: Destroying..., Destruction complete, μετά Creating..., Creation complete. Η σειρά είναι αυτή του συμβόλου -/+: πρώτα το λιγότερο, μετά το περισσότερο. Και το αναγνωριστικό άλλαξε (ff6b93dc… πριν, 1df9196a… μετά): είναι ένα άλλο αντικείμενο, όχι το ίδιο τροποποιημένο. Επαλήθευσε το νέο περιεχόμενο με το παράρτημά σου (A.8 ή B.8): Deuxième version du fichier créée avec Terraform.

Σύνοψη T5 έως T11: είδες τις δύο προσφορές που θα ξαναδιαβάζεις όλη σου την καριέρα: + (δημιουργία) και -/+ (αντικατάσταση). Η τρίτη, ~ (τροποποίηση επί τόπου), δεν υπάρχει για το content ενός local_file· θα τη συναντήσεις στα έργα cloud, για παράδειγμα όταν μια ετικέτα (tag) αλλάζει σε έναν πόρο AWS.

T12. Αποσυναρμολόγηση όλων

text
terraform destroy
text
local_file.message: Refreshing state... [id=1df9196ac94445f0943c35b75c8c2e1bdf3e0cd6]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # local_file.message will be destroyed
  - resource "local_file" "message" {
      - content              = "Deuxième version du fichier créée avec Terraform." -> null
      - content_base64sha256 = "36Hz+L76pjLbvY4LIzPfw+UsqNneFneSfFGjtfRLxkI=" -> null

      - filename             = "./message.txt" -> null
      - id                   = "1df9196ac94445f0943c35b75c8c2e1bdf3e0cd6" -> null
    }

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

local_file.message: Destroying... [id=1df9196ac94445f0943c35b75c8c2e1bdf3e0cd6]
local_file.message: Destruction complete after 0s

Destroy complete! Resources: 1 destroyed.

Τι ζητά η εντολή: «Καταστρέψε όλα όσα διαχειρίζεσαι σε αυτόν τον φάκελο, και δείξε μου πρώτα την προσφορά.»

Μία μόνο καινοτομία: το σύμβολο - μόνο, και μια πιο σοβαρή ερώτηση: Do you really want to destroy all resources? … There is no undo. Κάθε ιδιότητα περνά σε -> null: δεν θα υπάρχει πλέον τίποτα. Η φράση που πρέπει να περιμένεις: Destroy complete! Resources: 1 destroyed. Το αρχείο message.txt εξαφανίστηκε από τον φάκελό σου.

Αυτή είναι η εντολή που κλείνει κάθε συνεδρία αυτού του μαθήματος. Εδώ διαγράφει ένα αρχείο κειμένου· στο έργο 03 θα διαγράψει ένα bucket που, διαφορετικά, θα παρέμενε χρεωμένο.

T13. Επαλήθευση ότι η καταγραφή είναι άδεια

text
terraform state list
text

Τι ζητά η εντολή: το ίδιο όπως στο T7.

Τίποτα νέο, και μια άδεια έξοδος: το Terraform δεν διαχειρίζεται πλέον τίποτα σε αυτόν τον φάκελο. Το αρχείο terraform.tfstate υπάρχει ακόμα, αλλά η λίστα του "resources" είναι [], και ένα terraform.tfstate.backup εμφανίστηκε δίπλα (η έκδοση πριν το destroy, που το Terraform κρατά από προσοχή). Το παράρτημά σου (A.9 και A.10, ή B.9 και B.10) σε κάνει να απαριθμήσεις τον φάκελο και να τρέξεις το etat για την τελική απόδειξη: Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

Σύνοψη T1 έως T13: init μία φορά, μετά fmt, validate, plan, apply, state list, state show, ένα plan και ένα apply τροποποίησης, destroy, state list. Δεκατρείς εντολές, πέντε φράσεις για να αναγνωρίζεις: successfully initialized!, The configuration is valid., Plan: N to add, N to change, N to destroy., Apply complete!, Destroy complete!.

Το μήνυμα που πρέπει να μεταφέρεις. Ένα script PowerShell ή bash θα είχε γράψει το message.txt σε μία γραμμή, και θα το είχε διαγράψει σε μία άλλη. Αυτό που το script δεν κάνει και που είδες το Terraform να κάνει: να ανακοινώνει πριν ενεργήσει (plan), να ζητά ρητή συμφωνία (yes), να σημειώνει τι δημιούργησε (state list), να ξαναδιαβάζει την πραγματικότητα πριν από κάθε απόφαση (Refreshing state...), να ξεχωρίζει την τροποποίηση από την αντικατάσταση (-/+), και να ξέρει να αναιρεί τα πάντα χωρίς να του ξαναπείς τι (destroy).

Η κονσόλα AWS, στον περιηγητή: προετοιμασία του λογαριασμού για τα επόμενα έργα

Εμφάνιση της προετοιμασίας του λογαριασμού AWS (ομάδα, χρήστης IAM, Access Key)

Το έργο 01 δεν αγγίζει το AWS. Όμως το έργο 03 δημιουργεί ένα πραγματικό bucket S3, και θα χρειαστείς έναν έτοιμο λογαριασμό. Αυτή η ενότητα γίνεται στον περιηγητή, είναι ταυτόσημη σε Windows, Linux και macOS, και μπορείς να την κάνεις πριν ή μετά τον κύκλο Terraform αυτού του έργου. Οι εντολές aws configure και aws sts get-caller-identity που τη συνοδεύουν βρίσκονται στο παράρτημά σου (A.2 ή B.2).

Αν εργάζεσαι σε AWS Academy, AWS Educate, ένα sandbox που παρέχει το σχολείο ή έναν προσωρινό λογαριασμό εργαστηρίου: χρησιμοποίησε τα διαπιστευτήρια που παρέχει η πλατφόρμα και προχώρα κατευθείαν στο βήμα A.2 ή B.2 (περίπτωση «Academy»). Μην δημιουργήσεις χρήστη IAM αν ο εκπαιδευτικός σου σου δίνει ήδη προσωρινή πρόσβαση.

Άνοιγμα της κονσόλας AWS

  1. Άνοιξε τον περιηγητή και πήγαινε στο https://aws.amazon.com/.
  2. Κάνε κλικ στο Sign in to the Console.
  3. Σύνδεσου με τον λογαριασμό AWS του εργαστηρίου.
  4. Έλεγξε την περιοχή πάνω δεξιά. Για τον Καναδά, επίλεξε ca-central-1 αν το εργαστήριο δεν επιβάλλει άλλη.

Να μη δουλεύεις με τον λογαριασμό root

Ο λογαριασμός root χρησιμεύει μόνο για τη δημιουργία του λογαριασμού, τη διαχείριση της χρέωσης και τις ευαίσθητες λειτουργίες. Ενεργοποίησε το MFA (πιστοποίηση δύο παραγόντων) στον λογαριασμό root, και μετά δημιούργησε έναν ξεχωριστό χρήστη για την εργασία εργαστηρίου, παρακάτω.

Δημιουργία μιας ομάδας διαχειριστών για το εργαστήριο

  1. Στη γραμμή αναζήτησης του AWS, πληκτρολόγησε IAM και άνοιξε την υπηρεσία IAM.
  2. Αριστερό μενού: User groupsCreate group.
  3. Όνομα της ομάδας: terraform-admins.
  4. Στην αναζήτηση των δικαιωμάτων, πληκτρολόγησε AdministratorAccess, τσέκαρε την πολιτική AdministratorAccess.
  5. Create group.

Μόνο για εργαστήριο. Το AdministratorAccess δίνει πλήρη πρόσβαση σε όλες τις υπηρεσίες και τους πόρους του λογαριασμού. Είναι πρακτικό για εκμάθηση· δεν είναι μοντέλο ασφάλειας για παραγωγή, όπου δίνουμε στο Terraform μόνο τα δικαιώματα που χρειάζεται (ενότητα 4).

Δημιουργία ενός χρήστη IAM για το εργαστήριο

  1. Στο IAM: UsersCreate user.
  2. Όνομα: terraform-admin.
  3. Αν θέλεις να συνδέεσαι επίσης στην κονσόλα με αυτόν τον χρήστη, τσέκαρε Provide user access to the AWS Management Console και επίλεξε προσωρινό ή αυτόματο κωδικό πρόσβασης. Τσέκαρε User must create a new password at next sign-in αν δίνεις τον λογαριασμό σε κάποιον άλλο.
  4. NextAdd user to group → τσέκαρε terraform-adminsNextCreate user.

Δημιουργία ενός Access Key για το AWS CLI

  1. Στο IAM: Users → κλικ στο terraform-admin.
  2. Καρτέλα Security credentials, ενότητα Access keysCreate access key.
  3. Επίλεξε Command Line Interface (CLI), τσέκαρε την επιβεβαίωση αν το AWS εμφανίζει μια σύσταση, Next.
  4. Description tag value: aws-cli-terraform-labCreate access key.
  5. Κατέβασε το αρχείο .csv ή αντιγράψε το Access key και το Secret access key σε έναν διαχειριστή κωδικών πρόσβασης. Το Secret access key δεν θα εμφανιστεί ποτέ ξανά.

Ό,τι δεν κάνεις ποτέ. Ποτέ μην επικολλήσεις ένα Access Key, ένα Secret Access Key, ένα session token, ένα αρχείο .env ή ένα terraform.tfstate στο GitHub, στο Word, στο Teams, στο Discord, στο Slack, σε ένα ticket ή σε ένα email. Αυτά τα στοιχεία δίνουν πρόσβαση στον λογαριασμό. Αν διαρρεύσει ένα κλειδί: IAM → ο χρήστης → Security credentialsDeactivate και μετά Delete, και δημιουργείς ένα άλλο.

Επιπλέον πρόκληση (προαιρετικό)

Πριν ξανατρέξεις το terraform destroy δεύτερη φορά σε έναν φάκελο που έχει ήδη καταστραφεί, γράψε σε χαρτί τι θα λέει η τελευταία γραμμή του plan. Μετά τρέξε το. Στη συνέχεια, ξανακατασκεύασε το αρχείο με terraform apply, άνοιξε το message.txt στο VS Code, πρόσθεσε μια λέξη με το χέρι, αποθήκευσε, και πληκτρολόγησε terraform plan: τι λέει η γραμμή Refreshing state..., ποιο σύμβολο εμφανίζεται, και πώς λέγεται αυτή η απόκλιση στο μάθημα 01; Τελείωσε με destroy: ο φάκελος πρέπει να επιστρέψει στο Ressources encore gérées : 0.

Παράρτημα A — Αναλυτικό βήμα προς βήμα σε Windows (PowerShell)

Εμφάνιση του βήματος προς βήμα Windows (A.0 έως A.10)

Όλες οι εντολές αυτού του παραρτήματος πληκτρολογούνται στο PowerShell (Windows Terminal ή PowerShell 7), με .\labo.ps1 …. Οι αναπαραγόμενες έξοδοι είναι αυτές του μηχανήματος του μαθήματος, σε Windows 11 και Terraform 1.12.2.

A.0 — Πριν ξεκινήσεις

  • Να έχεις διαβάσει τα μαθήματα 01 και 02 της ενότητας.
  • Το Git εγκατεστημένο (το git --version απαντά), το VS Code εγκατεστημένο με την εντολή code διαθέσιμη στο PowerShell (αλλιώς: VS Code → Ctrl+Shift+P → « Shell Command: Install 'code' command in PATH », ή επανεγκατάσταση τσεκάροντας « Add to PATH »).
  • Αν το PowerShell αρνείται να εκτελέσει το .\labo.ps1 (« l'exécution de scripts est désactivée sur ce système ») : Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, απάντησε O, ξανατρέξε. Μία μόνο φορά ανά μηχάνημα.
  • Στο τέλος, το .\labo.ps1 etat πρέπει να εμφανίζει Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

A.1 — Εγκατάσταση του Terraform

Το πιο απλό, με τον διαχειριστή πακέτων των Windows:

powershell
winget install Hashicorp.Terraform

Κλείσε το PowerShell, ξανάνοιξέ το, μετά:

powershell
terraform version

Σημείο ελέγχου:

text
Terraform v1.12.2
on windows_amd64

Η έκδοσή σου μπορεί να είναι πιο πρόσφατη· όλα όσα είναι 1.6 ή νεότερα ταιριάζουν. Αν το Terraform προσθέτει Your version of Terraform is out of date!, είναι πληροφορία, όχι σφάλμα.

Χωρίς winget, με το επίσημο εκτελέσιμο: πήγαινε στο https://developer.hashicorp.com/terraform/install, επίλεξε Windows, κατέβασε την έκδοση AMD64, αποσυμπίεσε το .zip, δημιούργησε τον φάκελο C:\terraform, μετακίνησε το terraform.exe μέσα, μετά πρόσθεσε το C:\terraform στο PATH: μενού Έναρξη → «variables d'environnement» → Modifier les variables d'environnement systèmeVariables d'environnement → στο Variables système, επίλεξε PathModifierNouveauC:\terraformOK. Κλείσε όλα τα παράθυρα PowerShell, ξανάνοιξε, ξαναπληκτρολόγησε terraform version.

Αν βλέπεις κάτι άλλο: terraform : Le terme «terraform» n'est pas reconnu comme nom d'applet de commande… → το Terraform δεν είναι στο PATH, ή το PowerShell δεν επανεκκινήθηκε μετά την εγκατάσταση. Παράρτημα Γ.

A.2 — Εγκατάσταση και διαμόρφωση του AWS CLI έκδοση 2 (για τα επόμενα έργα)

Το έργο 01 δεν χρησιμοποιεί το AWS· αυτό το βήμα προετοιμάζει το έργο 03. Μπορείς να το κάνεις τώρα ή να το αφήσεις για αργότερα.

  1. Πήγαινε στο https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html, κατέβασε το MSI Windows 64-bit του AWS CLI έκδοση 2.
  2. Εκτέλεσε το .msi: Next, δέξου την άδεια χρήσης, κράτησε τον προεπιλεγμένο φάκελο, Install.
  3. Κλείσε και ξανάνοιξε το PowerShell.
powershell
aws --version

Σημείο ελέγχου: μια έκδοση που ξεκινά με aws-cli/2 (στο μηχάνημα του μαθήματος: aws-cli/2.22.18). Αν βλέπεις aws-cli/1, είναι η παλιά έκδοση: απεγκατάστησέ την.

Μετά διαμόρφωσε τα κλειδιά που δημιουργήθηκαν στην ενότητα Η κονσόλα AWS, στον περιηγητή:

powershell
aws configure
text
AWS Access Key ID [None]: TON_ACCESS_KEY_ID
AWS Secret Access Key [None]: TA_SECRET_ACCESS_KEY
Default region name [None]: ca-central-1
Default output format [None]: json

Επαλήθευσε ότι το CLI μιλά πράγματι με το AWS:

powershell
aws sts get-caller-identity

Παράδειγμα απάντησης (οι τιμές είναι αυτές του λογαριασμού σου):

json
{
    "UserId": "AIDA...",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/terraform-admin"
}

Περίπτωση AWS Academy ή προσωρινό sandbox: άνοιξε το εργαστήριο, κάνε κλικ στο AWS Details ή Credentials, αντιγράψε Access Key, Secret Key και Session Token (υποχρεωτικό με προσωρινή πρόσβαση), μετά:

powershell
aws configure set aws_access_key_id TON_ACCESS_KEY_ID
aws configure set aws_secret_access_key TA_SECRET_ACCESS_KEY
aws configure set aws_session_token TON_SESSION_TOKEN
aws configure set region ca-central-1
aws configure set output json
aws sts get-caller-identity

A.3 — Κλωνοποίηση του κιτ και έλεγχος των προαπαιτούμενων

Τοποθετήσου στον φάκελο όπου κρατάς τα έργα σου (για παράδειγμα C:\Users\<toi>\Documents), μετά:

powershell
git clone https://github.com/hrhouma2/aiopsatlas-terraform-labo-fr.git lab-terraform
cd lab-terraform
dir

Σημείο ελέγχου: το dir απαριθμεί projets, labo.ps1, labo.sh, README.md (και .gitattributes, .gitignore με dir -Force). Μετά:

powershell
.\labo.ps1 prerequis
text
OK      terraform 1.12.2
OK      aws 2.22.18
OK      git 2.49.0.windows.1
OK      code 1.135.0
OK      gh 2.81.0 (optionnel)
ABSENT  az (optionnel, projet 08B seulement)
OK      gcloud 544.0.0 (optionnel)
Prérequis : 4 outils requis présents sur 4.

Τα τέσσερα απαιτούμενα εργαλεία είναι terraform, aws, git και code. Τα gh, az και gcloud είναι προαιρετικά και μπορούν να είναι ABSENT χωρίς συνέπεια πριν την ενότητα 3. Αν το aws είναι ABSENT επειδή άφησες το A.2 για αργότερα, η τελευταία γραμμή λέει 3 outils requis présents sur 4: μπορείς παρόλα αυτά να συνεχίσεις αυτό το έργο.

A.4 — Δημιουργία του φακέλου εργασίας και άνοιγμά του στο VS Code

powershell
.\labo.ps1 nouveau projet-01-local
text
Dossier travail\projet-01-local créé (ignoré par Git). Tapez :
  cd travail\projet-01-local

Κάνε ό,τι σου λέει το script, μετά άνοιξε τον φάκελο στο VS Code:

powershell
cd travail\projet-01-local
code .

Ο φάκελος travail\ αγνοείται από το Git: μπορείς να γράφεις ελεύθερα μέσα χωρίς να λεκιάσεις το κιτ. Το διορθωμένο παραμένει στο projets\01-terraform-local\.

Αν το code . δεν κάνει τίποτα: άνοιξε το VS Code με το χέρι, FileOpen Folder, και επίλεξε lab-terraform\travail\projet-01-local.

A.5 — Δημιουργία του main.tf

Στο VS Code: εικονίδιο New File στον εξερευνητή αριστερά, ονόμασε το αρχείο main.tf (προσοχή: όχι main.tf.txt, το VS Code δεν προσθέτει επέκταση αλλά το Σημειωματάριο των Windows θα το έκανε), επικόλλησε τον κώδικα της ενότητας Ο κώδικας: αρχείο προς αρχείο, αποθήκευσε με Ctrl+S.

Επαλήθευσε από το PowerShell:

powershell
Get-Content .\main.tf

Σημείο ελέγχου: οι δεκαπέντε γραμμές του αρχείου, από terraform { έως }. Μετά:

powershell
Get-ChildItem

Μία μόνο καταχώρηση: main.tf. Αν βλέπεις main.tf.txt, μετονόμασε: Rename-Item main.tf.txt main.tf.

A.6 — Αρχικοποίηση, μορφοποίηση, επικύρωση, σχεδιασμός, εφαρμογή

Ξεδίπλωσε τα T2 έως T6 της ενότητας Terraform, στο τερματικό:

powershell
terraform init
terraform fmt
terraform validate
terraform plan
terraform apply

Απάντησε yes στην ερώτηση του apply. Σημεία ελέγχου, με τη σειρά: Terraform has been successfully initialized!, τίποτα για το fmt, Success! The configuration is valid., Plan: 1 to add, 0 to change, 0 to destroy., Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Επαλήθευσε τι εμφανίστηκε στον φάκελο:

powershell
Get-ChildItem -Force
text
.terraform
.terraform.lock.hcl
main.tf
message.txt
terraform.tfstate

(Το -Force εμφανίζει επίσης τις κρυφές καταχωρήσεις, αυτές που το όνομά τους ξεκινά με τελεία· χωρίς αυτό, θα έβλεπες μόνο τα main.tf, message.txt και terraform.tfstate.) Πέντε καταχωρήσεις:

ΚαταχώρησηΠοιος τη δημιούργησεΤι είναι
.terraforminitΚρυφός φάκελος, ο κατεβασμένος provider. Ποτέ στο Git.
.terraform.lock.hclinitΟι επιλεγμένες εκδόσεις των providers. Στο Git.
main.tfεσύΟ κώδικας.
message.txtapplyΟ πόρος.
terraform.tfstateapplyΤο state, η καταγραφή. Ποτέ στο Git, ποτέ κοινοποιημένο.

Διάβασε το δημιουργημένο αρχείο:

powershell
Get-Content .\message.txt
text
Bonjour, ce fichier a été créé avec Terraform.

Μπορείς επίσης να το επαληθεύσεις στην Εξερεύνηση Windows: άνοιξε τον φάκελο lab-terraform\travail\projet-01-local, διπλό κλικ στο message.txt.

A.7 — Ανάγνωση του state

Ξεδίπλωσε τα T7, T8 και T9:

powershell
terraform state list
terraform state show local_file.message
terraform output

Σημεία ελέγχου: local_file.message· το πλήρες μπλοκ με filename = "./message.txt" και ένα id σαράντα χαρακτήρων· Warning: No outputs found.

Αν είσαι περίεργος, δες το ίδιο το state, χωρίς να το τροποποιήσεις:

powershell
Get-Content .\terraform.tfstate

JSON με "serial", "terraform_version": "1.12.2" και μια λίστα "resources" που περιέχει το local_file.message. Ξανάκλεισέ το. Δεν το επεξεργαζόμαστε ποτέ με το χέρι.

A.8 — Τροποποίηση του περιεχομένου και παρατήρηση της αντικατάστασης

Στο VS Code, αντικατέστησε τη γραμμή content του main.tf με:

hcl
  content  = "Deuxième version du fichier créée avec Terraform."

Αποθήκευσε, μετά ξεδίπλωσε τα T10 και T11:

powershell
terraform plan
terraform apply

Απάντησε yes. Σημεία ελέγχου: # local_file.message must be replaced, # forces replacement στο τέλος της γραμμής content, Plan: 1 to add, 0 to change, 1 to destroy., μετά Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

powershell
Get-Content .\message.txt
text
Deuxième version du fichier créée avec Terraform.

A.9 — Καταστροφή και επαλήθευση

Ξεδίπλωσε τα T12 και T13:

powershell
terraform destroy
terraform state list

Απάντησε yes. Σημεία ελέγχου: Destroy complete! Resources: 1 destroyed., μετά μια άδεια έξοδο για το state list.

powershell
Get-ChildItem -Force
text
.terraform
.terraform.lock.hcl
main.tf
terraform.tfstate
terraform.tfstate.backup

Το message.txt εξαφανίστηκε. Το terraform.tfstate είναι ακόμα εκεί αλλά δεν περιέχει πλέον πόρο· το terraform.tfstate.backup είναι η αντιγραφή πριν το destroy. Τα .terraform και .terraform.lock.hcl παραμένουν: είναι φυσιολογικό, θα σου χρησιμεύσουν αν ξανατρέξεις το apply.

A.10 — Ο μετρητής του κιτ

Ανέβα στη ρίζα του κιτ και τρέξε το etat:

powershell
cd ..\..
.\labo.ps1 etat
text
travail projet-01-local : aucune ressource
Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

Αν είχες ξεχάσει το destroy, η έξοδος θα έλεγε travail projet-01-local : 1 ressource dans le state και μετά Ressources encore gérées : 1 (0 attendu à la fin d'une séance).: είναι ο μηχανισμός ασφαλείας που θα τρέχεις στο τέλος κάθε συνεδρίας, όταν οι πόροι θα χρεώνονται.

Για να ξεκινήσεις από την αρχή, μάλλον παρά να καθαρίσεις τον φάκελο: .\labo.ps1 nouveau projet-01-reprise, και ξεκινάς από έναν άδειο φάκελο.

Παράρτημα B — Αναλυτικό βήμα προς βήμα σε Linux, macOS, WSL 2 και Git Bash

Εμφάνιση του βήματος προς βήμα Linux, macOS, WSL 2 και Git Bash (B.0 έως B.10)

Όλες οι εντολές αυτού του παραρτήματος πληκτρολογούνται σε τερματικό bash (ή zsh σε macOS), με ./labo.sh …. Οι έξοδοι Terraform είναι αυτές του μηχανήματος του μαθήματος (Terraform 1.12.2)· οι έξοδοι ls -la καταγράφηκαν σε Git Bash, οι στήλες δικαιωμάτων, ιδιοκτήτη και ημερομηνίας διαφέρουν στο δικό σου.

B.0 — Πριν ξεκινήσεις

  • Να έχεις διαβάσει τα μαθήματα 01 και 02 της ενότητας.
  • Το Git εγκατεστημένο (το git --version απαντά), το VS Code εγκατεστημένο με την εντολή code διαθέσιμη στο τερματικό (σε macOS: VS Code → Cmd+Shift+P → « Shell Command: Install 'code' command in PATH »).
  • Αν το ./labo.sh απαντά Permission denied: chmod +x labo.sh, μία μόνο φορά.
  • Στο τέλος, το ./labo.sh etat πρέπει να εμφανίζει Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

B.1 — Εγκατάσταση του Terraform

Ακολούθησε την επίσημη σελίδα https://developer.hashicorp.com/terraform/install για το σύστημά σου. Συνοπτικά:

  • Ubuntu, Debian, WSL 2 Ubuntu: πρόσθεσε το αποθετήριο HashiCorp (apt με το κλειδί GPG, εντολές αντιγραμμένες από την επίσημη σελίδα), μετά sudo apt-get install terraform.
  • macOS με Homebrew: brew tap hashicorp/tap μετά brew install hashicorp/tap/terraform.
  • Οποιαδήποτε διανομή, εκτελέσιμο: κατέβασε το .zip Linux AMD64ARM64), unzip, μετά sudo mv terraform /usr/local/bin/.
  • Git Bash σε Windows: εγκατάστησε το Terraform όπως στο παράρτημα A.1 (winget), το Git Bash το βλέπει στο PATH.

Κλείσε το τερματικό, ξανάνοιξέ το, μετά:

bash
terraform version

Σημείο ελέγχου: Terraform v1.12.2 (ή πιο πρόσφατο) ακολουθούμενο από on linux_amd64, on darwin_arm64 ή on windows_amd64 ανάλογα με το μηχάνημά σου. Όλα όσα είναι 1.6 ή νεότερα ταιριάζουν.

Αν βλέπεις κάτι άλλο: bash: terraform: command not found → το εκτελέσιμο δεν είναι σε φάκελο του PATH (echo $PATH), ή το τερματικό δεν ξανανοίχτηκε. Παράρτημα Γ.

B.2 — Εγκατάσταση και διαμόρφωση του AWS CLI έκδοση 2 (για τα επόμενα έργα)

Το έργο 01 δεν χρησιμοποιεί το AWS· αυτό το βήμα προετοιμάζει το έργο 03. Μπορείς να το κάνεις τώρα ή να το αφήσεις για αργότερα.

Ακολούθησε το https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html για το σύστημά σου (πακέτο .zip με ./aws/install σε Linux, .pkg σε macOS). Μετά:

bash
aws --version

Σημείο ελέγχου: μια έκδοση που ξεκινά με aws-cli/2. Αν βλέπεις aws-cli/1, είναι η παλιά έκδοση: απεγκατάστησέ την.

Διαμόρφωσε τα κλειδιά που δημιουργήθηκαν στην ενότητα Η κονσόλα AWS, στον περιηγητή:

bash
aws configure
text
AWS Access Key ID [None]: TON_ACCESS_KEY_ID
AWS Secret Access Key [None]: TA_SECRET_ACCESS_KEY
Default region name [None]: ca-central-1
Default output format [None]: json

Επαλήθευσε ότι το CLI μιλά πράγματι με το AWS:

bash
aws sts get-caller-identity

Παράδειγμα απάντησης (οι τιμές είναι αυτές του λογαριασμού σου):

json
{
    "UserId": "AIDA...",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/terraform-admin"
}

Περίπτωση AWS Academy ή προσωρινό sandbox: άνοιξε το εργαστήριο, κάνε κλικ στο AWS Details ή Credentials, αντιγράψε Access Key, Secret Key και Session Token (υποχρεωτικό με προσωρινή πρόσβαση), μετά:

bash
aws configure set aws_access_key_id TON_ACCESS_KEY_ID
aws configure set aws_secret_access_key TA_SECRET_ACCESS_KEY
aws configure set aws_session_token TON_SESSION_TOKEN
aws configure set region ca-central-1
aws configure set output json
aws sts get-caller-identity

B.3 — Κλωνοποίηση του κιτ και έλεγχος των προαπαιτούμενων

Τοποθετήσου στον φάκελο όπου κρατάς τα έργα σου (για παράδειγμα ~/projets), μετά:

bash
git clone https://github.com/hrhouma2/aiopsatlas-terraform-labo-fr.git lab-terraform
cd lab-terraform
ls

Σημείο ελέγχου: το ls απαριθμεί labo.ps1 labo.sh projets README.md (και .gitattributes, .gitignore με ls -a). Μετά:

bash
./labo.sh prerequis
text
OK  terraform 1.12.2
OK  aws 2.22.18
OK  git 2.49.0.windows.1
OK  code 1.135.0
OK  gh 2.81.0 (optionnel)
ABSENT  az (optionnel, projet 08B seulement)
OK  gcloud 544.0.0 (optionnel)
Prérequis : 4 outils requis présents sur 4.

(Έξοδος καταγραμμένη σε Git Bash, εξ ου και το git 2.49.0.windows.1· σε Linux θα διαβάσεις τη δική σου έκδοση Git.) Τα τέσσερα απαιτούμενα εργαλεία είναι terraform, aws, git και code. Τα gh, az και gcloud είναι προαιρετικά και μπορούν να είναι ABSENT χωρίς συνέπεια πριν την ενότητα 3. Αν το aws είναι ABSENT επειδή άφησες το B.2 για αργότερα, η τελευταία γραμμή λέει 3 outils requis présents sur 4: μπορείς παρόλα αυτά να συνεχίσεις αυτό το έργο.

B.4 — Δημιουργία του φακέλου εργασίας και άνοιγμά του στο VS Code

bash
./labo.sh nouveau projet-01-local
text
Dossier travail/projet-01-local créé (ignoré par Git). Tapez :
  cd travail/projet-01-local

Κάνε ό,τι σου λέει το script, μετά άνοιξε τον φάκελο στο VS Code:

bash
cd travail/projet-01-local
code .

Ο φάκελος travail/ αγνοείται από το Git: μπορείς να γράφεις ελεύθερα μέσα χωρίς να λεκιάσεις το κιτ. Το διορθωμένο παραμένει στο projets/01-terraform-local/.

Αν το code . δεν κάνει τίποτα: άνοιξε το VS Code με το χέρι, FileOpen Folder, και επίλεξε lab-terraform/travail/projet-01-local.

B.5 — Δημιουργία του main.tf

Στο VS Code: εικονίδιο New File στον εξερευνητή αριστερά, ονόμασε το αρχείο main.tf, επικόλλησε τον κώδικα της ενότητας Ο κώδικας: αρχείο προς αρχείο, αποθήκευσε με Ctrl+S (Cmd+S σε macOS).

Τρίτος δρόμος, χωρίς επεξεργαστή, αν προτιμάς το τερματικό:

bash
cat > main.tf <<'EOF'
terraform {
  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "~> 2.5"
    }
  }
}

provider "local" {}

resource "local_file" "message" {
  filename = "${path.module}/message.txt"
  content  = "Bonjour, ce fichier a été créé avec Terraform."
}
EOF

(Τα εισαγωγικά γύρω από το 'EOF' εμποδίζουν το bash να ερμηνεύσει το ${path.module}: χωρίς αυτά, η γραμμή filename θα άδειαζε.) Επαλήθευσε:

bash
cat main.tf
ls -la
text
total 1
drwxr-xr-x 1 rehou 197609   0 sept. 15 14:47 .
drwxr-xr-x 1 rehou 197609   0 sept. 15 14:47 ..
-rw-r--r-- 1 rehou 197609 286 sept. 15 14:47 main.tf

Σημείο ελέγχου: οι δεκαπέντε γραμμές του αρχείου, και μία μόνο καταχώρηση στον φάκελο, main.tf, περίπου 286 byte.

B.6 — Αρχικοποίηση, μορφοποίηση, επικύρωση, σχεδιασμός, εφαρμογή

Ξεδίπλωσε τα T2 έως T6 της ενότητας Terraform, στο τερματικό:

bash
terraform init
terraform fmt
terraform validate
terraform plan
terraform apply

Απάντησε yes στην ερώτηση του apply. Σημεία ελέγχου, με τη σειρά: Terraform has been successfully initialized!, τίποτα για το fmt, Success! The configuration is valid., Plan: 1 to add, 0 to change, 0 to destroy., Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Επαλήθευσε τι εμφανίστηκε στον φάκελο:

bash
ls -la
text
total 14
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:47 .
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:47 ..
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:47 .terraform
-rw-r--r-- 1 rehou 197609 1257 sept. 15 14:47 .terraform.lock.hcl
-rw-r--r-- 1 rehou 197609  286 sept. 15 14:47 main.tf
-rw-r--r-- 1 rehou 197609   50 sept. 15 14:47 message.txt
-rw-r--r-- 1 rehou 197609 1667 sept. 15 14:47 terraform.tfstate

(Το -a εμφανίζει επίσης τις κρυφές καταχωρήσεις, αυτές που το όνομά τους ξεκινά με τελεία· το -l δίνει τη λεπτομέρεια.) Πέντε καταχωρήσεις εκτός από . και ..:

ΚαταχώρησηΠοιος τη δημιούργησεΤι είναι
.terraforminitΚρυφός φάκελος, ο κατεβασμένος provider. Ποτέ στο Git.
.terraform.lock.hclinitΟι επιλεγμένες εκδόσεις των providers. Στο Git.
main.tfεσύΟ κώδικας.
message.txtapplyΟ πόρος. 50 byte: το κείμενο, χωρίς τελική αλλαγή γραμμής.
terraform.tfstateapplyΤο state, η καταγραφή. Ποτέ στο Git, ποτέ κοινοποιημένο.

Διάβασε το δημιουργημένο αρχείο:

bash
cat message.txt
text
Bonjour, ce fichier a été créé avec Terraform.

(Το αρχείο δεν έχει τελική αλλαγή γραμμής: η προτροπή εντολών σου μπορεί να εμφανιστεί κολλημένη στο τέλος της φράσης. Είναι φυσιολογικό.)

B.7 — Ανάγνωση του state

Ξεδίπλωσε τα T7, T8 και T9:

bash
terraform state list
terraform state show local_file.message
terraform output

Σημεία ελέγχου: local_file.message· το πλήρες μπλοκ με filename = "./message.txt" και ένα id σαράντα χαρακτήρων· Warning: No outputs found.

Αν είσαι περίεργος, δες το ίδιο το state, χωρίς να το τροποποιήσεις:

bash
cat terraform.tfstate

JSON με "serial", "terraform_version": "1.12.2" και μια λίστα "resources" που περιέχει το local_file.message. Ξανάκλεισέ το. Δεν το επεξεργαζόμαστε ποτέ με το χέρι.

B.8 — Τροποποίηση του περιεχομένου και παρατήρηση της αντικατάστασης

Στο VS Code, αντικατέστησε τη γραμμή content του main.tf με:

hcl
  content  = "Deuxième version du fichier créée avec Terraform."

Αποθήκευσε, μετά ξεδίπλωσε τα T10 και T11:

bash
terraform plan
terraform apply

Απάντησε yes. Σημεία ελέγχου: # local_file.message must be replaced, # forces replacement στο τέλος της γραμμής content, Plan: 1 to add, 0 to change, 1 to destroy., μετά Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

bash
cat message.txt
text
Deuxième version du fichier créée avec Terraform.

B.9 — Καταστροφή και επαλήθευση

Ξεδίπλωσε τα T12 και T13:

bash
terraform destroy
terraform state list

Απάντησε yes. Σημεία ελέγχου: Destroy complete! Resources: 1 destroyed., μετά μια άδεια έξοδο για το state list.

bash
ls -la
text
total 17
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:47 .
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:47 ..
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:47 .terraform
-rw-r--r-- 1 rehou 197609 1257 sept. 15 14:47 .terraform.lock.hcl
-rw-r--r-- 1 rehou 197609  286 sept. 15 14:47 main.tf
-rw-r--r-- 1 rehou 197609  181 sept. 15 14:47 terraform.tfstate
-rw-r--r-- 1 rehou 197609 1667 sept. 15 14:47 terraform.tfstate.backup

Το message.txt εξαφανίστηκε. Το terraform.tfstate πέρασε από 1667 σε 181 byte: δεν περιέχει πλέον πόρο· το terraform.tfstate.backup (1667 byte) είναι η αντιγραφή πριν το destroy. Τα .terraform και .terraform.lock.hcl παραμένουν: είναι φυσιολογικό, θα σου χρησιμεύσουν αν ξανατρέξεις το apply.

bash
cat terraform.tfstate
json
{
  "version": 4,
  "terraform_version": "1.12.2",
  "serial": 3,
  "lineage": "9ddb3372-803f-0964-7665-8413b8f65ee1",
  "outputs": {},
  "resources": [],
  "check_results": null
}

"resources": []: η καταγραφή είναι άδεια. Το δικό σου lineage (το μοναδικό αναγνωριστικό αυτού του state) θα είναι διαφορετικό.

B.10 — Ο μετρητής του κιτ

Ανέβα στη ρίζα του κιτ και τρέξε το etat:

bash
cd ../..
./labo.sh etat
text
travail projet-01-local : aucune ressource
Ressources encore gérées : 0 (0 attendu à la fin d'une séance).

Αν είχες ξεχάσει το destroy, η έξοδος θα έλεγε travail projet-01-local : 1 ressource dans le state και μετά Ressources encore gérées : 1 (0 attendu à la fin d'une séance).: είναι ο μηχανισμός ασφαλείας που θα τρέχεις στο τέλος κάθε συνεδρίας, όταν οι πόροι θα χρεώνονται.

Για να ξεκινήσεις από την αρχή, μάλλον παρά να καθαρίσεις τον φάκελο: ./labo.sh nouveau projet-01-reprise, και ξεκινάς από έναν άδειο φάκελο.

Παράρτημα Γ — Αν κάτι κολλάει (όλα τα συστήματα)

Εμφάνιση των περιπτώσεων που κολλάνε

Κάθε περίπτωση: το ακριβές μήνυμα → η αιτία → η κίνηση.

  • Το terraform plan απαντά Error: Inconsistent dependency lock filerequired by this configuration but no version is selected → Δεν έχεις τρέξει το terraform init σε αυτόν τον φάκελο (ή πρόσθεσες έναν provider από τότε). Το μήνυμα τελειώνει με τη λύση: terraform init, μετά ξανατρέξε.

  • Το terraform validate απαντά Error: Missing required providerYou may be able to install it automatically by running: terraform init → Ίδια αιτία, ίδια κίνηση: terraform init.

  • Error: Unsupported argumentAn argument named "contenu" is not expected here. Did you mean "content"? → Ορθογραφικό λάθος σε ένα όνομα ορίσματος. Το Terraform συχνά προτείνει τη σωστή λέξη. Διόρθωσε, ξαναποθήκευσε, ξανατρέξε το validate.

  • Error: Unclosed configuration blockThere is no closing brace for this block before the end of the file. → Λείπει ένα άγκιστρο }. Μέτρησέ τα: κάθε { έχει το } του. Στο main.tf, υπάρχουν τρία εμφωλευμένα ζεύγη για το μπλοκ terraform, ένα για το provider, ένα για το resource.

  • Error: Invalid multi-line string και μετά Error: Unterminated template stringNo closing marker was found for the string. → Λείπει ένα εισαγωγικό " στο τέλος μιας τιμής. Η λανθασμένη γραμμή αναφέρεται (3: content = "Bonjour Terraform).

  • Error: Invalid resource typeThe provider hashicorp/local does not support resource type "local_fichier". → Ο τύπος πόρου δεν υπάρχει σε αυτόν τον provider. Οι τύποι του provider local λέγονται local_file και local_sensitive_file· η τεκμηρίωση του provider στο Registry δίνει τη λίστα τους.

  • Error: Invalid Attribute CombinationNo attribute specified when one (and only one) of [content,sensitive_content,content_base64] is required (επαναλαμβάνεται τέσσερις φορές) → Αφαίρεσες τη γραμμή content: ένα local_file πρέπει να λέει τι περιέχει. Ξαναβάλ' την.

  • Το terraform validate λέει Success! αλλά το terraform plan απαντά Error: No configuration filescreate a Terraform configuration file (.tf file) and try again. → Δεν υπάρχει κανένα αρχείο .tf στον φάκελο: είτε δεν είσαι στο travail/projet-01-local (έλεγξε με pwd), είτε το αρχείο ονομάζεται main.tf.txt. Μετονόμασέ το σε main.tf. Ένας άδειος φάκελος είναι μια έγκυρη (άδεια) διαμόρφωση, εξ ου και το παραπλανητικό Success!.

  • Το terraform apply απαντά Apply cancelled. και τίποτα δεν δημιουργείται → Πληκτρολόγησες κάτι άλλο από yes (για παράδειγμα y, Y, oui, ή μόνο Enter). Ξανατρέξε και πληκτρολόγησε yes ολόκληρο.

  • Το terraform state list απαντά No state file was found! → Κανένα apply δεν έχει γίνει ακόμη σε αυτόν τον φάκελο, ή δεν είσαι στον σωστό φάκελο. Δεν είναι βλάβη: δεν υπάρχει ακόμη τίποτα να απαριθμηθεί.

  • Το terraform state show απαντά No instance found for the given address! → Η διεύθυνση είναι λάθος γραμμένη, ή ο πόρος καταστράφηκε. Το terraform state list δίνει τις ακριβείς διευθύνσεις.

  • Το terraform fmt -check εξέρχεται με σφάλμα (κωδικός 3) εμφανίζοντας το main.tf → Το αρχείο δεν είναι στην επίσημη μορφή (εσοχή, ευθυγράμμιση των =). Δεν είναι συντακτικό σφάλμα: το terraform fmt χωρίς -check το διορθώνει.

  • Μετά το destroy, το terraform.tfstate είναι ακόμα εκεί και πιστεύεις ότι το destroy απέτυχε → Όχι: άνοιξέ το, "resources": []. Το αρχείο παραμένει, άδειο, με ένα terraform.tfstate.backup δίπλα. Το Destroy complete! Resources: 1 destroyed. αποδεικνύει.

  • Το .\labo.ps1 etat ή το ./labo.sh etat εμφανίζει Ressources encore gérées : 1 → Ένα destroy ξεχάστηκε σε έναν από τους φακέλους που απαριθμούνται παραπάνω (travail projet-01-local : 1 ressource dans le state). Πήγαινε σε αυτόν τον φάκελο, terraform destroy, yes, ξανατρέξε το etat.

  • Windows μόνο — terraform : Le terme «terraform» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. → Το Terraform δεν είναι στο PATH, ή το PowerShell δεν επανεκκινήθηκε μετά την εγκατάσταση. Κλείσε όλα τα παράθυρα PowerShell, ξανάνοιξε, ξαναπληκτρολόγησε terraform version. Αν συνεχίζει, παράρτημα A.1 (προσθήκη του C:\terraform στο PATH).

  • Windows μόνο — aws : Le terme «aws» n'est pas reconnu… → Το AWS CLI δεν είναι εγκατεστημένο ή το PowerShell δεν επανεκκινήθηκε. Επανεγκατάστησε το AWS CLI έκδοση 2 (A.2), κλείσε και ξανάνοιξε το PowerShell, ξαναπληκτρολόγησε aws --version.

  • Windows μόνο — το .\labo.ps1 απορρίπτεται: «l'exécution de scripts est désactivée sur ce système»Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, απάντησε O, ξανατρέξε. Μία μόνο φορά ανά μηχάνημα.

  • Windows μόνο — το αρχείο ονομάζεται main.tf.txt → Το Σημειωματάριο προσθέτει .txt. Στο PowerShell: Rename-Item main.tf.txt main.tf. Χρησιμοποίησε το VS Code για να δημιουργείς τα αρχεία.

  • Linux native και macOS — bash: terraform: command not found → Το εκτελέσιμο δεν είναι σε φάκελο του PATH. sudo mv terraform /usr/local/bin/, ή έλεγξε την εγκατάσταση μέσω πακέτου (B.1). Ξανάνοιξε το τερματικό.

  • macOS και bash — το ./labo.sh απαντά Permission deniedchmod +x labo.sh, μία μόνο φορά. Αν bash: ./labo.sh: /bin/bash^M: bad interpreter, το αρχείο έχει τερματισμούς γραμμής Windows: git config core.autocrlf input και μετά ξανακλωνοποίηση, ή sed -i 's/\r$//' labo.sh (sed -i '' … σε macOS).

  • Το aws sts get-caller-identity απαντά AccessDenied ή InvalidClientTokenId → Το διαμορφωμένο κλειδί δεν είναι το σωστό, ή το session token του Academy έληξε. aws configure με το κλειδί του terraform-admin (έλεγξε ότι ο χρήστης είναι στην ομάδα terraform-admins με AdministratorAccess), ή ξανακάνε aws configure set … με νέα διαπιστευτήρια Academy. Χωρίς επίδραση στο έργο 01, που δεν καλεί το AWS.

Τι παραδίδεις

Έναν συμπιεσμένο φάκελο ή ένα αποθετήριο Git που περιέχει:

  • το main.tf (το τελικό αρχείο, με τη δεύτερη έκδοση του content
  • το sorties.txt: την πλήρη έξοδο του terraform plan (πρώτη έκδοση), του terraform state list μετά το apply, του terraform plan τροποποίησης (αυτό με το must be replaced), και του terraform state list μετά το destroy (άδειο)·
  • το README.md βασισμένο στο παρακάτω πρότυπο.

Μην παραδώσεις ούτε τον φάκελο .terraform/, ούτε το terraform.tfstate, ούτε κανένα Access Key.

markdown
# Projet 01 — Terraform local

- Terraform : (sortie de `terraform version`)
- Système : Windows / Linux / macOS

## Ce que j'ai fait
init, fmt, validate, plan, apply, state list, state show, modification de content, plan, apply, destroy, state list.

## Le fichier terraform.tfstate, en trois lignes à moi
(À quoi il sert. Pourquoi Terraform en a besoin pour destroy. Pourquoi on ne l'édite pas et on ne le partage pas.)

## Ce qui m'a bloqué, et comment j'ai débloqué
(Une ligne, ou « rien ».)

Επίσημες πηγές

Φράση για να θυμάσαι: το Terraform δεν κάνει κλικ στην κονσόλα στη θέση σου. Διαβάζει τον κώδικά σου, τον συγκρίνει με το state του και με την πραγματικότητα, σου ανακοινώνει τι θα αλλάξει, και μετά δημιουργεί, αντικαθιστά ή καταστρέφει για να φτάσει στην αιτούμενη κατάσταση.