Tutoriel : Importer des fichiers SQL BACPAC avec des modèles ARM

Découvrez comment utiliser les extensions Azure SQL Database pour importer un fichier BACPAC avec des modèles ARM (Azure Resource Manager). Les artefacts de déploiement correspondent à tous les fichiers, en plus des principaux fichiers modèles requis pour effectuer un déploiement. Le fichier BACPAC est un artefact.

Dans ce tutoriel, vous allez créer un modèle pour déployer un serveur SQL logique et une base de données unique, et importer un fichier BACPAC. Pour plus d’informations sur la façon de déployer des extensions de machine virtuelle Azure à l’aide de modèles ARM, consultez Tutoriel : Déployer des extensions de machine virtuelle avec des modèles ARM.

Ce tutoriel décrit les tâches suivantes :

  • Préparer un fichier BACPAC
  • Ouvrir un modèle de démarrage rapide
  • Modifier le modèle
  • Déployez le modèle.
  • Vérifier le déploiement

Si vous ne disposez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Prérequis

Pour effectuer ce qui est décrit dans cet article, vous avez besoin des éléments suivants :

Préparer un fichier BACPAC

Un fichier BACPAC est partagé dans GitHub. Pour créer le vôtre, consultez Exporter une base de données d’Azure SQL Database vers un fichier BACPAC. Si vous choisissez de publier le fichier sur votre propre emplacement, vous devez mettre à jour le modèle plus tard dans ce didacticiel.

Le fichier BACPAC doit être stocké dans un compte de stockage Azure avant de pouvoir être importé avec un modèle ARM. Le script PowerShell suivant prépare le fichier BACPAC en suivant les étapes ci-dessous :

  • Télécharger le fichier BACPAC.
  • Création d’un compte Azure Storage.
  • Créer un conteneur d’objets blob dans un compte de stockage
  • Télécharger le fichier BACPAC dans le conteneur.
  • Afficher la clé du compte de stockage, l’URL de l’objet blob, le nom du groupe de ressources et l’emplacement.
  1. Sélectionnez Essayer pour ouvrir Cloud Shell. Ensuite, copiez et collez le script PowerShell suivant dans la fenêtre de l’interpréteur de commandes.

    $projectName = Read-Host -Prompt "Enter a project name that is used to generate Azure resource names"
    $location = Read-Host -Prompt "Enter the location (i.e. centralus)"
    
    $resourceGroupName = "${projectName}rg"
    $storageAccountName = "${projectName}store"
    $containerName = "bacpacfiles"
    $bacpacFileName = "SQLDatabaseExtension.bacpac"
    $bacpacUrl = "https://github.com/Azure/azure-docs-json-samples/raw/master/tutorial-sql-extension/SQLDatabaseExtension.bacpac"
    
    # Download the bacpac file
    Invoke-WebRequest -Uri $bacpacUrl -OutFile "$HOME/$bacpacFileName"
    
    # Create a resource group
    New-AzResourceGroup -Name $resourceGroupName -Location $location
    
    # Create a storage account
    $storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName `
                                           -Name $storageAccountName `
                                           -SkuName Standard_LRS `
                                           -Location $location
    $storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName `
                                                  -Name $storageAccountName).Value[0]
    
    # Create a container
    New-AzStorageContainer -Name $containerName -Context $storageAccount.Context
    
    # Upload the BACPAC file to the container
    Set-AzStorageBlobContent -File $HOME/$bacpacFileName `
                             -Container $containerName `
                             -Blob $bacpacFileName `
                             -Context $storageAccount.Context
    
    Write-Host "The project name:        $projectName `
      The location:            $location `
      The storage account key: $storageAccountKey `
      The BACPAC file URL:     https://$storageAccountName.blob.core.windows.net/$containerName/$bacpacFileName `
      "
    
    Write-Host "Press [ENTER] to continue ..."
    
  2. Enregistrez la clé du compte de stockage, l’URL du fichier BACPAC, le nom du projet et l’emplacement. Vous utiliserez ces valeurs quand vous déploierez le modèle plus loin dans ce tutoriel.

Ouvrir un modèle de démarrage rapide

Le modèle utilisé dans ce tutoriel est stocké dans GitHub.

  1. À partir de Visual Studio Code, sélectionnez Fichier>Ouvrir un fichier.

  2. Collez l’URL suivante dans Nom de fichier :

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Sélectionnez Ouvrir pour ouvrir le fichier.

    Deux ressources sont définies dans le modèle :

    • Microsoft.Sql/servers. Consultez la référence de modèle.

    • Microsoft.SQL.servers/databases. Consultez la référence de modèle.

      Il est préférable d’avoir des notions de base sur ce modèle avant de le personnaliser.

  4. Sélectionnez Fichier>Enregistrer sous pour enregistrer une copie du fichier sur votre ordinateur local avec le nom azuredeploy.json.

