Zelfstudie: SQL BACPAC-bestanden met ARM-sjablonen importeren

Meer informatie over het gebruik van Azure SQL Database-extensies om een BACPAC-bestand te importeren met ARM-sjablonen (Azure Resource Manager). Implementatieartefacten zijn, naast de hoofdsjabloonbestanden, bestanden die vereist zijn om een implementatie te voltooien. Het BACPAC-bestand is een artefact.

In deze zelfstudie maakt u een sjabloon voor het implementeren van een logische SQL-server en één database, en importeert u een BACPAC-bestand. Voor informatie over het implementeren van extensies van virtuele Azure-machines met behulp van ARM-sjablonen, raadpleegt u Zelfstudie: Extensies van virtuele machines implementeren met ARM-sjablonen.

Deze zelfstudie bestaat uit de volgende taken:

  • Een BACPAC-bestand voorbereiden.
  • Een quickstartsjabloon openen.
  • De sjabloon bewerken.
  • De sjabloon implementeren.
  • De implementatie controleren.

Als u geen abonnement op Azure hebt, maakt u een gratis account voordat u begint.

Vereisten

Als u dit artikel wilt voltooien, hebt u het volgende nodig:

Een BACPAC-bestand voorbereiden

Een BACPAC-bestand wordt gedeeld in GitHub. Zie Een database vanuit Azure SQL Database exporteren naar een BACPAC-bestand om uw eigen bestand te maken. Als u ervoor kiest het bestand naar uw eigen locatie te publiceren, moet u de sjabloon later in de zelfstudie bijwerken.

Het BACPAC-bestand moet worden opgeslagen in een Azure Storage-account voordat het kan worden geïmporteerd met een ARM-sjabloon. Met het volgende PowerShell-script bereidt u het BACPAC-bestand voor met de volgende stappen:

  • Het BACPAC-bestand downloaden.
  • Een Azure Storage-account maken.
  • Een blobcontainer in een opslagaccount maken.
  • Het BACPAC-bestand uploaden naar de container.
  • Geef de sleutel van het opslagaccount, de blob-URL, de naam van de resourcegroep en de locatie weer.
  1. Selecteer Uitproberen om Cloud Shell te openen. Kopieer en plak vervolgens het volgende PowerShell-script in het shell-venster.

    $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. Sla de opslagaccountsleutel, DE URL van het BACPAC-bestand, de projectnaam en de locatie op. U gebruikt deze waarden wanneer u de sjabloon verderop in deze zelfstudie implementeert.

Een snelstartsjabloon openen

De sjabloon die in deze zelfstudie wordt gebruikt, wordt opgeslagen in GitHub.

  1. Selecteer in Visual Studio Code Bestand>Bestand openen.

  2. Plak de volgende URL in Bestandsnaam:

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Selecteer Openen om het bestand te openen.

    Er worden twee resources gedefinieerd in de sjabloon:

    • Microsoft.Sql/servers. Zie de sjabloonverwijzing.

    • Microsoft.SQL.servers/databases. Zie de sjabloonverwijzing.

      Het is handig om enige basiskennis te hebben van de sjabloon voordat u deze gaat aanpassen.

  4. Selecteer Bestand>Opslaan als om het bestand op uw lokale computer op te slaan als azuredeploy.json.

De sjabloon bewerken

  1. Voeg aan het einde van de parameters sectie twee parameters toe om de sleutel van het opslagaccount en de BACPAC-URL in te stellen.

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

    Voeg een komma toe na de afsluitende accolade (}) van de eigenschap adminPassword. Als u het JSON-bestand wilt formatteren vanuit Visual Studio Code, selecteert u Shift+Alt+F.

  2. Voeg twee resources toe aan de sjabloon.

    • Als u wilt toestaan dat de extensie SQL Database BACPAC-bestanden importeert, moet u verkeer van Azure-services toestaan. Wanneer de SQL-server is geïmplementeerd, schakelt de firewallregel de instelling in voor Azure-services en -resources toegang geven tot deze server.

      Voeg de volgende firewallregel toe onder de serverdefinitie:

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

      In het volgende voorbeeld ziet u de bijgewerkte sjabloon:

      Schermopname van de sjabloon met firewalldefinitie.

    • Voeg met de volgende JSON een SQL Database-extensieresource toe aan de databasedefinitie:

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

      In het volgende voorbeeld ziet u de bijgewerkte sjabloon:

      Schermopname van de sjabloon met SQL Database extensie.

      Zie de naslaginformatie over de SQL Database-extensie van de API-versie voor meer informatie over de resourcedefinitie. Hier volgen enkele belangrijke elementen:

      • dependsOn: de extensieresource moet worden gemaakt nadat de database is gemaakt.
      • storageKeyType: Geef het type van de te gebruiken opslagsleutel op. De waarde kan StorageAccessKey of SharedAccessKey zijn. Gebruik in deze zelfstudie StorageAccessKey.
      • storageKey: Geef de sleutel op voor het opslagaccount waarin het BACPAC-bestand wordt opgeslagen. Als het type opslagsleutel SharedAccessKey is, moet deze worden voorafgegaan door een '?'.
      • storageUri: Geef de URL op van het BACPAC-bestand dat is opgeslagen in een opslagaccount.
      • administratorLogin: de accountnaam van de SQL-beheerder.
      • administratorLoginPassword: het wachtwoord van de SQL-beheerder. Zie Vereisten als u een gegenereerd wachtwoord wilt gebruiken.

In het volgende voorbeeld ziet u de voltooide sjabloon:

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

De sjabloon implementeren

Gebruik de projectnaam en -locatie die zijn gebruikt bij het voorbereiden van het BACPAC-bestand. Hiermee worden alle resources in dezelfde resourcegroep opgenomen, wat handig is wanneer u resources verwijdert.

  1. Meld u aan bij Cloud Shell.

  2. Selecteer PowerShell in de linkerbovenhoek.

    Schermopname van Azure Cloud Shell in PowerShell met de optie om een bestand te uploaden.

  3. Selecteer Bestanden uploaden/downloaden en upload het bestand azuredeploy.json .

  4. Als u de sjabloon wilt implementeren, kopieert en plakt u het volgende script in het shell-venster.

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

De implementatie controleren

Als u toegang wilt krijgen tot de server vanaf uw clientcomputer, moet u een firewallregel toevoegen. Het IP-adres van uw client en het IP-adres dat wordt gebruikt om verbinding te maken met de server, kunnen verschillen vanwege NAT (Network Address Translation). Raadpleeg IP-firewallregels maken en beheren voor meer informatie.

Wanneer u zich bijvoorbeeld aanmeldt bij Query-editor , wordt er een bericht weergegeven dat het IP-adres niet is toegestaan. Het adres verschilt van het IP-adres van uw client vanwege NAT. Selecteer de koppeling van het bericht om een firewallregel toe te voegen voor het IP-adres. Wanneer u klaar bent, kunt u het IP-adres verwijderen uit de instellingen voor firewalls en virtuele netwerken van de server.

Selecteer in de Azure Portal de database in de resourcegroep. Selecteer Query-editor (preview) en voer de beheerdersreferenties in. U ziet dat er twee tabellen in de database zijn geïmporteerd.

Schermopname van de Query-editor (preview) in Azure Portal.

Resources opschonen

Wanneer de Azure-resources die u hebt geïmplementeerd niet meer nodig zijn, verwijdert u de resourcegroep. De resourcegroep, het opslagaccount, de SQL-server en de SQL-databases worden verwijderd.

  1. Voer in het Azure Portal Resourcegroepen in het zoekvak in.
  2. Voer in het veld Filteren op naam de naam van de resourcegroep in.
  3. Selecteer de naam van de resourcegroep.
  4. Selecteer Resourcegroep verwijderen.
  5. Om de verwijdering te bevestigen, voert u de naam van de resourcegroep in en selecteert u Verwijderen.

Volgende stappen

In deze zelfstudie hebt u een server en een database geïmplementeerd en een BACPAC-bestand geïmporteerd. Raadpleeg voor meer informatie over het oplossen van problemen met sjabloonimplementatie: