Πώς να διαβάσεις αυτή τη σελίδα. Κάθε ενότητα είναι διπλωμένη κάτω από τον τίτλο της: κάνε κλικ στο «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)
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
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, που δημιουργείς μέσα στο travail/projet-01-local/. Πληκτρολόγησέ το ή επικόλλησέ το ακριβώς έτσι (είναι λέξη προς λέξη το διορθωμένο του κιτ, projets/01-terraform-local/main.tf):
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. |
Το Terraform εκτελεί τις εντολές από τον τρέχοντα φάκελο. Αν γράψεις filename = "message.txt", το αρχείο δημιουργείται εκεί όπου πληκτρολογείς terraform apply, που είναι γενικά ο σωστός φάκελος, αλλά όχι πάντα (όταν ο κώδικας καλείται ως module από άλλον φάκελο, στην ενότητα 5). Το path.module δηλώνει πάντα τον φάκελο του αρχείου .tf, ανεξάρτητα από το σημείο από όπου εκτελείται το Terraform. Η σύνταξη ${…} εισάγει την τιμή μιας έκφρασης μέσα σε μια συμβολοσειρά: το "${path.module}/message.txt" γίνεται "./message.txt".
Λειτουργεί παρόλα αυτά: το Terraform συνάγει από τον τύπο local_file ότι χρειάζεται τον provider hashicorp/local, και το init εμφανίζει Finding latest version of hashicorp/local... αντί για Finding hashicorp/local versions matching "~> 2.5".... Αυτό κάνουν τα δύο εργαστήρια θεμελίωσης αυτής της ενότητας, για να πάνε στο πιο σύντομο. Όμως χωρίς περιορισμό έκδοσης, δύο συνάδελφοι που τρέχουν init με έξι μήνες διαφορά μπορούν να πάρουν δύο διαφορετικές εκδόσεις του provider. Σε ένα πραγματικό έργο, γράφουμε πάντα το μπλοκ.
Οι εντολές αυτής της ενότητας πληκτρολογούνται μέσα στον φάκελο travail/projet-01-local, μόλις γραφτεί το main.tf. Είναι ταυτόσημες σε Windows, Linux και macOS: το Terraform είναι το ίδιο πρόγραμμα παντού. Οι έξοδοι είναι αυτές του μηχανήματος του μαθήματος (Terraform 1.12.2, Windows 11), καταγραμμένες όπως είναι· μόνο τα αναγνωριστικά (id=ff6b93dc…) και τα αποτυπώματα αλλάζουν από μηχάνημα σε μηχάνημα. Οι εντολές που εξαρτώνται από το σύστημα (ανάγνωση αρχείου, λίστα φακέλου) βρίσκονται στο παράρτημά σου.
Μια εικόνα να κρατήσεις για όλη την ενότητα: το μάθημα 01 σου παρουσίασε τον αρχιτέκτονα. Κάθε εντολή παρακάτω είναι μία από τις κινήσεις του. Το init ανοίγει το εργοτάξιο, το plan γράφει την προσφορά, το apply την εκτελεί, το state ξαναδιαβάζει την καταγραφή, το destroy αποσυναρμολογεί τα πάντα.
Ο κανόνας: μία μόνο καινοτομία ανά εντολή. Ξεκινάμε με την εντολή που δεν δέχεται καμία παράμετρο και δεν αγγίζει τίποτα.
terraform versionTerraform 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. Ίδια κίνηση, ίδιος σκοπός.
terraform initInitializing 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).
Το Terraform αρνείται να συνεχίσει και σου λέει τι να κάνεις. Το terraform plan χωρίς init απαντά:
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:
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 ξανατρέχει χωρίς κίνδυνο όσες φορές θέλεις· δεν αγγίζει ποτέ τους πόρους σου.
terraform fmtΤι ζητά η εντολή: «Ευθυγράμμισε ξανά τα κενά και την εσοχή των αρχείων μου .tf σύμφωνα με το επίσημο στιλ.»
Μία μόνο καινοτομία: η άδεια έξοδος. Το fmt εμφανίζει το όνομα κάθε αρχείου που τροποποίησε· αν επικόλλησες τον κώδικα όπως είναι, δεν έχει τίποτα να διορθώσει και δεν εμφανίζει τίποτα. Δεν είναι σφάλμα, είναι η καλύτερη δυνατή απάντηση. Αν είχες κάνει λάθος εσοχή σε μια γραμμή, θα εμφανιζόταν το main.tf και θα ξανάγραφε το αρχείο.
Το γνωστό αντίστοιχο: prettier --write, black, gofmt. Το κιτ ελέγχει αυτό το σημείο με το terraform fmt -check -recursive, που δεν τροποποιεί τίποτα και εξέρχεται με σφάλμα (κωδικός 3) αν κάποιο αρχείο δεν είναι στη σωστή μορφή.
terraform validateSuccess! 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», όχι «είναι καλή ιδέα».
terraform planTerraform 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: που δεν διαβάζεται ποτέ βιαστικά.
terraform applyTerraform 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 γράφει και σημειώνει στην καταγραφή του ότι έγραψε, με ποιο αναγνωριστικό, με ποιο περιεχόμενο.
terraform state listlocal_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 δεν πηγαίνει να δει την πραγματικότητα: διαβάζει το τετράδιό του.
terraform state show local_file.message# 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 είναι JSON: ένας σειριακός αριθμός ("serial"), η έκδοση του Terraform, και μια λίστα "resources" όπου κάθε πόρος έχει ακριβώς τις ιδιότητες που σου εμφανίζει το state show. Μπορείς να το ανοίξεις για να το διαβάσεις. Δεν το τροποποιείς ποτέ με το χέρι: ένα κόμμα που μετακινήθηκε, και το Terraform δεν αναγνωρίζει πλέον τι έχει κατασκευάσει, ή πιστεύει ότι διαχειρίζεται κάτι που δεν υπάρχει πλέον. Για να ενεργήσεις στο state, υπάρχουν εντολές (terraform state rm, terraform state mv, terraform import) που θα δεις στην ενότητα 4.
Δύο ακόμη κανόνες, από σήμερα. Το state μπορεί να περιέχει μυστικά (εδώ, το κείμενο του αρχείου· αλλού, έναν κωδικό πρόσβασης βάσης δεδομένων): δεν μοιράζεται με μήνυμα ούτε γίνεται commit στο Git. Και είναι η μνήμη του Terraform: αν το διαγράψεις, το Terraform πιστεύει ότι τίποτα δεν υπάρχει και προτείνει να ξανακατασκευάσει τα πάντα, ενώ οι πόροι είναι ακόμα εκεί και, στο cloud, ακόμα χρεωμένοι.
terraform outputWarning: 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:).
Άνοιξε το main.tf, αντικατέστησε τη γραμμή content με αυτή, αποθήκευσε:
content = "Deuxième version du fichier créée avec Terraform."Μετά:
terraform planlocal_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. Ο providerlocalαντικαθιστά το αρχείο μόλις αλλάξει τοcontent: ποτέ απλό~για αυτή την ιδιότητα.
terraform apply…
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.
terraform destroylocal_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 που, διαφορετικά, θα παρέμενε χρεωμένο.
terraform state listΤι ζητά η εντολή: το ίδιο όπως στο 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).
Το έργο 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 αν ο εκπαιδευτικός σου σου δίνει ήδη προσωρινή πρόσβαση.
ca-central-1 αν το εργαστήριο δεν επιβάλλει άλλη.Ο λογαριασμός root χρησιμεύει μόνο για τη δημιουργία του λογαριασμού, τη διαχείριση της χρέωσης και τις ευαίσθητες λειτουργίες. Ενεργοποίησε το MFA (πιστοποίηση δύο παραγόντων) στον λογαριασμό root, και μετά δημιούργησε έναν ξεχωριστό χρήστη για την εργασία εργαστηρίου, παρακάτω.
IAM και άνοιξε την υπηρεσία IAM.terraform-admins.AdministratorAccess, τσέκαρε την πολιτική AdministratorAccess.Μόνο για εργαστήριο. Το
AdministratorAccessδίνει πλήρη πρόσβαση σε όλες τις υπηρεσίες και τους πόρους του λογαριασμού. Είναι πρακτικό για εκμάθηση· δεν είναι μοντέλο ασφάλειας για παραγωγή, όπου δίνουμε στο Terraform μόνο τα δικαιώματα που χρειάζεται (ενότητα 4).
terraform-admin.terraform-admins → Next → Create user.terraform-admin.aws-cli-terraform-lab → Create access key..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 credentials → Deactivate και μετά Delete, και δημιουργείς ένα άλλο.
Πριν ξανατρέξεις το terraform destroy δεύτερη φορά σε έναν φάκελο που έχει ήδη καταστραφεί, γράψε σε χαρτί τι θα λέει η τελευταία γραμμή του plan. Μετά τρέξε το. Στη συνέχεια, ξανακατασκεύασε το αρχείο με terraform apply, άνοιξε το message.txt στο VS Code, πρόσθεσε μια λέξη με το χέρι, αποθήκευσε, και πληκτρολόγησε terraform plan: τι λέει η γραμμή Refreshing state..., ποιο σύμβολο εμφανίζεται, και πώς λέγεται αυτή η απόκλιση στο μάθημα 01; Τελείωσε με destroy: ο φάκελος πρέπει να επιστρέψει στο Ressources encore gérées : 0.
Όλες οι εντολές αυτού του παραρτήματος πληκτρολογούνται στο PowerShell (Windows Terminal ή PowerShell 7), με .\labo.ps1 …. Οι αναπαραγόμενες έξοδοι είναι αυτές του μηχανήματος του μαθήματος, σε Windows 11 και Terraform 1.12.2.
git --version απαντά), το VS Code εγκατεστημένο με την εντολή code διαθέσιμη στο PowerShell (αλλιώς: VS Code → Ctrl+Shift+P → « Shell Command: Install 'code' command in PATH », ή επανεγκατάσταση τσεκάροντας « Add to PATH »)..\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).Το πιο απλό, με τον διαχειριστή πακέτων των Windows:
winget install Hashicorp.TerraformΚλείσε το PowerShell, ξανάνοιξέ το, μετά:
terraform versionΣημείο ελέγχου:
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ème → Variables d'environnement → στο Variables système, επίλεξε Path → Modifier → Nouveau → C:\terraform → OK. Κλείσε όλα τα παράθυρα PowerShell, ξανάνοιξε, ξαναπληκτρολόγησε terraform version.
Αν βλέπεις κάτι άλλο: terraform : Le terme «terraform» n'est pas reconnu comme nom d'applet de commande… → το Terraform δεν είναι στο PATH, ή το PowerShell δεν επανεκκινήθηκε μετά την εγκατάσταση. Παράρτημα Γ.
Το έργο 01 δεν χρησιμοποιεί το AWS· αυτό το βήμα προετοιμάζει το έργο 03. Μπορείς να το κάνεις τώρα ή να το αφήσεις για αργότερα.
.msi: Next, δέξου την άδεια χρήσης, κράτησε τον προεπιλεγμένο φάκελο, Install.aws --versionΣημείο ελέγχου: μια έκδοση που ξεκινά με aws-cli/2 (στο μηχάνημα του μαθήματος: aws-cli/2.22.18). Αν βλέπεις aws-cli/1, είναι η παλιά έκδοση: απεγκατάστησέ την.
Μετά διαμόρφωσε τα κλειδιά που δημιουργήθηκαν στην ενότητα Η κονσόλα AWS, στον περιηγητή:
aws configureAWS 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:
aws sts get-caller-identityΠαράδειγμα απάντησης (οι τιμές είναι αυτές του λογαριασμού σου):
{
"UserId": "AIDA...",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/terraform-admin"
}Περίπτωση AWS Academy ή προσωρινό sandbox: άνοιξε το εργαστήριο, κάνε κλικ στο AWS Details ή Credentials, αντιγράψε Access Key, Secret Key και Session Token (υποχρεωτικό με προσωρινή πρόσβαση), μετά:
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Τοποθετήσου στον φάκελο όπου κρατάς τα έργα σου (για παράδειγμα C:\Users\<toi>\Documents), μετά:
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). Μετά:
.\labo.ps1 prerequisOK 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: μπορείς παρόλα αυτά να συνεχίσεις αυτό το έργο.
.\labo.ps1 nouveau projet-01-localDossier travail\projet-01-local créé (ignoré par Git). Tapez :
cd travail\projet-01-localΚάνε ό,τι σου λέει το script, μετά άνοιξε τον φάκελο στο VS Code:
cd travail\projet-01-local
code .Ο φάκελος travail\ αγνοείται από το Git: μπορείς να γράφεις ελεύθερα μέσα χωρίς να λεκιάσεις το κιτ. Το διορθωμένο παραμένει στο projets\01-terraform-local\.
Αν το code . δεν κάνει τίποτα: άνοιξε το VS Code με το χέρι, File → Open Folder, και επίλεξε lab-terraform\travail\projet-01-local.
main.tfΣτο VS Code: εικονίδιο New File στον εξερευνητή αριστερά, ονόμασε το αρχείο main.tf (προσοχή: όχι main.tf.txt, το VS Code δεν προσθέτει επέκταση αλλά το Σημειωματάριο των Windows θα το έκανε), επικόλλησε τον κώδικα της ενότητας Ο κώδικας: αρχείο προς αρχείο, αποθήκευσε με Ctrl+S.
Επαλήθευσε από το PowerShell:
Get-Content .\main.tfΣημείο ελέγχου: οι δεκαπέντε γραμμές του αρχείου, από terraform { έως }. Μετά:
Get-ChildItemΜία μόνο καταχώρηση: main.tf. Αν βλέπεις main.tf.txt, μετονόμασε: Rename-Item main.tf.txt main.tf.
Ξεδίπλωσε τα T2 έως T6 της ενότητας Terraform, στο τερματικό:
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.
Επαλήθευσε τι εμφανίστηκε στον φάκελο:
Get-ChildItem -Force.terraform
.terraform.lock.hcl
main.tf
message.txt
terraform.tfstate(Το -Force εμφανίζει επίσης τις κρυφές καταχωρήσεις, αυτές που το όνομά τους ξεκινά με τελεία· χωρίς αυτό, θα έβλεπες μόνο τα main.tf, message.txt και terraform.tfstate.) Πέντε καταχωρήσεις:
| Καταχώρηση | Ποιος τη δημιούργησε | Τι είναι |
|---|---|---|
.terraform | init | Κρυφός φάκελος, ο κατεβασμένος provider. Ποτέ στο Git. |
.terraform.lock.hcl | init | Οι επιλεγμένες εκδόσεις των providers. Στο Git. |
main.tf | εσύ | Ο κώδικας. |
message.txt | apply | Ο πόρος. |
terraform.tfstate | apply | Το state, η καταγραφή. Ποτέ στο Git, ποτέ κοινοποιημένο. |
Διάβασε το δημιουργημένο αρχείο:
Get-Content .\message.txtBonjour, ce fichier a été créé avec Terraform.Μπορείς επίσης να το επαληθεύσεις στην Εξερεύνηση Windows: άνοιξε τον φάκελο lab-terraform\travail\projet-01-local, διπλό κλικ στο message.txt.
Ξεδίπλωσε τα T7, T8 και T9:
terraform state list
terraform state show local_file.message
terraform outputΣημεία ελέγχου: local_file.message· το πλήρες μπλοκ με filename = "./message.txt" και ένα id σαράντα χαρακτήρων· Warning: No outputs found.
Αν είσαι περίεργος, δες το ίδιο το state, χωρίς να το τροποποιήσεις:
Get-Content .\terraform.tfstateJSON με "serial", "terraform_version": "1.12.2" και μια λίστα "resources" που περιέχει το local_file.message. Ξανάκλεισέ το. Δεν το επεξεργαζόμαστε ποτέ με το χέρι.
Στο VS Code, αντικατέστησε τη γραμμή content του main.tf με:
content = "Deuxième version du fichier créée avec Terraform."Αποθήκευσε, μετά ξεδίπλωσε τα T10 και T11:
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.
Get-Content .\message.txtDeuxième version du fichier créée avec Terraform.Ξεδίπλωσε τα T12 και T13:
terraform destroy
terraform state listΑπάντησε yes. Σημεία ελέγχου: Destroy complete! Resources: 1 destroyed., μετά μια άδεια έξοδο για το state list.
Get-ChildItem -Force.terraform
.terraform.lock.hcl
main.tf
terraform.tfstate
terraform.tfstate.backupΤο message.txt εξαφανίστηκε. Το terraform.tfstate είναι ακόμα εκεί αλλά δεν περιέχει πλέον πόρο· το terraform.tfstate.backup είναι η αντιγραφή πριν το destroy. Τα .terraform και .terraform.lock.hcl παραμένουν: είναι φυσιολογικό, θα σου χρησιμεύσουν αν ξανατρέξεις το apply.
Ανέβα στη ρίζα του κιτ και τρέξε το etat:
cd ..\..
.\labo.ps1 etattravail 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, και ξεκινάς από έναν άδειο φάκελο.
Όλες οι εντολές αυτού του παραρτήματος πληκτρολογούνται σε τερματικό bash (ή zsh σε macOS), με ./labo.sh …. Οι έξοδοι Terraform είναι αυτές του μηχανήματος του μαθήματος (Terraform 1.12.2)· οι έξοδοι ls -la καταγράφηκαν σε Git Bash, οι στήλες δικαιωμάτων, ιδιοκτήτη και ημερομηνίας διαφέρουν στο δικό σου.
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).Ακολούθησε την επίσημη σελίδα https://developer.hashicorp.com/terraform/install για το σύστημά σου. Συνοπτικά:
apt με το κλειδί GPG, εντολές αντιγραμμένες από την επίσημη σελίδα), μετά sudo apt-get install terraform.brew tap hashicorp/tap μετά brew install hashicorp/tap/terraform..zip Linux AMD64 (ή ARM64), unzip, μετά sudo mv terraform /usr/local/bin/.winget), το Git Bash το βλέπει στο PATH.Κλείσε το τερματικό, ξανάνοιξέ το, μετά:
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), ή το τερματικό δεν ξανανοίχτηκε. Παράρτημα Γ.
Το έργο 01 δεν χρησιμοποιεί το AWS· αυτό το βήμα προετοιμάζει το έργο 03. Μπορείς να το κάνεις τώρα ή να το αφήσεις για αργότερα.
Ακολούθησε το https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html για το σύστημά σου (πακέτο .zip με ./aws/install σε Linux, .pkg σε macOS). Μετά:
aws --versionΣημείο ελέγχου: μια έκδοση που ξεκινά με aws-cli/2. Αν βλέπεις aws-cli/1, είναι η παλιά έκδοση: απεγκατάστησέ την.
Διαμόρφωσε τα κλειδιά που δημιουργήθηκαν στην ενότητα Η κονσόλα AWS, στον περιηγητή:
aws configureAWS 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:
aws sts get-caller-identityΠαράδειγμα απάντησης (οι τιμές είναι αυτές του λογαριασμού σου):
{
"UserId": "AIDA...",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/terraform-admin"
}Περίπτωση AWS Academy ή προσωρινό sandbox: άνοιξε το εργαστήριο, κάνε κλικ στο AWS Details ή Credentials, αντιγράψε Access Key, Secret Key και Session Token (υποχρεωτικό με προσωρινή πρόσβαση), μετά:
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Τοποθετήσου στον φάκελο όπου κρατάς τα έργα σου (για παράδειγμα ~/projets), μετά:
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). Μετά:
./labo.sh prerequisOK 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: μπορείς παρόλα αυτά να συνεχίσεις αυτό το έργο.
./labo.sh nouveau projet-01-localDossier travail/projet-01-local créé (ignoré par Git). Tapez :
cd travail/projet-01-localΚάνε ό,τι σου λέει το script, μετά άνοιξε τον φάκελο στο VS Code:
cd travail/projet-01-local
code .Ο φάκελος travail/ αγνοείται από το Git: μπορείς να γράφεις ελεύθερα μέσα χωρίς να λεκιάσεις το κιτ. Το διορθωμένο παραμένει στο projets/01-terraform-local/.
Αν το code . δεν κάνει τίποτα: άνοιξε το VS Code με το χέρι, File → Open Folder, και επίλεξε lab-terraform/travail/projet-01-local.
main.tfΣτο VS Code: εικονίδιο New File στον εξερευνητή αριστερά, ονόμασε το αρχείο main.tf, επικόλλησε τον κώδικα της ενότητας Ο κώδικας: αρχείο προς αρχείο, αποθήκευσε με Ctrl+S (Cmd+S σε macOS).
Τρίτος δρόμος, χωρίς επεξεργαστή, αν προτιμάς το τερματικό:
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 θα άδειαζε.) Επαλήθευσε:
cat main.tf
ls -latotal 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.
Ξεδίπλωσε τα T2 έως T6 της ενότητας Terraform, στο τερματικό:
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.
Επαλήθευσε τι εμφανίστηκε στον φάκελο:
ls -latotal 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 δίνει τη λεπτομέρεια.) Πέντε καταχωρήσεις εκτός από . και ..:
| Καταχώρηση | Ποιος τη δημιούργησε | Τι είναι |
|---|---|---|
.terraform | init | Κρυφός φάκελος, ο κατεβασμένος provider. Ποτέ στο Git. |
.terraform.lock.hcl | init | Οι επιλεγμένες εκδόσεις των providers. Στο Git. |
main.tf | εσύ | Ο κώδικας. |
message.txt | apply | Ο πόρος. 50 byte: το κείμενο, χωρίς τελική αλλαγή γραμμής. |
terraform.tfstate | apply | Το state, η καταγραφή. Ποτέ στο Git, ποτέ κοινοποιημένο. |
Διάβασε το δημιουργημένο αρχείο:
cat message.txtBonjour, ce fichier a été créé avec Terraform.(Το αρχείο δεν έχει τελική αλλαγή γραμμής: η προτροπή εντολών σου μπορεί να εμφανιστεί κολλημένη στο τέλος της φράσης. Είναι φυσιολογικό.)
Ξεδίπλωσε τα T7, T8 και T9:
terraform state list
terraform state show local_file.message
terraform outputΣημεία ελέγχου: local_file.message· το πλήρες μπλοκ με filename = "./message.txt" και ένα id σαράντα χαρακτήρων· Warning: No outputs found.
Αν είσαι περίεργος, δες το ίδιο το state, χωρίς να το τροποποιήσεις:
cat terraform.tfstateJSON με "serial", "terraform_version": "1.12.2" και μια λίστα "resources" που περιέχει το local_file.message. Ξανάκλεισέ το. Δεν το επεξεργαζόμαστε ποτέ με το χέρι.
Στο VS Code, αντικατέστησε τη γραμμή content του main.tf με:
content = "Deuxième version du fichier créée avec Terraform."Αποθήκευσε, μετά ξεδίπλωσε τα T10 και T11:
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.
cat message.txtDeuxième version du fichier créée avec Terraform.Ξεδίπλωσε τα T12 και T13:
terraform destroy
terraform state listΑπάντησε yes. Σημεία ελέγχου: Destroy complete! Resources: 1 destroyed., μετά μια άδεια έξοδο για το state list.
ls -latotal 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.
cat terraform.tfstate{
"version": 4,
"terraform_version": "1.12.2",
"serial": 3,
"lineage": "9ddb3372-803f-0964-7665-8413b8f65ee1",
"outputs": {},
"resources": [],
"check_results": null
}"resources": []: η καταγραφή είναι άδεια. Το δικό σου lineage (το μοναδικό αναγνωριστικό αυτού του state) θα είναι διαφορετικό.
Ανέβα στη ρίζα του κιτ και τρέξε το etat:
cd ../..
./labo.sh etattravail 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 file … required by this configuration but no version is selected → Δεν έχεις τρέξει το terraform init σε αυτόν τον φάκελο (ή πρόσθεσες έναν provider από τότε). Το μήνυμα τελειώνει με τη λύση: terraform init, μετά ξανατρέξε.
Το terraform validate απαντά Error: Missing required provider … You may be able to install it automatically by running: terraform init → Ίδια αιτία, ίδια κίνηση: terraform init.
Error: Unsupported argument … An argument named "contenu" is not expected here. Did you mean "content"? → Ορθογραφικό λάθος σε ένα όνομα ορίσματος. Το Terraform συχνά προτείνει τη σωστή λέξη. Διόρθωσε, ξαναποθήκευσε, ξανατρέξε το validate.
Error: Unclosed configuration block … There 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 string … No closing marker was found for the string. → Λείπει ένα εισαγωγικό " στο τέλος μιας τιμής. Η λανθασμένη γραμμή αναφέρεται (3: content = "Bonjour Terraform).
Error: Invalid resource type … The provider hashicorp/local does not support resource type "local_fichier". → Ο τύπος πόρου δεν υπάρχει σε αυτόν τον provider. Οι τύποι του provider local λέγονται local_file και local_sensitive_file· η τεκμηρίωση του provider στο Registry δίνει τη λίστα τους.
Error: Invalid Attribute Combination … No 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 files … create 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 denied → chmod +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.
# 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 ».)init, fmt, validate, plan, apply, state, destroy): https://developer.hashicorp.com/terraform/cli/commandshashicorp/local, πόρος local_file: https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/fileAdministratorAccess: https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AdministratorAccess.htmlΦράση για να θυμάσαι: το Terraform δεν κάνει κλικ στην κονσόλα στη θέση σου. Διαβάζει τον κώδικά σου, τον συγκρίνει με το state του και με την πραγματικότητα, σου ανακοινώνει τι θα αλλάξει, και μετά δημιουργεί, αντικαθιστά ή καταστρέφει για να φτάσει στην αιτούμενη κατάσταση.