Déployer une infrastructure cloud est un projet qui peut (et doit !) se penser comme du code. En effet, une rigueur dans le nommage des ressources est particulièrement importante et nous aurons certainement plusieurs environnements à créer (développement, qualification, production…). Nous allons donc éviter des tâches répétitives et sécuriser ce processus. En cas de perte d’une partie ou de tout un environnement, il sera également simple de le recréer à l’identique.
Nous allons pour cela utiliser Terraform qui présente l’avantage d’être commun à différents fournisseurs de cloud.
Azure Databricks ne fait pas exception à cette démarche et nous allons illustrer ici le déploiement d’un espace de travail au travers d’un script Terraform.
Installer Terraform dans un environnement Windows
- Télécharger la dernière version de Terraform via le lien suivant : Terraform Versions | HashiCorp Releases
- Créer un dossier : “.terraform” dans le répertoire : C:\Users\username\.terraform
- Dézipper le fichier téléchargé et le déplacer dans le dossier “.terraform”
- Ajouter le chemin: C:\Users\username\.terraform dans la variable d’environnement Path
- Depuis un terminal, tester la commande : terraform –version
Ecrire le fichier main.tf
Le début du fichier va référencer la version de Terraform utilisée.
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "=2.47.0" skip_credentials_validation = false } } }
Pour autoriser le script à prendre la main sur notre souscription Azure, un principal de service sera nécessaire et celui-ci doit disposer des droits de niveau gestion des ressources sur la souscription. Dans un premier temps, une authentification par Azure CLI est aussi envisageable. Les différents modes sont décrits dans la documentation de Terraform.
Depuis un environnement local, nous écrivons la valeur des variables sous la forme nomVar = “valeur” dans un fichier au nom réservé terraform.tfvars.
Les variables sont ensuite déclarées et appelées dans le code à l’aide de la syntaxe suivante :
# VARIABLES variable "subscription_id" {} variable "client_id" {} variable "client_secret" {} variable "tenant_id" {} # Configure the Microsoft Azure Provider provider "azurerm" { features {} subscription_id = var.subscription_id client_id = var.client_id client_secret = var.client_secret tenant_id = var.tenant_id }
Un groupe de ressource sera nécessaire et il se crée avec la syntaxe suivante :
resource "azurerm_resource_group" "rg" { name = "rg-analytics" location = "West Europe" tags = { environment = "dev" project = "unified analytics" } }
Passons maintenant à la création de la ressource Databricks en elle-même, nous ferons référence à l’alias du groupe de ressources défini dans Terraform (ici, “rg”).
resource "azurerm_databricks_workspace" "dbx" { name = "dbx-workspace" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku = "standard" tags = { environment = "dev" project = "unified analytics" } }
La valeur définie dans “sku” correspond à la licence choisie parmi les valeurs standard, premium ou trial. Cette dernière permet de tester la licence Premium pendant 14 jours.
La création d’une ressource Databricks entraine la création conjointe d’un groupe de ressources managé contenant un compte de stockage, un réseau virtuel et un groupe de sécurité réseau.
Si nous avons besoin d’un cluster interactif pour utiliser cette ressource (attention, pourquoi ne pas passer par des automated clusters lancés par Azure Data Factory comme expliqué dans cet article ?).
Les propriétés utilisées sont celles visibles dans la description au format JSON du cluster, depuis l’espace de travail Databricks.
resource "databricks_cluster" "cluster" { cluster_name = "myInteractiveCluster" spark_version = "7.3.x-scala2.12" node_type_id = "Standard_F4s" num_workers = 2 autotermination_minutes = 60 library { pypi { package = "azureml-core" } } }
Lors de la création de ce cluster, nous installons automatiquement la librairie azureml-core, qui correspond au SDK pilotant les ressources d’Azure Machine Learning, souvent évoqué sur ce blog.
Quelques commandes Terraform
Pour initialiser le répertoire contenant les différents fichiers, nous lançons la commande suivante :
terraform init
Un sous-répertoire .terraform se crée alors automatiquement.
Pour analyser le script Terraform et visualiser les éléments qui seront ajoutés ou modifiés :
terraform plan
Par défaut et sans préciser l’argument -var-file, le fichier de secrets terraform.tfvars est utilisé.
Pour appliquer ces transformations :
terraform apply
Une validation sera demandée.
Pour supprimer les ressources définies dans le main.tf :
terraform destroy
A nouveau (et heureusement !), une validation est requise.
Voici donc nos premiers pas sous Terraform et la simplicité d’utilisation vous fera vite oublier les cases à remplir et à cocher de l’interface utilisateur du portail Azure !
Il ne reste plus qu’à intégrer ce script dans un pipeline d’intégration continue, par exemple sous Azure DevOps.