Provisioning Terraform
Cette page décrit en détail le provisionnement de l'infrastructure Azure via Terraform pour le projet AudioProthèse+.
Chaque composant est déployé de manière déclarative, avec des permissions explicites et une organisation modulaire, en accord avec les bonnes pratiques de production.
Vue d’ensemble du provisioning
Le code Terraform provisionne l’ensemble des briques suivantes :
| Composant | Description |
|---|---|
| AKS | Cluster Kubernetes managé avec Workload Identity et OIDC |
| ACR | Azure Container Registry connecté à AKS |
| Azure Key Vault | Pour la gestion des secrets (RBAC activé) |
| Azure DNS | Zone publique utilisée pour le routage et les certificats |
| OIDC Federation | Fédère un SA Kubernetes avec Azure AD |
| Helm Charts | Déploiement de ArgoCD. |
| Manifests Kubernetes | ClusterIssuer, Ingress, ESO CRD. injectés via kubectl_manifest |
Cluster AKS
Le cluster est déployé avec :
- Managed Identity activée (SystemAssigned)
- OIDC + Workload Identity (
oidc_issuer_enabled = true) - Web App Routing intégré avec liaison à la zone DNS
- Un pools de nœuds default (2 nœuds, D2_v2)
resource "azurerm_kubernetes_cluster" "aks" {
...
workload_identity_enabled = true
oidc_issuer_enabled = true
web_app_routing {
dns_zone_ids = [azurerm_dns_zone.audioprothese_ovh.id]
}
}
Azure Container Registry (ACR)
Le registre ACR est privé et configuré avec :
- Rôle
AcrPullassigné au kubelet identity du cluster
resource "azurerm_role_assignment" "acr_pull" {
principal_id = azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id
role_definition_name = "AcrPull"
}
Azure Key Vault
Le Key Vault est créé avec :
- RBAC activé
- Soft delete actif (7 jours)
- Rôle
Key Vault Secrets Userassigné au kubelet AKS
enable_rbac_authorization = true
purge_protection_enabled = false
Azure DNS
La zone DNS publique audioprothese.ovh est gérée dans Azure et permet :
- Le routage via Web App Routing (AKS)
- Les défis DNS-01 (cert-manager)
Deux rôles DNS Zone Contributor sont assignés :
- Kubelet Identity (ExternalDNS)
- WebAppRouting Identity (ingress cert-manager)
Fédérations OIDC (Workload Identity)
Un SA Kubernetes (workload-identity-sa) est fédéré avec Azure AD :
resource "azurerm_federated_identity_credential" "ESOFederatedIdentity" {
issuer = azurerm_kubernetes_cluster.aks.oidc_issuer_url
subject = "system:serviceaccount:default:workload-identity-sa"
}
Cela permet à des pods d’assumer un rôle Azure via OIDC sans secrets.
Déploiements Helm & Manifests
Les composants suivants sont déployés avec helm_release et kubectl_manifest :
| Composant | Type | Description |
|---|---|---|
| ArgoCD | Helm | Helm chart ArgoCD |
| OpenMRS | Manifest | Ingress OpenMRS |
| ESO | Manifest | CRD External Secret Operator |
| cert-manager | Manifest | CRD cert-manager |
Configuration Terraform & Providers
Version & providers requis
Le projet est verrouillé sur des versions spécifiques de Terraform et de ses providers pour garantir une reproductibilité et une stabilité maximales dans le pipeline CI/CD.
terraform {
required_version = "=1.11.4"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=4.27.0"
}
helm = {
source = "hashicorp/helm"
version = "2.17.0"
}
kubectl = {
source = "gavinbunney/kubectl"
version = "1.19.0"
}
ovh = {
source = "ovh/ovh"
version = "2.2.0"
}
}
backend "azurerm" {
resource_group_name = "rg-openmrscore-prod"
storage_account_name = "openmrscoreprodsa01"
container_name = "tfstate-prod"
key = "terraform.tfstate"
}
}
⚠️ Le backend est propre à chaque environnement. Il est configuré manuellement dans Azure (Cf Boostrap Azure).
Providers configurés
| Provider | Usage principal |
|---|---|
azurerm |
Provisionnement des ressources Azure (AKS, ACR, DNS, Key Vault, etc.) |
helm |
Déploiement des charts Helm sur le cluster AKS (ArgoCD) |
kubectl |
Application de manifestes Kubernetes (ClusterIssuer, Ingress, etc.) |
Provider Azure
provider "azurerm" {
features {}
}
Provider Helm
Connexion directe au cluster via les credentials générés par AKS :
provider "helm" {
kubernetes {
host = azurerm_kubernetes_cluster.aks.kube_config.0.host
client_certificate = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.client_certificate)
client_key = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.client_key)
cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.cluster_ca_certificate)
}
}
Provider Kubectl
Utilisé pour appliquer des manifestes YAML (non Helm) comme les ClusterIssuer, Ingress, etc.
provider "kubectl" {
host = azurerm_kubernetes_cluster.aks.kube_config.0.host
cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.cluster_ca_certificate)
client_certificate = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.client_certificate)
client_key = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.client_key)
load_config_file = false
}
Paramétrage via variables
Les fichiers variables.tf permettent de configurer dynamiquement l’environnement :
variable "env" {
default = "prod"
}
variable "dns_zone_name" {
default = "audioprothese.ovh"
}
Bonnes pratiques appliquées
- Tous les composants utilisent RBAC et identités managées
- Les accès sont précis et limités (least privileges)
- La séparation des environnements est stricte (
prod,dev, etc.) - L'utilisation de
depends_onassure l’ordre correct de création
Liens utiles
Documentation maintenue par l’équipe DevOps – Projet AudioProthèse+