Modifier le modèle

  1. Ajoutez deux paramètres à la fin de la section parameters pour définir la clé du compte de stockage et l’URL BACPAC.

        "storageAccountKey": {
          "type":"string",
          "metadata":{
            "description": "Specifies the key of the storage account where the BACPAC file is stored."
          }
        },
        "bacpacUrl": {
          "type":"string",
          "metadata":{
            "description": "Specifies the URL of the BACPAC file."
          }
        }
    

    Ajoutez une virgule après l’accolade fermante de la propriété adminPassword (}). Pour mettre en forme le fichier JSON à partir de Visual Studio Code, sélectionnez Maj+Alt+F.

  2. Ajoutez deux ressources au modèle.

    • Pour permettre à l’extension SQL Database d’importer des fichiers BACPAC, vous devez autoriser le trafic à partir des services Azure. Au déploiement du serveur SQL, la règle de pare-feu active le paramètre Autoriser les services et ressources Azure à accéder à ce serveur.

      Ajoutez la règle de pare-feu suivante sous la définition du serveur :

      "resources": [
        {
          "type": "firewallrules",
          "apiVersion": "2021-02-01-preview",
          "name": "AllowAllAzureIps",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[parameters('databaseServerName')]"
          ],
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "0.0.0.0"
          }
        }
      ]
      

      L’exemple suivant présente le modèle mis à jour :

      Capture d’écran du modèle avec définition de pare-feu.

    • Ajoutez une ressource d’extension SQL Database à la définition de base de données avec le code JSON suivant :

      "resources": [
        {
          "type": "extensions",
          "apiVersion": "2014-04-01",
          "name": "Import",
          "dependsOn": [
            "[resourceId('Microsoft.Sql/servers/databases', parameters('databaseServerName'), parameters('databaseName'))]"
          ],
          "properties": {
            "storageKeyType": "StorageAccessKey",
            "storageKey": "[parameters('storageAccountKey')]",
            "storageUri": "[parameters('bacpacUrl')]",
            "administratorLogin": "[parameters('adminUser')]",
            "administratorLoginPassword": "[parameters('adminPassword')]",
            "operationMode": "Import"
          }
        }
      ]
      

      L’exemple suivant présente le modèle mis à jour :

      Capture d’écran du Modèle avec extension SQL Database.

      Pour comprendre la définition de ressource, consultez la référence de l’extension SQL Database pour la version de l’API. Voici quelques éléments importants :

      • dependsOn : la ressource d’extension doit être créée une fois que la base de données a été créée.
      • storageKeyType : spécifiez le type de la clé de stockage à utiliser. La valeur peut être StorageAccessKey ou SharedAccessKey. Utilisez StorageAccessKey dans ce tutoriel.
      • storageKey : Spécifiez la clé pour le compte de stockage où est stocké le fichier BACPAC. Si le type de clé de stockage est SharedAccessKey, il doit être précédé de « ? ».
      • storageUri : spécifiez l’URL du fichier BACPAC stocké dans un compte de stockage.
      • administratorLogin : nom du compte de l’administrateur SQL.
      • administratorLoginPassword : mot de passe de l’administrateur SQL. Pour utiliser un mot de passe généré, consultez Prérequis.

L'exemple suivant montre le modèle terminé :

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "databaseServerName": {
      "type": "string",
      "defaultValue": "[concat('server-', uniqueString(resourceGroup().id, deployment().name))]",
      "metadata": {
        "description": "Specifies the name for the SQL server"
      }
    },
    "databaseName": {
      "type": "string",
      "defaultValue": "[concat('db-', uniqueString(resourceGroup().id, deployment().name), '-1')]",
      "metadata": {
        "description": "Specifies the name for the SQL database under the SQL server"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specifies the location for server and database"
      }
    },
    "adminUser": {
      "type": "string",
      "metadata": {
        "description": "Specifies the username for admin"
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Specifies the password for admin"
      }
    },
    "storageAccountKey": {
      "type": "string",
      "metadata": {
        "description": "Specifies the key of the storage account where the BACPAC file is stored."
      }
    },
    "bacpacUrl": {
      "type": "string",
      "metadata": {
        "description": "Specifies the URL of the BACPAC file."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2021-02-01-preview",
      "name": "[parameters('databaseServerName')]",
      "location": "[parameters('location')]",
      "properties": {
        "administratorLogin": "[parameters('adminUser')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      },
      "resources": [
        {
          "type": "firewallrules",
          "apiVersion": "2021-02-01-preview",
          "name": "AllowAllAzureIps",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[parameters('databaseServerName')]"
          ],
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "0.0.0.0"
          }
        }
      ]
    },
    {
      "type": "Microsoft.Sql/servers/databases",
      "apiVersion": "2021-02-01-preview",
      "name": "[concat(string(parameters('databaseServerName')), '/', string(parameters('databaseName')))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Sql/servers/', parameters('databaseServerName'))]"
      ],
      "resources": [
        {
          "type": "extensions",
          "apiVersion": "2014-04-01",
          "name": "Import",
          "dependsOn": [
            "[resourceId('Microsoft.Sql/servers/databases', parameters('databaseServerName'), parameters('databaseName'))]"
          ],
          "properties": {
            "storageKeyType": "StorageAccessKey",
            "storageKey": "[parameters('storageAccountKey')]",
            "storageUri": "[parameters('bacpacUrl')]",
            "administratorLogin": "[parameters('adminUser')]",
            "administratorLoginPassword": "[parameters('adminPassword')]",
            "operationMode": "Import"
          }
        }
      ]
    }
  ]
}

