Esercitazione: Importare file BACPAC SQL con i modelli di Azure Resource Manager

Informazioni su come usare estensioni per il database SQL di Azure per importare file BACPAC con modelli di Azure Resource Manager (modelli di ARM). Gli artefatti della distribuzione sono tutti i file, oltre ai file modello principali, necessari per completare una distribuzione. Il file BACPAC è uno di questi elementi.

In questa esercitazione verrà creato un modello per distribuire un server SQL logico e un database singolo e importare un file BACPAC. Per informazioni su come distribuire le estensioni macchina virtuale di Azure tramite modelli di Azure Resource Manager, vedere Esercitazione: Distribuire estensioni di macchina virtuale con i modelli di Azure Resource Manager.

Questa esercitazione illustra le attività seguenti:

  • Preparare un file BACPAC.
  • Aprire un modello di avvio rapido.
  • Modificare il modello.
  • Distribuire il modello.
  • Verificare la distribuzione.

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Prerequisiti

Per completare l'esercitazione di questo articolo, sono necessari gli elementi seguenti:

Preparare un file BACPAC

Un file BACPAC viene condiviso in GitHub. Per creare un file BACPAC, vedere Esportare un database dal database SQL di Azure in un file BACPAC. Se si sceglie di pubblicare il file in una posizione personalizzata, è necessario aggiornare il modello più avanti in questa esercitazione.

Il file BACPAC deve essere archiviato in un account di archiviazione di Azure prima di poterlo importare con un modello di Resource Manager. Lo script di PowerShell seguente prepara il file BACPAC con questi passaggi:

  • Scaricare il file BACPAC.
  • Creare un account di archiviazione di Azure.
  • Creare un contenitore BLOB nell'account di archiviazione.
  • Caricare il file BACPAC nel contenitore.
  • Visualizzare la chiave dell'account di archiviazione, l'URL BLOB, il nome del gruppo di risorse e la posizione.
  1. Selezionare Prova per aprire Cloud Shell. Copiare e incollare quindi lo script di PowerShell seguente nella finestra della shell.

    $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. Salvare la chiave dell'account di archiviazione, l'URL del file BACPAC, il nome del progetto e il percorso. Questi valori verranno usati quando si distribuisce il modello più avanti in questa esercitazione.

Aprire un modello di avvio rapido

Il modello usato in questa esercitazione è archiviato in GitHub.

  1. In Visual Studio Code selezionare File>Apri file.

  2. In Nome file incollare l'URL seguente:

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Selezionare Apri per aprire il file.

    Nel modello sono definite due risorse:

  4. Selezionare File>Salva con nome per salvare una copia del file con il nome azuredeploy.json nel computer locale.

Modificare il modello

  1. Aggiungere due parametri alla fine della parameters sezione per impostare la chiave dell'account di archiviazione e 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."
          }
        }
    

    Aggiungere una virgola dopo la parentesi graffa di chiusura (}) della proprietà adminPassword. Per formattare il file JSON da Visual Studio Code, selezionare MAIUSC+ALT+F.

  2. Aggiungere due risorse al modello.

    • Per consentire all'estensione database SQL di importare file BACPAC, è necessario consentire il traffico dai servizi di Azure. Quando il server SQL viene distribuito, la regola del firewall attiva l'impostazione Consenti a servizi e risorse di Azure di accedere a questo server.

      Aggiungere la regola del firewall seguente nella definizione del server:

      "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'esempio seguente mostra il modello aggiornato:

      Screenshot del modello con la definizione del firewall.

    • Aggiungere una risorsa estensione di database SQL alla definizione del database con il codice JSON seguente:

      "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'esempio seguente mostra il modello aggiornato:

      Screenshot del modello con estensione database SQL.

      Per comprendere la definizione della risorsa, vedere le informazioni di riferimento sull'estensione database SQL della versione dell'API. Di seguito sono illustrati alcuni elementi importanti.

      • dependsOn: la risorsa di estensione deve essere creata dopo che è stato creato il database.
      • storageKeyType: specificare il tipo di chiave di archiviazione da usare. Il valore può essere StorageAccessKey o SharedAccessKey. In questa esercitazione usare StorageAccessKey.
      • storageKey: specificare la chiave dell'account di archiviazione in cui è archiviato il file BACPAC. Se il tipo di chiave di archiviazione è SharedAccessKey, deve essere preceduta da "?".
      • storageUri: specificare l'URL del file BACPAC archiviato in un account di archiviazione.
      • administratorLogin: nome dell'account dell'amministratore SQL.
      • administratorLoginPassword: password dell'amministratore SQL. Per usare una password generata, vedere Prerequisiti.

L'esempio seguente mostra il modello completato:

{
  "$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"
          }
        }
      ]
    }
  ]
}

Distribuire il modello

Usare il nome e il percorso del progetto usati durante la preparazione del file BACPAC. In questo modo tutte le risorse vengono inserite nello stesso gruppo di risorse, utile quando si eliminano le risorse.

  1. Accedere a Cloud Shell.

  2. Selezionare PowerShell nell'angolo superiore sinistro.

    Screenshot di Azure Cloud Shell in PowerShell con l'opzione per caricare un file.

  3. Selezionare Carica/Scarica file e caricare il file azuredeploy.json .

  4. Per distribuire il modello, copiare e incollare lo script seguente nella finestra della shell.

    $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 ..."
    

Verificare la distribuzione

Per accedere al server dal computer client, è necessario aggiungere una regola del firewall. L'indirizzo IP del client e l'indirizzo IP usati per connettersi al server potrebbero essere diversi a causa di NAT (Network Address Translation). Per altre informazioni, vedere Creare e gestire le regole del firewall IP.

Ad esempio, quando si accede all'editor di query viene visualizzato un messaggio che indica che l'indirizzo IP non è consentito. L'indirizzo è diverso dall'indirizzo IP del client a causa di NAT. Selezionare il collegamento del messaggio per aggiungere una regola del firewall per l'indirizzo IP. Al termine, è possibile eliminare l'indirizzo IP dalle impostazioni firewall e reti virtuali del server.

Nel portale di Azure selezionare il database dal gruppo di risorse. Selezionare Editor di query (anteprima) e immettere le credenziali di amministratore. Verranno visualizzate due tabelle importate nel database.

Screenshot dell'editor di query (anteprima) in portale di Azure.

Pulire le risorse

Quando le risorse di Azure distribuite non sono più necessarie, eliminare il gruppo di risorse. Il gruppo di risorse, l'account di archiviazione, sql server e i database SQL vengono eliminati.

  1. Nella portale di Azure immettere Gruppi di risorse nella casella di ricerca.
  2. Nel campo Filtra per nome immettere il nome del gruppo di risorse.
  3. Selezionare il nome del gruppo di risorse.
  4. Selezionare Elimina gruppo di risorse.
  5. Per confermare l'eliminazione, immettere il nome del gruppo di risorse e selezionare Elimina.

Passaggi successivi

In questa esercitazione sono stati distribuiti un server e un database ed è stato importato un file BACPAC. Per informazioni su come risolvere i problemi di distribuzione del modello, vedere: