Arrêter une base de données SQL Azure quand elle n'est pas utilisée

Arrêter une base de données SQL Azure quand elle n’est pas utilisée

Au 4 juillet 2023, la réponse est Non.

Ils ne le permettent pas. La facturation continuera donc pour votre base de données Azure à partir du jour de sa création. Il n’y a vraiment aucun moyen de mettre en pause / arrêter la facturation de votre base de données Azure SQL.

Source officielle : feedback.azure.com Please add ability to temporarily turn off/on SQL Azure server to pause billing

La réponse officielle de Microsoft semble être “Oui, vous pouvez exporter votre base de données. Supprimez la base de données Azure SQL et cela suspendra la facturation. Ensuite, quand vous en aurez besoin, vous pourrez créer une nouvelle base de données et importer votre BD précédemment exportée.”

Je ne pense pas que ce soit acceptable comme réponse à “Permettez-moi de désactiver temporairement SQL Server pour économiser sur ma facturation”.

Bonjour,

La gestion des coûts d’une base de données Azure SQL Database est une préoccupation légitime, surtout pour les environnements de développement, de test ou les applications avec des plages d’inactivité prévisibles. La bonne nouvelle : Azure propose plusieurs mécanismes natifs pour réduire, voire éliminer les coûts pendant les périodes d’inactivité. Je vais vous présenter toutes les options disponibles avec leurs avantages, limites et implémentations concrètes.

Comprendre la facturation d’Azure SQL Database

Modèles de tarification

Avant de choisir une stratégie d’arrêt, il est essentiel de comprendre comment vous êtes facturé :

Modèle Description Peut être “arrêté” ?
DTU (Database Transaction Unit) Modèle groupé CPU/RAM/IO Non natif
vCore Provisionné Ressources dédiées configurables Oui (pause/resume)
Serverless Mise à l’échelle automatique + pause automatique Oui (automatique)
Hyperscale Pour très grands volumes de données Non
Elastic Pool Ressources partagées entre plusieurs BDD Partiellement

Solution 1 : Azure SQL Database Serverless (recommandée)

La solution la plus élégante et la plus simple est de migrer vers le niveau Serverless. C’est la réponse native d’Azure à votre besoin.

Fonctionnement du niveau Serverless

Le niveau Serverless offre deux caractéristiques clés :

  • Mise à l’échelle automatique : ajuste le nombre de vCores selon la charge (entre un min et un max configurables)
  • Pause automatique : suspend la base de données après une période d’inactivité configurable (minimum 1 heure)

Facturation : vous ne payez que pour le stockage pendant les périodes de pause, et pour les vCores effectivement utilisés pendant l’activité.

Configuration via Azure CLI

# Créer une base de données Serverless
az sql db create \
  --resource-group MonResourceGroup \
  --server mon-serveur-sql \
  --name MaBDD \
  --edition GeneralPurpose \
  --family Gen5 \
  --capacity 2 \
  --compute-model Serverless \
  --auto-pause-delay 60 \
  --min-capacity 0.5

# Modifier une BDD existante vers Serverless
az sql db update \
  --resource-group MonResourceGroup \
  --server mon-serveur-sql \
  --name MaBDD \
  --edition GeneralPurpose \
  --family Gen5 \
  --capacity 2 \
  --compute-model Serverless \
  --auto-pause-delay 120 \
  --min-capacity 0.5

Configuration via PowerShell

# Modifier une base de données existante vers Serverless
Set-AzSqlDatabase `
  -ResourceGroupName "MonResourceGroup" `
  -ServerName "mon-serveur-sql" `
  -DatabaseName "MaBDD" `
  -Edition "GeneralPurpose" `
  -ComputeModel "Serverless" `
  -ComputeGeneration "Gen5" `
  -MinVcore 0.5 `
  -MaxVcore 2 `
  -AutoPauseDelayInMinutes 60

Considérations importantes sur Serverless

  • Latence au réveil (“cold start”) : La première connexion après une pause peut prendre 20 à 30 secondes le temps que la base se réveille. À gérer côté application avec une logique de retry.
  • Non compatible avec : les Elastic Pools, les instances managées, Hyperscale
  • Disponible uniquement en tier General Purpose avec vCores Gen5

Solution 2 : Pause/Resume manuelle (vCore Provisionné)

Pour les bases de données vCore Provisionnées, vous pouvez mettre en pause et reprendre manuellement la base de données.

Note : Cette fonctionnalité est disponible sur le niveau General Purpose et certains tiers premium. Vérifiez la disponibilité pour votre configuration.

Via Azure CLI

# Mettre en pause une base de données
az sql db update \
  --resource-group MonResourceGroup \
  --server mon-serveur-sql \
  --name MaBDD \
  --status Paused

# Reprendre une base de données
az sql db update \
  --resource-group MonResourceGroup \
  --server mon-serveur-sql \
  --name MaBDD \
  --status Online

Via Azure PowerShell

# Mettre en pause
Suspend-AzSqlDatabase `
  -ResourceGroupName "MonResourceGroup" `
  -ServerName "mon-serveur-sql" `
  -DatabaseName "MaBDD"

# Reprendre
Resume-AzSqlDatabase `
  -ResourceGroupName "MonResourceGroup" `
  -ServerName "mon-serveur-sql" `
  -DatabaseName "MaBDD"

Solution 3 : Automatisation avec Azure Automation ou Logic Apps

Pour arrêter et démarrer automatiquement selon un planning, plusieurs options s’offrent à vous.

Option A : Azure Automation avec Runbook PowerShell

# Runbook PowerShell pour pause/resume planifié
param(
    [Parameter(Mandatory=$true)]
    [string]$Action,  # "Pause" ou "Resume"

    [string]$ResourceGroupName = "MonResourceGroup",
    [string]$ServerName = "mon-serveur-sql",
    [string]$DatabaseName = "MaBDD"
)

# Authentification via Managed Identity
Connect-AzAccount -Identity

switch ($Action) {
    "Pause" {
        Write-Output "Mise en pause de $DatabaseName..."
        Suspend-AzSqlDatabase `
            -ResourceGroupName $ResourceGroupName `
            -ServerName $ServerName `
            -DatabaseName $DatabaseName
        Write-Output "Base de données mise en pause avec succès."
    }
    "Resume" {
        Write-Output "Reprise de $DatabaseName..."
        Resume-AzSqlDatabase `
            -ResourceGroupName $ResourceGroupName `
            -ServerName $ServerName `
            -DatabaseName $DatabaseName
        Write-Output "Base de données reprise avec succès."
    }
}

Configurez ensuite deux planifications (Schedules) dans Azure Automation :

  • Pause : tous les jours à 20h00
  • Resume : tous les jours à 7h00

Option B : Azure Logic Apps avec planificateur

  1. Créez une Logic App avec un déclencheur Recurrence
  2. Ajoutez une action HTTP ou utilisez le connecteur Azure SQL
  3. Appelez l’API REST Azure pour pauseer/reprendre :
PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}?api-version=2021-11-01

Body: { "properties": { "status": "Paused" } }

Option C : Script PowerShell via Azure Functions (Timer Trigger)

# function.json
{
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 0 20 * * 1-5"  // Lundi-vendredi à 20h
    }
  ]
}

Solution 4 : Azure SQL Managed Instance (arrêt planifié)

Depuis 2023, Azure SQL Managed Instance supporte également l’arrêt et le démarrage planifiés :

# Arrêter une Managed Instance
az sql mi stop --resource-group MonResourceGroup --name MonInstance

# Démarrer une Managed Instance
az sql mi start --resource-group MonResourceGroup --name MonInstance

# Configurer un planning d'arrêt automatique
az sql mi update \
  --resource-group MonResourceGroup \
  --name MonInstance \
  --instance-pool-name "" \
  --timezone-id "Romance Standard Time"

Comparaison des stratégies d’économie

Stratégie Économies potentielles Complexité Cold Start Cas d’usage idéal
Serverless 60-90% Faible 20-30s Dev/Test, charge variable
Pause manuelle 100% compute Faible ~2 min Hors heures de bureau
Automation planifiée 50-80% Moyenne ~2 min Planning fixe connu
Elastic Pool Variable Moyenne Aucun Plusieurs BDD similaires
Basic/Free tier Coût fixe bas Faible Aucun Très petites BDD

Surveillance et optimisation des coûts

Alertes de coût via Azure Cost Management

# Créer une alerte de budget pour la base de données
az consumption budget create \
  --budget-name "BudgetSQLDatabase" \
  --amount 50 \
  --time-grain Monthly \
  --start-date 2024-01-01 \
  --end-date 2025-01-01 \
  --resource-group MonResourceGroup \
  --notifications '[{"enabled":true,"operator":"GreaterThan","threshold":80,"contactEmails":["[email protected]"],"thresholdType":"Actual"}]'

Métriques à surveiller

# Vérifier les métriques de la base de données
az monitor metrics list \
  --resource "/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Sql/servers/{server}/databases/{db}" \
  --metric "cpu_percent,dtu_consumption_percent,storage" \
  --interval PT1H

En résumé, la solution Serverless avec pause automatique est la plus adaptée pour la majorité des cas d’utilisation car elle automatise complètement la gestion sans intervention manuelle. Si vous avez un planning d’utilisation fixe et prévisible, combinez la pause manuelle avec Azure Automation pour des économies maximales.

Pouvez-vous préciser votre cas d’usage (développement, production, planning d’utilisation) ? Je pourrai ainsi vous recommander la configuration optimale et vous aider à estimer les économies réalisables.