Ce TP vise à vous familiariser avec la manipulation du state et à apporter des modifications au cycle de vie des ressources afin de couvrir des scénarios souvent rencontrés lors du MCO de projets utilisant Terraform.
Bonne chance !
- Récupération de l'Access Key et Secret Key AWS (à voir avec le formateur)
- Installation de Terraform
- Installation de la CLI AWS
- Configuration de l'authentification à AWS
- Se placer à l'intérieur du dossier
avance
L'objectif de cet exercice est de créer 3 enregistrements DNS en référençant une zone DNS déjà existante dans AWS.
- Utiliser la Data Source
aws_route53_zone
pour référencer dans Terraform la zone DNS qui sera utilisée dans la suite de cet exercice. Son nom:student-<N>.com
. - Créer autant de ressources
aws_route53_record
que d'éléments dans lamap
ci-dessous à l'aide d'unfor_each
:records
:- Adresse IP correspondant à l'application.
Basé sur la variable suivante (créer un fichier
vars.tf
):variable "records" { type = map(string) default = { app1 = "10.0.0.1" app2 = "10.0.0.2" app3 = "10.0.0.3" } }
- Adresse IP correspondant à l'application.
Basé sur la variable suivante (créer un fichier
name
:- Doit avoir le format
app<X>.student-<N>.com
- Doit avoir le format
zone_id
: La zone utilisée en Data Sourcetype
:"A"
ttl
:300
Aide:
L'objectif de cet exercice est de supprimer une ressource du state Terraform observer le comportement de l'apply
suivant et de résoudre le problème via un import de cette même ressource.
- Supprimer du State Terraform l'enregistrement DNS correspondant à
app2
à l'aide de la commandeterraform state rm
. - Observer le contenu du state Terraform (
cat terraform.tfstate
) - Relancer un
terraform apply
- Que se passe-t-il et pourquoi ?
- Importer dans le state Terraform l'enregistrement DNS ayant été supprimé précédemment à l'aide de la commande
terraform import
.
Aide:
L'objectif de cet exercice est de gérer une ressource (une zone DNS) déjà existante avec Terraform plutôt que de simplement importer ses attributs via une data source. Nous expérimenterons une méthode qui permet de faciliter l'écriture de la spec de la ressource sans l'impacter par des changements involontaires.
- Créer une ressource
aws_route53_zone
générique:resource "aws_route53_zone" "my_zone" { name = "unknown" vpc { vpc_id = "unknown" } }
- Importer la ressource à l'aide de la commande
terraform import
sachant que l'ID de la zone DNS est le même que dans les exercices précédents. Il est aussi possible de créer une output de la data sourceaws_route53_zone
. - Lancer un
terraform plan
et observer les changements prévus - Modifier la ressource
aws_route53_zone.my_zone
pour que le plan n'effectue pas de modification. Il n'est pas obligatoire de réécrire l'ensemble des attributs de la ressource. En renseignant uniquement les attributsRequired
, Terraform sera capable d'inclure la totalité des informations dans le state. - Supprimer la data source
aws_route53_zone.my_zone
et modifier en conséquence la ressourceaws_route53_record.my_app
pour que celle-ci utilise les attributs de la ressource nouvellement importée.
Aide:
L'objectif de cet exercice est d'observer le comportement de Terraform lorsqu'une ressource présente dans le state est supprimée sans passer par Terraform.
-
Lancer le script delete_route53_record.sh permettant de supprimer l'enregistrement DNS
app2.student-<N>.com
.$ chmod +x delete_route53_record.sh $ ./delete_route53_record.sh HOSTED_ZONE_ID: ... SUDENT_NUMBER: ... ...
-
Relancer un
terraform apply
. Que se passe-t-il ?
-
Ajouter un tag ayant pour valeur
Name = "student-<N>.com"
à la ressourceaws_route53_zone
-
Dans un fichier
vars.tf
, créer la variable suivante:variable "tags" { description = "A map of tags to add to resources" type = map(string) default = { "Environment" = "Development" "Owner" = "student-<N>" } }
-
Utiliser la fonction
merge
pour fusionner les tags génériques de la variabletags
au tag de la ressourceaws_route53_zone
.
Aide:
L'objectif de cet exercice est d'écrire un test unitaire pour le code Terraform.
Dans un nouveau fichier nommé vars.tftest.hcl
, écrire un test permettant de vérifier que la variable tags
ne contient pas une valeur ayant un caractère spécial pour la clé Environment
.
Aide:
- Tests
- Fonction: regexall
- Fonction: length
- Il est possible d'utiliser
terraform console
pour tester les expressions - Regex à utiliser:
[^A-Za-z0-9]
-
Ajouter un tag
Test = true
à la variabletags
du fichiervars.tf
-
Utiliser la lifecycle policy
ignore_changes
pour ignorer l'ajout ou l'enlèvement de tags sur la ressourceaws_route53_zone
. -
Lancer un
terraform apply
et vérifier que le tag n'est pas ajouté
Aide:
-
Utiliser la lifecycle policy
prevent_destroy
pour empêcher la destruction de la ressourceaws_route53_zone
-
Lancer un
terraform destroy
et vérifier que la ressource n'est pas détruite. Observer le comportement
Aide:
Utiliser la commande terraform destroy
pour détruire l'ensemble des ressources créées durant ce TP.
Aide: