Contexte :
Pour avoir un code fiable il faut que ce dernier soit testé, et que les tests soient automatisés, pour pallier aux différents bugs et aussi aux régressions, très rapidement.
Dans le cas de l’infrastructure as code, nous n’automatisons pas assez nos tests, du aux manques d’outils fiables permettant de tester efficacement notre code.
Une des pratiques de tests qui sont aujourd’hui utilisés est le TDD qui consiste à : écrire un test, faire échouer le test, écrire un code qui permet de passer le tester puis retester.
dans le cas de l’infrastructure as code avec des outils de provisioning comme terraform, cette pratique est un peu plus compliquée à mettre en place.
Les tests Manuel, méthode la plus utilisée pour tester un code d’infrastructure :
En général lorsque nous déployons de l’infrastructure à travers du code, par exemple avec du terraform, pour valider que nous obtenons l’état voulu de notre infrastructure, nous vérifions manuellement soit à travers la console du cloud provider dans lequel nous avons déployé nos ressources soit via ligne de commande.
Cette opération peut devenir très exhaustive, en particulier si nous déployons une infrastructure complexe avec plusieurs composants et des règles de sécurité et d’accés spécifiques, vérifier toute l’infrastructure manuellement peut prendre beaucoup de temps.
Ensuite à chaque correction, nous allons devoir revérifier, à la main, que l’infrastructure est correcte…Terratest nous permet d’automatiser nos tests.
Les tests automatisés : Terratest
Terratest est une librairie qui permet d’automatiser les tests du code de notre infrastructure.
Voici le workflow à utiliser pour écrire nos tests, on s’appuie essentiellement sur du TDD :
1 — On écrit nos tests, dans un fichier [service].go ou service représente le composant cloud dans notre infrastructure que l’on voudrait tester. On lance notre test “go test [service].go”, qui devrait échouer vu que nous n’avons pas encore écrit le code pour notre infrastructure.
2 — On écrit le code terraform qui décrit notre infrastructure.
3 — On relance terratest pour constuire l’infrastructure et relancer les tests. Terratest exécute d’abord un “terraform plan” puis exécute les tests.
4 — L’infrastructure de test peut etre détruite via “terraform destroy”
Conclusion
Il y a plusieurs avantages à automatiser les tests de terraform comme : faire des tests de bout en bout, valider les AMI déployées, Documenter l’infrastructure et tester plus rapidement une infrastructure complexe…
La prise en main de terratest est assez simple, en effet le repo git et la documentation offrent des exemples très clairs :
- https://blog.gruntwork.io/terragrunt-how-to-keep-your-terraform-code-dry-and-maintainable-f61ae06959d8
- https://terratest.gruntwork.io/docs/
- https://github.com/gruntwork-io/terratest
GruntWork, l’entreprise américaine qui développe terratest, offre aussi un outil pour maintenir plus facilement du code terraform : Terragrunt, la documentation de cet outil est accessible ici : https://terragrunt.gruntwork.io/