Outils externes
La boîte à outils du développeur
Ce chapitre présente quelques outils qui viennent compléter la boîte à outils du développeur Terraform. Chaque outil vient améliorer l’expérience de développement. Ces outils sont majoritairement utilisés par la communauté Terraform et en entreprise, ils sont souvent vus comme incontournables. Cette liste ne peut bien évidemment pas être exhaustive, de nouveaux outils étant créés régulièrement.
.gitignore
Le fichier .gitignore permet de déclarer à Git quels sont les fichiers qu’il ne doit pas prendre en compte.
Certains fichiers liés à l’utilisation de Terraform peuvent être ignorés sans danger, d’autres doivent être ignorés, comme le fichier de state, pour éviter de divulguer sur un repository Git des données sensibles.
Voici un exemple de fichier .gitignore, adapté au développement Terraform, tel qu’il est recommandé par GitHub :
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
.tfstate.
# Crash log files
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data
*.tfvars
*.tfvars.json
# Ignore transient lock info files created by terraform apply
.terraform.tfstate.lock.info
# Include tfplan files to ignore the plan output of command
tfplan
# Ignore CLI configuration files
.terraformrc
terraform.rc
Le contenu de ce fichier peut être déposé à la racine de chaque projet Git contenant du code Terraform, ou dans le répertoire $HOME de l’utilisateur pour être utilisé de manière globale.
Git hooks
La commande terraform fmt permet de formater le code source des fichiers *.tf (cf. chapitre Architecture et CLI Terraform - Formatage du code source avec terraform fmt).
Un Git hook sous la forme d’un fichier .git/hooks/pre-commit permet d’exécuter le formatage du code juste avant le git commit, afin de s’assurer d’avoir toujours du code bien formaté :
#!/bin/sh
# getting list of created or updated files from the git index
FILES=$(git diff -cached -name-only -diff-filter=ACMR "*.tf")
if [ -n "$FILES" ]; then
# format updated files without outputing file list
terraform fmt -list=false $FILES
# add all files to the index
echo "$FILES" | xargs git add
fi
Il est aussi possible d’exécuter un terraform fmt -check dans un hook pour valider les fichiers modifiés plutôt que de forcer le formatage :
#!/bin/sh
# getting list of created or updated files from the git index
FILES=$(git diff -cached -name-only -diff-filter=ACMR "*.tf")
if [ -n "$FILES" ]; then
# format updated files
terraform fmt -check $FILES
# exit-code != 0 means that some files...
tfenv
Lorsque l’on travaille sur plusieurs projets différents, tous n’utilisent pas forcément la même version de Terraform.
Changer de version n’est alors pas facile, il faut installer plusieurs versions du binaire Terraform et être capable d’en changer rapidement.
tfenv se veut être une réponse à ces problèmes. tfenv se définit comme un gestionnaire de version de Terraform, inspiré par l’outil rbenv. Il est disponible sur Github à l’adresse https://github.com/tfutils/tfenv et il est développé par la communauté open source.
tfenv est un ensemble de scripts shell à positionner dans le $PATH. Le premier script tfenv permet alors d’installer une version de Terraform en utilisant la commande tfenv install <version>, <version> pouvant valoir latest ou un numéro de version comme 1.6.8. tfenv télécharge la version de Terraform demandée directement depuis le site web de HashiCorp et la stocke dans un répertoire qui lui est propre. Pour sélectionner une version de Terraform à utiliser, il faut ensuite exécuter la commande tfenv use <version>. Lors de l’exécution de cette commande, si la version précisée de Terraform n’est pas encore installée, elle le sera automatiquement.
Le second script est nommé terraform...
tflint
Pendant l’écriture de code Terraform, la commande terraform validate permet de vérifier la bonne utilisation de la syntaxe du code ainsi que la bonne utilisation des variables.
La commande terraform fmt permet de vérifier le bon formatage du code avec l’option -check.
Ces deux commandes de vérification sont essentielles, mais le plus souvent ne sont pas suffisantes.
tflint est un linter, un outil permettant d’analyser le code source et de détecter des problèmes ou erreurs qu’il contient.
Pour compléter terraform validate, tflint peut détecter l’utilisation de syntaxes dépréciées de Terraform, des déclarations de variable ou de locals non utilisées. Là où l’intérêt principal de tflint réside, c’est dans sa capacité à vérifier l’implémentation de bonnes pratiques comme les conventions de nommage, ou la documentation systématique des variable et outputs. tflint se veut également être un outil configurable, pour personnaliser les règles qu’il exécute.
1. Installation
tflint est disponible sur GitHub à l’URL https://github.com/terraform-linters/tflint.
La procédure d’installation de tflint est décrite dans le README.md, elle consiste en la récupération du binaire compilé tflint et en son installation et mise à disposition dans le $PATH.
2. Utilisation
La commande tflint parcourt l’ensemble des fichiers .tf présents dans le répertoire courant et affiche les erreurs détectées....
terraform-docs
terraform-docs (https://terraform-docs.io) est un outil permettant de générer la documentation de modules Terraform, dans les formats markdown ou asciidoc. La documentation ainsi générée peut alors être archivée avec le code du module, sous la forme d’un fichier README.md par exemple, pour que les développeurs souhaitant utiliser le module en prennent connaissance.
terraform docs liste principalement les inputs et outputs du module, en parcourant les définitions de variable et output, ainsi que les provider utilisés dans le code du module et leurs numéros de version éventuels.
Il est aussi possible d’ajouter à la documentation des exemples d’utilisation du module, ainsi que du texte descriptif.
1. Installation
terraform-docs est disponible sur GitHub à l’URL https://github.com/terraform-docs/terraform-docs, ou via son propre site web https://terraform-docs.io.
La procédure d’installation est décrite dans le README.md, elle consiste en la récupération du binaire compilé terraform-docs et en son installation et mise à disposition dans le $PATH. terraform-docs peut également être installé via Homebrew pour les utilisateurs de MacOS ou Linux, via ou Chocolatey pour les utilisateurs de Windows.
2. Utilisation
Dans le code d’un module, terraform-docs s’utilise...
Checkov
Checkov (https://www.checkov.io) est un outil de scan de code d’infrastructure, écrit en Python, qui permet de détecter la présence de mauvaises configurations. Il permet de vérifier des règles de bonnes pratiques et de sécurité avant que le code ne soit appliqué.
Checkov supporte plusieurs outils d’IaC, il peut analyser le code Terraform, mais aussi le code CloudFormation ou Helm/Kubernetes par exemple.
Pour Terraform, Checkov implémente plus de 2000 policies qui contrôlent chacune une règle. Les policies exécutées par Checkov peuvent être personnalisées, il est possible d’implémenter ses propres policies. Plus de 1000 de ces policies concernent AWS, près de 400 policies sont implémentées pour Azure, 200 sont implémentées pour GCP. Quelques policies sont également implémentées pour AliCloud et Yandex Cloud.
Checkov peut être facilement intégré dans un pipeline de CI/CD, pour vérifier le code.
1. Installation
Checkov s’installe depuis le dépôt de packages python PyPI, avec la commande pip install checkov. Il est aussi possible de l’installer depuis Homebrew pour les utilisateurs macOS ou Linux.
Checkov est aussi disponible sous la forme d’une image Docker nommée bridgecrew/checkov. Cette image est principalement utilisée pour intégrer Checkov à des pipelines de CI/CD.
2. Exécution
Checkov scanne les plans d’exécution Terraform au format JSON, mais peut également scanner les fichiers *.tf. L’exemple ci-dessous présente le scan d’un fichier de plan.
L’exécution se fait donc en trois commandes :
$ terraform plan -out=tfplan
$ terraform show -json tfplan > tfplan.json
$ checkov -f tfplan.json
Voici...
TerraGrunt
TerraGrunt est un outil dont le but est de limiter la répétition de certains éléments dans le code Terraform. L’outil est disponible à l’adresse suivante : https://terragrunt.gruntwork.io/.
TerraGrunt est particulièrement adapté aux approches Git mono-repo, dans lesquelles de nombreuses configurations peuvent coexister. Il permet de partager des configurations de provider, de backend et de variables, pour faciliter la maintenance du code.
La configuration de TerraGrunt s’écrit dans le langage HCL. Les développeurs Terraform ne sont donc pas perdus à son usage.
1. Installation
L’installation de TerraGrunt est documentée à cette adresse : https://terragrunt.gruntwork.io/docs/getting-started/install/.
Elle se fait en téléchargeant le binaire terragrunt depuis le repository GitHub du projet : https://github.com/gruntwork-io/terragrunt/releases et en le déposant dans un répertoire appartenant au $PATH de l’utilisateur. TerraGrunt est aussi disponible dans certains packages managers, Chocolatey pour Windows et Homebrew pour macOS et Linux.
TerraGrunt est correctement installé si la commande terragrunt --version s’exécute correctement :
$ terragrunt --version
terragrunt version v0.58.12
2. Utilisation
Le CLI terragrunt propose les mêmes commandes que le CLI terraform, mais interprète les fichiers terragrunt.hcl avant de passer la main à terraform.
La commande terragrunt init exécute les opérations spécifiques à TerraGrunt, avant d’exécuter terraform init. Il en est de même pour terragrunt plan et terragrunt apply.
Une commande terragrunt run-all permet d’exécuter TerraGrunt sur un ensemble de répertoires : terragrunt run-all apply.
Dans le détail, TerraGrunt utilise OpenTofu pour exécuter les commandes Terraform. Les commandes exécutées sont donc tofu *.
L’utilisation de TerraGrunt est illustrée ici avec deux cas simples :
-
l’héritage de valeurs variables entre répertoires de code ;
-
la génération dynamique de la configuration du provider et du backend.
Héritage de variables
L’héritage de variables est une mécanique assez simple...
Autres outils notables
Ce chapitre a présenté quelques outils sélectionnés pour améliorer le workflow de développement Terraform, sans chercher à être exhaustif et en évidant les redondances. D’autres outils très utilisés existent également, et viennent remplacer l’un ou l’autre des outils présentés dans ce chapitre. Ces outils sont listés et présentés rapidement dans cette dernière section.
Trivy
Trivy (https://aquasecurity.github.io/trivy/) est un outil de scan de vulnérabilités. Il est avant tout conçu pour détecter les versions de packages contenant des vulnérabilités dans des containers. Une de ses fonctionnalités est le scan de fichiers de configuration Terraform, pour détecter de mauvaises pratiques de configuration.
Dans cet usage, Trivy est similaire à Checkov et peut alors le remplacer.
OPA (Open Policy Agent)
OPA (https://www.openpolicyagent.org) est un outil d’exécution de Policies. Les Policies sont écrites dans un format de fichier Rego. Les Policies sont exécutées sur un plan d’exécution Terraform, qui doit être exporté au format JSON.
OPA est plus souple que Trivy ou Checkov, car il permet d’exprimer des Policies qui vont au-delà de vérifications de sécurité....
Conclusion
Ce chapitre a présenté quelques outils open source qui viennent compléter Terraform. Cette liste n’est pas exhaustive, mais présente les outils que l’on retrouve le plus souvent.
Le dernier chapitre de ce livre vous donnera les liens et les ressources pour faire votre veille et découvrir les nouveaux outils qui sont développés tous les jours. Je vous donne aussi les ressources à suivre pour être au courant des évolutions de votre nouvel outil préféré : Terraform.