Déployer le modèle

Utilisez le nom et l’emplacement du projet qui ont été utilisés lors de la préparation du fichier BACPAC. Cela permet de placer toutes les ressources dans le même groupe de ressources, ce qui est pratique quand vous supprimez des ressources.

  1. Connectez-vous à Cloud Shell.

  2. Sélectionnez PowerShell dans l’angle supérieur gauche.

    Capture d’écran de Azure Cloud Shell dans PowerShell avec l’option pour charger un fichier.

  3. Sélectionnez Charger/télécharger des fichiers et chargez votre fichier azuredeploy.json.

  4. Pour déployer le modèle, copiez et collez le script suivant dans la fenêtre de l’interpréteur de commandes.

    $projectName = Read-Host -Prompt "Enter the same project name that is used earlier"
    $adminUsername = Read-Host -Prompt "Enter the SQL admin username"
    $adminPassword = Read-Host -Prompt "Enter the admin password" -AsSecureString
    $storageAccountKey = Read-Host -Prompt "Enter the storage account key"
    $bacpacUrl = Read-Host -Prompt "Enter the URL of the BACPAC file"
    $resourceGroupName = "${projectName}rg"
    
    New-AzResourceGroupDeployment `
        -ResourceGroupName $resourceGroupName `
        -adminUser $adminUsername `
        -adminPassword $adminPassword `
        -TemplateFile "$HOME/azuredeploy.json" `
        -storageAccountKey $storageAccountKey `
        -bacpacUrl $bacpacUrl
    
    Write-Host "Press [ENTER] to continue ..."
    

Vérifier le déploiement

Pour accéder au serveur à partir de votre ordinateur client, vous devez ajouter une règle de pare-feu. L’adresse IP de votre client et l’adresse IP utilisée pour la connexion au serveur peuvent être différentes en raison de la traduction d’adresses réseau (NAT). Pour plus d’informations, consultez Créer et gérer des règles de pare-feu IP.

Par exemple, lorsque vous vous connectez à l’Éditeur de requête, un message s’affiche indiquant que l’adresse IP n’est pas autorisée. L’adresse est différente de l’adresse IP de votre client en raison de la traduction d’adresses réseau. Sélectionnez le lien du message afin d’ajouter une règle de pare-feu pour l’adresse IP. Lorsque vous avez terminé, supprimez l’adresse IP des paramètres Pare-feu et réseaux virtuels du serveur.

Dans le portail Azure, dans le groupe de ressources, sélectionnez la base de données. Sélectionnez Éditeur de requêtes (préversion) et entrez les informations d’identification d’administrateur. Vous verrez deux tables importées dans la base de données.

Capture d’écran de l’Éditeur de requête (préversion) sur le portail Azure.

Nettoyer les ressources

Lorsque vous n’avez plus besoin des ressources Azure que vous avez déployées, supprimez le groupe de ressources. Le groupe de ressources, le compte de stockage, le serveur SQL et les bases de données SQL sont supprimés.

  1. Dans le portail Azure, entrez Groupes de ressources dans la zone de recherche.
  2. Dans le champ Filtrer par nom, entrez le nom du groupe de ressources.
  3. Sélectionnez le nom du groupe de ressources.
  4. Sélectionnez Supprimer le groupe de ressources.
  5. Pour confirmer la suppression, entrez le nom du groupe de ressources, puis sélectionnez Supprimer.

Étapes suivantes

Dans ce tutoriel, vous avez déployé un serveur et une base de données, et vous avez importé un fichier BACPAC. Pour savoir comment résoudre les problèmes de déploiement de modèle, consultez :