Tutorial: Importar ficheiros BACPAC do SQL com modelos do ARM

Saiba como utilizar SQL do Azure extensões da Base de Dados para importar um ficheiro BACPAC com modelos de Resource Manager do Azure (modelos arm). Os artefactos de implementação são quaisquer ficheiros, além dos ficheiros de modelo principal, que são necessários para concluir uma implementação. O ficheiro BACPAC é um artefacto.

Neste tutorial, vai criar um modelo para implementar um SQL Server lógico e uma base de dados individual e importar um ficheiro BACPAC. Para obter informações sobre como implementar extensões de máquinas virtuais do Azure com modelos do ARM, veja Tutorial: Implementar extensões de máquina virtual com modelos do ARM.

Este tutorial abrange as seguintes tarefas:

  • Preparar um ficheiro BACPAC.
  • Abra um modelo de início rápido.
  • Edite o modelo.
  • Implemente o modelo.
  • Verifique a implementação.

Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Pré-requisitos

Para concluir este artigo, precisa de:

Preparar um ficheiro BACPAC

Um ficheiro BACPAC é partilhado no GitHub. Para criar a sua própria, veja Exportar uma base de dados de SQL do Azure Base de Dados para um ficheiro BACPAC. Se optar por publicar o ficheiro na sua própria localização, tem de atualizar o modelo mais tarde no tutorial.

O ficheiro BACPAC tem de ser armazenado numa conta de Armazenamento do Azure antes de poder ser importado com um modelo do ARM. O seguinte script do PowerShell prepara o ficheiro BACPAC com estes passos:

  • Transfira o ficheiro BACPAC.
  • Criar uma conta de Armazenamento do Azure.
  • Crie um contentor de blobs de conta de armazenamento.
  • Carregue o ficheiro BACPAC para o contentor.
  • Apresentar a chave da conta de armazenamento, o URL do blob, o nome do grupo de recursos e a localização.
  1. Selecione Experimentar para abrir Cloud Shell. Em seguida, copie e cole o seguinte script do PowerShell na janela da 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. Guarde a chave da conta de armazenamento, o URL do ficheiro BACPAC, o nome do projeto e a localização. Irá utilizar esses valores quando implementar o modelo mais adiante neste tutorial.

Abrir um modelo de início rápido

O modelo utilizado neste tutorial é armazenado no GitHub.

  1. No Visual Studio Code, selecione Ficheiro>Aberto Ficheiro.

  2. em Nome de ficheiro, cole o seguinte URL:

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Selecione Abrir para abrir o ficheiro.

    Existem dois recursos definidos no modelo:

  4. Selecione Guardar Ficheiro>Como para guardar uma cópia do ficheiro no seu computador local com o nome azuredeploy.json.

Editar o modelo

  1. Adicione dois parâmetros no final da parameters secção para definir a chave da conta de armazenamento e o 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."
          }
        }
    

    Adicione uma vírgula após a adminPassword chaveta de fecho da propriedade (}). Para formatar o ficheiro JSON a partir do Visual Studio Code, selecione Shift+Alt+F.

  2. Adicione dois recursos ao modelo.

    • Para permitir que a extensão Base de Dados SQL importe ficheiros BACPAC, tem de permitir o tráfego dos serviços do Azure. Quando o SQL Server é implementado, a regra de firewall ativa a definição para Permitir que os serviços e recursos do Azure acedam a este servidor.

      Adicione a seguinte regra de firewall na definição do servidor:

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

      O exemplo seguinte mostra o modelo atualizado:

      Captura de ecrã do modelo com a definição de firewall.

    • Adicione um recurso de extensão de Base de Dados SQL à definição de base de dados com o seguinte 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"
          }
        }
      ]
      

      O exemplo seguinte mostra o modelo atualizado:

      Captura de ecrã do modelo com Base de Dados SQL extensão.

      Para compreender a definição do recurso, veja a referência da extensão Base de Dados SQL da versão da API. Seguem alguns elementos importantes:

      • dependsOn: o recurso de extensão tem de ser criado após a criação da base de dados.
      • storageKeyType: especifique o tipo de chave de armazenamento a utilizar. O valor pode ser StorageAccessKey ou SharedAccessKey. Utilize StorageAccessKey neste tutorial.
      • storageKey: especifique a chave para a conta de armazenamento onde o ficheiro BACPAC está armazenado. Se o tipo de chave de armazenamento for SharedAccessKey, tem de ser precedido com um "?".
      • storageUri: especifique o URL do ficheiro BACPAC armazenado numa conta de armazenamento.
      • administratorLogin: o nome da conta do administrador do SQL.
      • administratorLoginPassword: a palavra-passe do administrador do SQL. Para utilizar uma palavra-passe gerada, veja Pré-requisitos.

O exemplo seguinte mostra o modelo concluído:

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

Implementar o modelo

Utilize o nome e a localização do projeto que foram utilizados quando preparou o ficheiro BACPAC. Isto coloca todos os recursos no mesmo grupo de recursos, o que é útil quando elimina recursos.

  1. Inicie sessão no Cloud Shell.

  2. Selecione PowerShell no canto superior esquerdo.

    Captura de ecrã do Azure Cloud Shell no PowerShell com a opção para carregar um ficheiro.

  3. Selecione Carregar/Transferir ficheiros e carregue o ficheiro azuredeploy.json .

  4. Para implementar o modelo, copie e cole o seguinte script na janela da 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 ..."
    

Verificar a implementação

Para aceder ao servidor a partir do computador cliente, tem de adicionar uma regra de firewall. O endereço IP do cliente e o endereço IP utilizado para ligar ao servidor podem ser diferentes devido à tradução de endereços de rede (NAT). Para obter mais informações, veja Criar e gerir regras de firewall de IP.

Por exemplo, quando inicia sessão no Editor de consultas , é apresentada uma mensagem a indicar que o endereço IP não é permitido. O endereço é diferente do endereço IP do cliente por causa do NAT. Selecione a ligação da mensagem para adicionar uma regra de firewall para o endereço IP. Quando terminar, pode eliminar o endereço IP das definições firewalls e redes virtuais do servidor.

No portal do Azure, no grupo de recursos, selecione a base de dados. Selecione Editor de consultas (pré-visualização) e introduza as credenciais de administrador. Verá que duas tabelas foram importadas para a base de dados.

Captura de ecrã do Editor de consultas (pré-visualização) no portal do Azure.

Limpar os recursos

Quando os recursos do Azure que implementou já não forem necessários, elimine o grupo de recursos. O grupo de recursos, a conta de armazenamento, o SQL Server e as bases de dados SQL são eliminados.

  1. Na portal do Azure, introduza Grupos de recursos na caixa de pesquisa.
  2. No campo Filtrar por nome , introduza o nome do grupo de recursos.
  3. Selecione o nome do grupo de recursos.
  4. Selecione Eliminar grupo de recursos.
  5. Para confirmar a eliminação, introduza o nome do grupo de recursos e, em seguida, selecione Eliminar.

Passos seguintes

Neste tutorial, implementou um servidor e uma base de dados e importou um ficheiro BACPAC. Para saber como resolver problemas de implementação de modelos, consulte: