Terraform sur Microsoft Azure | 2 – Notions fondamentales
« Je suis ingénieur logiciel senior et architecte du Cloud, vivant à Paris et travaillant pour Microsoft depuis 2015. Avant de rejoindre Microsoft, j’ai été développeur et formateur pendant 7 ans, principalement sur les technologies Microsoft .NET, Web et cloud. »
Terraform sur Microsoft Azure | 2 - Notions fondamentales
Ce billet de blog fait partie d’une série d’articles sur l’utilisation de Terraform sur Microsoft Azure :
- Terraform sur Microsoft Azure – Partie 1 : Introduction
- Terraform sur Microsoft Azure – Partie 2 : Principes de base
- Terraform sur Microsoft Azure – Partie 3 : Gestion de l’état des déploiements
- Terraform sur Microsoft Azure – Partie 4 : Modularisation
- Terraform sur Microsoft Azure – Partie 5 : Tests d’infrastructure
- Terraform sur Microsoft Azure – Partie 6 : Intégration continue avec Azure Pipeline
- Terraform sur Microsoft Azure – Partie 7 : Déploiement continu avec Azure Pipeline
Dans cette partie, vous sera présenté les aspects fondamentaux de Terraform et comment démarrer facilement pour déployer une infrastructure sur Azure.
Télécharger et installer Terraform
Terraform est basé sur une architecture de plugins. Pour commencer, téléchargez le fichier exécutable principal et installez-le sur votre machine. Celui-ci se chargera de télécharger le ou les plugins adaptés en fonction des plateformes/fournisseurs avec lesquels vous travaillez. L’installation est très simple : décompressez le fichier binaire que vous avez téléchargé et placez-le de sorte qu’il soit accessible depuis votre PATH.
Pour vérifier votre installation, exécutez la commande terraform –version:
PS C:\workspaces\hello-tf-azure> terraform --version Terraform v0.12.7
Créer un projet Terraform basique
Un projet/contexte Terraform est spécifique à un répertoire. Créez un répertoire et nommez-le hello-tf-azure. Ajoutez un fichier main.tf à ce répertoire, avec le contenu suivant :
provider "azurerm" { version = "~>1.33" }
resource "azurerm_resource_group" "rg" { name = "hello-tf-azure-rg" location = "francecentral" }
Ce fichier est vraiment simple :
- la directive provider indique que nous voulons utiliser la version 1.33 du fournisseur azurerm, c’est-à-dire que nous allons utiliser le fournisseur Terraform Azure Resource Manager, l’un des plugins disponibles pour Terraform qui permet de déployer des ressources sur Azure. Il faut toujours préciser la version du fournisseur que vous voulez utiliser, afin d’éviter des mises à niveau implicites de versions entre les exécutions. Pour savoir comment préciser la version, consultez cette page.
- la directive resource indique que nous allons créer une nouvelle ressource, du type azurerm_resource_group avec deux paramètres name et location. Ainsi, Terraform crée un groupe de ressources nommé hello-tf-azure-rg dans la région Azure France Central.
Remarque : si vous utilisez Visual Studio Code, vous pouvez télécharger les extensions Azure Terraform et Terraform. Ces deux extensions vous aideront à travailler avec Terraform, avec coloration syntaxique et IntelliSense !
Votre premier projet Terraform est terminé ! Voyons comment le déployer sur Microsoft Azure.
Initialisation de Terraform
Tout d’abord, vous devez initialiser le répertoire de votre projet. Pour cela, exécutez la commande terraform init dans le répertoire.
PS C:\workspaces\hello-tf-azure> terraform init Initializing the backend... Initializing provider plugins... - Checking for available provider plugins... - Downloading plugin for provider "azurerm" (hashicorp/azurerm) 1.33.1... 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. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
L’objectif de cette commande est de télécharger tous les plugins nécessaires pour déployer votre template. Dans ce cas, elle télécharge la version du fournisseur Azure Resource Manager Terraform correspondant au filtre de version que vous avez défini dans la directive provider.
Votre projet est maintenant prêt à être déployé sur Microsoft Azure ! Enfin, presque.
Terraform et authentification Microsoft Azure
Vous devez d’abord gérer l’authentification. Lorsque vous travaillez avec Terraform, vous pouvez vous authentifier sur Microsoft Azure de plusieurs façons :
- Azure CLI : Terraform utilisera simplement vos identifiants Azure CLI pour travailler avec Azure. Dans ce cas Azure CLI doit être installé et vous devez déjà avoir effectué une connexion azure login avant de travailler avec Terraform.
- Azure Managed Service Identity (identités managées) : Terraform peut utiliser une MSI disponible sur la machine virtuelle qui exécute le déploiement.
- Principal de service et certificat client : vous pouvez utiliser un principal de service avec un certificat client affecté.
- Principal de service et clé secrète client : vous pouvez utiliser un principal de service et sa clé secrète client pour vous authentifier.
Remarque : Lorsque vous exécutez le déploiement Terraform sur votre machine, pour des besoins de test/développement, il est plus simple d’utiliser l’authentification Azure CLI. Étant donné qu’elle nécessite une connexion interactive, elle n’est pas recommandée pour l’automatisation. Vous préférerez utiliser l’authentification avec un principal de service, ou mieux encore, avec les identités managées. Ce sujet sera abordé plus tard dans cette série de billets de blog.
Déploiement de Terraform
Bien, vous êtes donc connecté à votre compte Azure. Vous pouvez maintenant effectuer un déploiement en utilisant la commande terraform apply :
PS C:\workspaces\junk\hello-tf-azure> terraform apply An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + creat Terraform will perform the following actions: # azurerm_resource_group.rg will be created + resource "azurerm_resource_group" "rg" { + id = (known after apply) + location = "francecentral" + name = "hello-tf-azure-rg" + tags = (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:
Cette commande se connectera à votre compte Azure pour vérifier quelles ressources existent déjà et générer un plan d’exécution. Elle affiche les actions sur le point d’être exécutées sur votre compte Azure. Dans ce cas particulier, elle créera un groupe de ressources. Tapez yes à l’invite puis Enter. Le déploiement démarre…
Remarque : pendant le déploiement, vous pouvez explorer la palette de commandes de Visual Studio Code pour découvrir toutes les commandes Terraform disponibles avec les extensions :
Le déploiement doit être terminé maintenant :
azurerm_resource_group.rg: Creating... azurerm_resource_group.rg: Creation complete after 2s [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Si vous regardez dans votre répertoire, un fichier d’état nommé terraform.tfstate a été généré. Ce fichier est important car il contient toutes les informations d’état relatives aux déploiements sur Azure :
{ "version": 4, "terraform_version": "0.12.7", "serial": 1, "lineage": "9fe982b1-7d77-f5f6-940d-4add634605f4", "outputs": {}, "resources": [ { "mode": "managed", "type": "azurerm_resource_group", "name": "rg", "provider": "provider.azurerm", "instances": [ { "schema_version": 0, "attributes": { "id": "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg", "location": "francecentral", "name": "hello-tf-azure-rg", "tags": {} } } ] } ] }
Remarque : le prochain billet de blog de cette série expliquera en détails comment gérer l’état Terraform et le stocker à distance pour le partager entre les exécutions de déploiement continu et/ou les membres de votre équipe. Pour en savoir plus sur ce sujet, consultez la documentation officielle de Terraform.
Si vous effectuez un autre terraform apply dans votre répertoire, vous verrez que le plan d’exécution n’a pas d’action à exécuter (tout est déjà déployé) :
PS C:\workspaces\hello-tf-azure> terraform apply azurerm_resource_group.rg: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg] Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Travailler avec un plan d’exécution
Il est aussi possible d’exécuter la commande terraform plan avant terraform apply. La commande plan génère un plan d’exécution et permet de le stocker dans un fichier. Ce fichier peut alors être utilisé comme paramètre de la commande apply.
Ajoutons une autre définition de groupe de ressources dans le fichier du modèle Terraform :
provider "azurerm" { version = "~>1.33" } resource "azurerm_resource_group" "rg" { name = "hello-tf-azure-rg" location = "francecentral" } resource "azurerm_resource_group" "rg2" { name = "hello-tf-azure-2-rg" location = "francecentral" }
Et exécutez la commande terraform plan ‑out out.plan comme suit :
PS C:\workspaces\junk\hello-tf-azure> terraform plan -out out.plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. azurerm_resource_group.rg: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg] ------------------------------------------------------------------------ An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # azurerm_resource_group.rg2 will be created + resource "azurerm_resource_group" "rg2" { + id = (known after apply) + location = "francecentral" + name = "hello-tf-azure-2-rg" + tags = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ This plan was saved to: out.plan To perform exactly these actions, run the following command to apply: terraform apply "out.plan".
Terraform vérifie les éléments déjà existants et les actions à exécuter. Dans ce cas, seul le deuxième groupe de ressources doit être créé. Le nouveau plan d’exécution a été sauvegardé dans le fichier out.plan.
Vous pouvez appliquer le plan en exécutant la commande terraform apply « out.plan » :
PS C:\workspaces\hello-tf-azure> terraform apply "out.plan" azurerm_resource_group.rg2: Creating... azurerm_resource_group.rg2: Creation complete after 1s [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. The state of your infrastructure has been saved to the path below. This state is required to modify and destroy your infrastructure, so keep it safe. To inspect the complete state use the `terraform show` command. State path: terraform.tfstate
Le deuxième groupe de ressources a été créé et le fichier d’état local a été mis à jour.
Vous pouvez visualiser l’état en utilisant la commande terraform show dans votre répertoire : PS C:\workspaces\hello-tf-azure> terraform show # azurerm_resource_group.rg: resource "azurerm_resource_group" "rg" { id = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg" location = "francecentral" name = "hello-tf-azure-rg" tags = {} } # azurerm_resource_group.rg2: resource "azurerm_resource_group" "rg2" { id = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg" location = "francecentral" name = "hello-tf-azure-2-rg" tags = {} }
Supprimer l’infrastructure
Enfin, vous pouvez tout supprimer en utilisant la commande terraform destroy :
PS C:\workspaces\junk\hello-tf-azure> terraform destroy azurerm_resource_group.rg2: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg] azurerm_resource_group.rg: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg] An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: - destroy Terraform will perform the following actions: # azurerm_resource_group.rg will be destroyed - resource "azurerm_resource_group" "rg" { - id = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg" -> null - location = "francecentral" -> null - name = "hello-tf-azure-rg" -> null - tags = {} -> null } # azurerm_resource_group.rg2 will be destroyed - resource "azurerm_resource_group" "rg2" { - id = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg" -> null - location = "francecentral" -> null - name = "hello-tf-azure-2-rg" -> null - tags = {} -> null } Plan: 0 to add, 0 to change, 2 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:
Comme pour la commande apply, elle générera un plan d’exécution qui affichera toutes les actions sur le point d’être exécutées. Dans ce cas, la suppression des deux groupes de ressources. yes et Enter pour valider le plan et attendez la fin de l’opération de suppression.
azurerm_resource_group.rg: Destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg] azurerm_resource_group.rg2: Destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg] azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 10s elapsed] azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 10s elapsed] azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 20s elapsed] azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 20s elapsed] azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 30s elapsed] azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 30s elapsed] azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 40s elapsed] azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 40s elapsed] azurerm_resource_group.rg2: Destruction complete after 46s azurerm_resource_group.rg: Destruction complete after 46s Destroy complete! Resources: 2 destroyed.
Conclusion
Vous connaissez maintenant l’essentiel pour démarrer avec Terraform sur Microsoft Azure. Le prochain billet de cette série portera sur la gestion de l’état d’un déploiement avec Terraform.
Partie 3 : Gestion de l’état des déploiements >