Terraform-infrastructure-cloud

Terraform : déployer et gérer son infrastructure cloud de façon déclarative

Pourquoi Terraform ?

Avec le développement des services de cloud computing et le rapprochement des équipes de développement et d’infrastructure (le fameux concept « DevOps »), un besoin d’outillage au niveau du déploiement d’une infrastructure et de sa gestion se fait ressentir. Deux options possibles pour ces opérations : la possibilité de passer simplement par l’interface web des différents services de cloud, ou bien, dans un mode plus automatisé, la possibilité d’utiliser les scripts et API de déploiement.

Le problème de la première solution, au-delà des nombreuses opérations humaines successives, est le manque de traçabilité. A moins de faire une documentation complète et de la maintenir à jour à chaque modification de l’infrastructure, impossible de savoir de manière fiable qui a fait quoi sur l’infrastructure déployée. Les scripts de déploiement quant à eux, bien qu’ils puissent être versionnés dans un gestionnaire de code source (comme Git ou TFS), peuvent parfois s’avérer complexes à écrire et à maintenir, en raison notamment de la multitude de cas à gérer (déployer un service, le modifier, le supprimer) et des bugs que cela induit.

La solution, c’est Terraform : cet outil édité par HashiCorp sous licence libre vous permet de décrire entièrement votre infrastructure cloud de façon déclarative. On parle ici « d’infrastructure as code ». Du code ? Mais quelle différence avec mes scripts de déploiement ? Et bien la différence c’est que le code que vous allez produire pour décrire votre infrastructure ne sera pas le code utilisé pour la déployer, il n’en sera que le paramètre d’entrée. En effet, avec Terraform pas besoin de décrire comment vous allez déployer vos services, ici on décrit simplement l’état final que l’on attend : je veux une VM, avec un disque dur, une carte réseau, etc…

 

Fonctionnement

Une fois votre architecture décrite sous forme de fichiers plats grâce au langage HCL (HashiCorp Configuration Language) dont la syntaxe est proche du JSON, il ne vous reste plus qu’à la tester sur votre environnement cible avec la commande « Terraform plan ». Terraform va alors générer le code nécessaire au déploiement de l’infrastructure déclarée dans vos fichiers et vous faire un récapitulatif de ce qui va changer sur votre environnement. Vous n’avez alors plus qu’à vérifier les modifications, puis demander à Terraform de déployer avec la commande « Terraform apply ». Il s’occupera alors de vous instancier tous les services que vous avez décrits.

Besoin de modifier un service ? Si vous vous apercevez que votre serveur de base de données est sous-dimensionné et qu’il faut changer le niveau de facturation de celui-ci, une petite modification dans vos fichiers suivie d’un « Terraform apply » suffit. Le service sera modifié.

Supprimez un service de vos déclarations, il sera également supprimé dans le cloud.

Vos fichiers Terraform sont donc le miroir de votre infrastructure déployée. Ceci implique que toute modification faite sans passer par Terraform sera perdue la prochaine fois que vous voudrez appliquer une configuration Terraform, sauf si vous avez répercuté les changements dans vos fichiers Terraform.

Une autre utilisation est la possibilité de déployer autant d’infrastructures identiques que vous le souhaitez. Le déclaratif vous garantit en effet que peu importe le nombre de fois où vous déployez votre architecture, elles seront toutes identiques. Dans le cadre d’environnements de développement / qualification / préproduction / production, vous pouvez bien sur utiliser des fichiers de configurations propres à chaque environnement, vous n’avez pas forcément besoin de déployer trois frontaux sur un environnement de recette par exemple.

 

Cas pratique : déployer une base de données sur Microsoft Azure

Microsoft propose sur son offre de cloud public un découpage comme suit : un répertoire Azure contient une ou plusieurs souscriptions (une souscription = une facturation), qui contiennent des groupes de ressources (sortes de conteneurs métier), eux-mêmes contenant les services déployés. Le point d’entrée de Terraform est le groupe de ressources, c’est-à-dire qu’il n’est pas nécessaire de déclarer dans vos fichiers Terraform tous les groupes de ressources de votre souscription, mais uniquement celui sur lequel vous voulez travailler.

Il vous faudra au préalable installer la CLI Azure, permettant à Terraform d’interagir avec Azure grâce à Azure Resource Manager (AzureRM). Une fois la CLI installée, lancez une invite de commande PowerShell et tapez « az login » pour vous connecter à vos souscriptions Azure. Enfin, téléchargez Terraform depuis le site officiel et décompressez l’exécutable dans le dossier contenant vos fichiers Terraform. Tapez ensuite « .\terraform.exe init » pour télécharger le plugin Azure de Terraform.

Créez un fichier « test.tf » et collez-y le code suivant en changeant à minima les valeurs en gras :

provider « azurerm » { }

 

resource « azurerm_resource_group » « test » {

name = « terraform-test-group »

location = « West Europe »

}

 

resource « azurerm_sql_server » « test » {

name = « terraform-test-sql »

resource_group_name = « ${azurerm_resource_group.test.name} »

location = « West Europe »

version = « 12.0 »

administrator_login = « admin-login »

administrator_login_password = « MyP4$sW0rd »

}

 

resource « azurerm_sql_database » « test » {

name = « MyDatabase »

resource_group_name = « ${azurerm_resource_group.test.name} »

location = « West Europe »

server_name = « ${azurerm_sql_server.test.name} »

}

 

La première ligne indique à Terraform que nous allons déployer sur Microsoft Azure. Le premier bloc « resource » déclare un groupe de ressources Azure. Le second bloc « resource » est la définition d’un serveur SQL. Enfin, le dernier bloc représente notre de base de données.

Dans votre invité de commande PowerShell, tapez « .\terraform.exe plan ». L’outil va alors faire un récapitulatif de ce qu’il va créer, mettre à jour, ou supprimer sur votre souscription Azure.

 

Terraform : déployer et gérer son infrastructure cloud de façon déclarative

 

Si vous êtes d’accord avec le plan, faites un « .\terraform.exe apply ». Une fois les services créés, vous pouvez les modifier en éditant votre fichier « test.tf » et en relançant la commande « .\terraform.exe apply ». Pour supprimer toutes vos ressources, faites un « .\terraform.exe destroy ».

En deux minutes montre en main, vous avez déployé un serveur MSSQL avec une base de données. Il ne vous reste plus qu’à imaginer le gain de temps sur une architecture plus complexe.

 

Alexis DELUZE

Architecte technique