Tutorial: Importar arquivos BACPAC do SQL com modelos do ARM

Saiba como usar extensões do Banco de Dados SQL do Azure para importar um arquivo BACPAC com modelos do ARM (modelos do Azure Resource Manager). Artefatos de implantação são quaisquer arquivos, além dos arquivos de modelo principais, necessários para concluir uma implantação. O arquivo BACPAC é um artefato.

Neste tutorial, você criará um modelo para implantar um servidor SQL lógico e um banco de dados individual e importar um arquivo BACPAC. Para obter informações sobre como implantar extensões de máquina virtual do Azure usando modelos do ARM, confira o Tutorial: Implantar extensões de máquina virtual com modelos do ARM.

Este tutorial cobre as seguintes tarefas:

  • Preparar um arquivo BACPAC.
  • Abrir um modelo de início rápido.
  • Editar o modelo.
  • Implante o modelo.
  • Verifique a implantação.

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

Pré-requisitos

Para concluir este artigo, você precisa do seguinte:

Preparar um arquivo BACPAC

Um arquivo BACPAC é compartilhado no GitHub. Para criar seus próprio arquivo, confira Exportar um banco de dados do Banco de Dados SQL do Azure para um arquivo BACPAC. Se você optar por publicar o arquivo em seu próprio local, deverá atualizar o modelo posteriormente no tutorial.

O arquivo BACPAC deve ser armazenado em uma conta de Armazenamento do Microsoft Azure antes que possa ser importado com um modelo do ARM. O script do PowerShell a seguir prepara o arquivo BACPAC com estas etapas:

  • Baixe o arquivo BACPAC.
  • Criar uma conta do Armazenamento do Azure.
  • Crie um contêiner de blobs da conta de armazenamento.
  • Carregue o arquivo BACPAC para o contêiner.
  • Exiba a chave da conta de armazenamento, a URL do blob, o nome do grupo de recursos e o local.
  1. Selecione Experimentar para abrir o Cloud Shell. Em seguida, copie e cole o seguinte script do PowerShell na janela de 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. Salve a chave da conta de armazenamento, a URL do arquivo BACPAC, o nome do projeto e localização. Você usará esses valores ao implantar o modelo posteriormente neste tutorial.

Abrir um modelo de início rápido

O modelo usado neste tutorial é armazenado no GitHub.

  1. No Visual Studio Code, escolha Arquivo>Abrir Arquivo.

  2. Em Nome do arquivo, cole a seguinte URL:

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

    Há dois recursos definidos no modelo:

  4. Selecione Arquivo>Salvar como para salvar uma cópia do arquivo no computador local com o nome azuredeploy.json.

Editar o modelo

  1. Adicione dois parâmetros ao final da seção parameterspara definir a chave da conta de armazenamento e a URL do 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 chave de fechamento adminPassword da propriedade (}). Para formatar o arquivo JSON do Visual Studio Code, selecione Shift+Alt+F.

  2. Adicione dois recursos ao modelo.

    • Para permitir que a extensão do Banco de Dados SQL importe arquivos BACPAC, você deverá permitir tráfego dos serviços do Azure. Quando o servidor de SQL é implantado, a regra de firewall ativa a configuração parapermitir que os serviços e recursos do Azure acessem este servidor.

      Adicione a seguinte regra de firewall à definição de 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 seguinte exemplo mostra o modelo atualizado:

      Captura de tela do modelo com definição de firewall.

    • Adicione um recurso de extensão do Banco de Dados SQL à definição de banco 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 seguinte exemplo mostra o modelo atualizado:

      Captura de tela do modelo com extensão do banco de dados SQL.

      Para entender a definição de recurso, confira a referência de extensão de Banco de Dados SQL da versão da API. Abaixo estão alguns elementos importantes:

      • dependsOn: o recurso de extensão precisa ser criado depois da criação do banco de dados.
      • storageKeyType: Especifique o tipo da chave de armazenamento a ser usada. O valor pode ser StorageAccessKey ou SharedAccessKey. Use StorageAccessKey neste tutorial.
      • storageKey: Especifique a chave para a conta de armazenamento em que o arquivo BACPAC está armazenado. Se o tipo de chave de armazenamento for SharedAccessKey, ela deverá ser precedida por um "?".
      • storageUri: Especifique a URL do arquivo BACPAC armazenado em uma conta de armazenamento.
      • administratorLogin: o nome da conta do administrador do SQL.
      • administratorLoginPassword: A senha do administrador SQL. Para usar uma senha gerada, consulte Pré-requisitos.

O exemplo a seguir 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"
          }
        }
      ]
    }
  ]
}

Implantar o modelo

Use o nome do projeto e o local que foram usados quando você preparou o arquivo BACPAC. Isso coloca todos os recursos no mesmo grupo de recursos, o que é útil quando você exclui recursos.

  1. Entrar no Cloud Shell.

  2. Selecione PowerShell no canto superior esquerdo.

    Captura de tela do Azure Cloud Shell no PowerShell com a opção de carregar um arquivo.

  3. Selecione Upload arquivos/Download arquivos e carregue o arquivo azuredeploy. json.

  4. Para implantar o modelo, copie e cole o seguinte script na janela de 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 implantação

Para acessar o servidor no computador cliente, você precisará adicionar uma regra de firewall. O endereço IP do cliente e o endereço IP que é usado para se conectar ao servidor podem ser diferentes devido à NAT (conversão de endereços de rede). Para obter mais informações, confira Criar e gerenciar regras de firewall de IP.

Por exemplo, quando você entra no Editor de consultas, uma mensagem é exibida informando que o endereço IP não é permitido. O endereço é diferente do endereço IP do seu cliente devido ao NAT. Selecione o link da mensagem para adicionar uma regra de firewall para o endereço IP. Quando tiver terminado, você poderá excluir o endereço IP das configurações firewalls e redes virtuais do servidor.

No portal do Azure, no grupo de recursos, selecione o banco de dados. Selecione Editor de consultas (versão prévia) e insira as credenciais de administrador. Você verá que duas tabelas foram importadas para o banco de dados.

Captura de tela do Editor de consultas (visualização) no portal do Azure.

Limpar os recursos

Quando os recursos do Azure implantados não forem mais necessários, exclua o grupo de recursos. O grupo de recursos, a conta de armazenamento, o servidor de SQL e os bancos de dados SQL são excluídos.

  1. Na portal do Azure, insira Grupos de recursos na caixa de pesquisa.
  2. No campo Filtrar por nome, insira o nome do grupo de recursos.
  3. Selecione o nome do grupo de recursos.
  4. Selecione Excluir grupo de recursos.
  5. Para confirmar a exclusão, insira o nome do grupo recursos e selecione Excluir.

Próximas etapas

Neste tutorial, você implantou um servidor e um banco de dados e importou um arquivo BACPAC. Para saber como solucionar problemas de implantação de modelo, confira: