Samouczek: importowanie plików BACPAC SQL przy użyciu szablonów usługi ARM

Dowiedz się, jak używać rozszerzeń usługi Azure SQL Database do importowania pliku BACPAC za pomocą szablonów usługi Azure Resource Manager (szablony usługi ARM). Artefakty wdrażania to wszystkie pliki, oprócz głównych plików szablonów, które są potrzebne do ukończenia wdrożenia. Plik BACPAC jest tu artefaktem.

W tym samouczku utworzysz szablon, aby wdrożyć logiczny serwer SQL i pojedynczą bazę danych oraz zaimportować plik BACPAC. Aby uzyskać informacje o sposobie wdrażania rozszerzeń maszyn wirtualnych platformy Azure przy użyciu szablonów usługi ARM, zobacz Samouczek: wdrażanie rozszerzeń maszyn wirtualnych przy użyciu szablonów usługi ARM.

Ten samouczek obejmuje następujące zadania:

  • Przygotuj plik BACPAC.
  • Otwórz szablon szybkiego startu.
  • Edytuj szablon.
  • Wdrażanie szablonu.
  • Sprawdź wdrożenie.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Wymagania wstępne

Aby ukończyć pracę z tym artykułem, potrzebne są następujące zasoby:

Przygotowywanie pliku BACPAC

Plik BACPAC jest udostępniany w usłudze GitHub. Aby utworzyć własną bazę danych, zobacz Eksportowanie bazy danych z usługi Azure SQL Database do pliku BACPAC. W przypadku wybrania publikowania pliku do własnej lokalizacji musisz zaktualizować szablon w dalszej części tego samouczka.

Plik BACPAC musi być przechowywany na koncie usługi Azure Storage, zanim będzie można go zaimportować z szablonem usługi ARM. Poniższy skrypt programu PowerShell przygotowuje plik BACPAC, wykonując następujące kroki:

  • Pobieranie pliku BACPAC.
  • Tworzenie konta usługi Azure Storage.
  • Utwórz kontener obiektów blob konta magazynu.
  • Przekazywanie pliku BACPAC do kontenera.
  • Wyświetl klucz konta magazynu, adres URL obiektu blob, nazwę grupy zasobów i lokalizację.
  1. Wybierz pozycję Wypróbuj, aby otworzyć Cloud Shell. Następnie skopiuj i wklej następujący skrypt programu PowerShell w oknie powłoki.

    $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. Zapisz klucz konta magazynu, adres URL pliku BACPAC, nazwę projektu i lokalizację. Te wartości będą używane podczas wdrażania szablonu w dalszej części tego samouczka.

Otwieranie szablonu szybkiego startu

Szablon używany w tym samouczku jest przechowywany w usłudze GitHub.

  1. W Visual Studio Code wybierz pozycję Plik>Otwórz plik.

  2. W polu File name (Nazwa pliku) wklej następujący adres URL:

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Wybierz pozycję Open (Otwórz), aby otworzyć plik.

    W szablonie zdefiniowano dwa zasoby:

  4. Wybierz pozycję Plik>Zapisz jako , aby zapisać kopię pliku na komputerze lokalnym o nazwie azuredeploy.json.

Edytowanie szablonu

  1. Dodaj dwa parametry na końcu parameters sekcji, aby ustawić klucz konta magazynu i adres URL PLIKU 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."
          }
        }
    

    Dodaj przecinek po zamykającym nawiasie adminPassword klamrowym właściwości (}). Aby sformatować plik JSON z Visual Studio Code, wybierz klawisze Shift+Alt+F.

  2. Dodaj dwa zasoby do szablonu.

    • Aby umożliwić rozszerzenie SQL Database importowanie plików BACPAC, należy zezwolić na ruch z usług platformy Azure. Po wdrożeniu programu SQL Server reguła zapory włącza ustawienie Zezwalaj usługom i zasobom platformy Azure na dostęp do tego serwera.

      Dodaj następującą regułę zapory w definicji serwera:

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

      W poniższym przykładzie pokazano zaktualizowany szablon:

      Zrzut ekranu przedstawiający szablon z definicją zapory.

    • Dodaj zasób rozszerzenia usługi SQL Database do definicji bazy danych za pomocą następującego kodu JSON:

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

      W poniższym przykładzie pokazano zaktualizowany szablon:

      Zrzut ekranu przedstawiający szablon z rozszerzeniem SQL Database.

      Aby zrozumieć definicję zasobu, zobacz dokumentację rozszerzenia SQL Database wersji interfejsu API. Poniżej przedstawiono niektóre ważne elementy:

      • dependsOn: Zasób rozszerzenia należy utworzyć po utworzeniu bazy danych.
      • storageKeyType: określ typ klucza magazynu do użycia. Wartością może być StorageAccessKey lub SharedAccessKey. Użyj StorageAccessKey w tym samouczku.
      • storageKey: określ klucz dla konta magazynu, w którym jest przechowywany plik BACPAC. Jeśli typ klucza magazynu to SharedAccessKey, musi być poprzedzony ciągiem "?".
      • storageUri: określ adres URL pliku BACPAC przechowywanego na koncie magazynu.
      • administratorLogin: nazwa konta administratora SQL.
      • administratorLoginPassword: hasło administratora SQL. Aby użyć wygenerowanego hasła, zobacz Wymagania wstępne.

W poniższym przykładzie pokazano ukończony szablon:

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

Wdrożenie szablonu

Użyj nazwy i lokalizacji projektu, która została użyta podczas przygotowywania pliku BACPAC. Spowoduje to umieścić wszystkie zasoby w tej samej grupie zasobów, co jest przydatne podczas usuwania zasobów.

  1. Zaloguj się do Cloud Shell.

  2. Wybierz pozycję PowerShell w lewym górnym rogu.

    Zrzut ekranu przedstawiający usługę Azure Cloud Shell w programie PowerShell z opcją przekazania pliku.

  3. Wybierz pozycję Przekaż/Pobierz pliki i przekaż plik azuredeploy.json .

  4. Aby wdrożyć szablon, skopiuj i wklej następujący skrypt w oknie powłoki.

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

Weryfikowanie wdrożenia

Aby uzyskać dostęp do serwera z komputera klienckiego, należy dodać regułę zapory. Adres IP klienta i adres IP używany do nawiązywania połączenia z serwerem mogą być inne z powodu translatora adresów sieciowych (NAT). Aby uzyskać więcej informacji, zobacz Tworzenie reguł zapory bazujących na adresach IP i zarządzanie nimi.

Na przykład po zalogowaniu się do edytora zapytań zostanie wyświetlony komunikat informujący o tym, że adres IP jest niedozwolony. Adres różni się od adresu IP klienta z powodu translatora adresów sieciowych. Wybierz link komunikatu, aby dodać regułę zapory dla adresu IP. Po zakończeniu możesz usunąć adres IP z ustawień zapory i sieci wirtualnych serwera.

W Azure Portal w grupie zasobów wybierz bazę danych. Wybierz pozycję Edytor zapytań (wersja zapoznawcza) i wprowadź poświadczenia administratora. Zobaczysz, że dwie tabele zostały zaimportowane do bazy danych.

Zrzut ekranu przedstawiający edytor zapytań (wersja zapoznawcza) w Azure Portal.

Czyszczenie zasobów

Gdy wdrożone zasoby platformy Azure nie są już potrzebne, usuń grupę zasobów. Grupa zasobów, konto magazynu, program SQL Server i bazy danych SQL zostaną usunięte.

  1. W Azure Portal wprowadź ciąg Grupy zasobów w polu wyszukiwania.
  2. W polu Filtruj według nazwy wprowadź nazwę grupy zasobów.
  3. Wybierz nazwę grupy zasobów.
  4. Wybierz pozycję Usuń grupę zasobów.
  5. Aby potwierdzić usunięcie, wprowadź nazwę grupy zasobów, a następnie wybierz pozycję Usuń.

Następne kroki

W tym samouczku wdrożono serwer i bazę danych oraz zaimportowano plik BACPAC. Aby dowiedzieć się, jak rozwiązywać problemy z wdrażaniem szablonów, zobacz: