Compartir a través de


Tutorial: Importación de archivos BACPAC de SQL con plantillas de Resource Manager

Aprenda a usar las extensiones de Azure SQL Database para importar un archivo BACPAC con las plantillas de Azure Resource Manager (ARM). Los artefactos de implementación son cualquier archivo, además de los archivos de la plantilla principal, que se necesitan para completar una implementación. El archivo BACPAC es un artefacto.

En este tutorial creará una plantilla para implementar un servidor SQL lógico y una base de datos única, e importar un archivo BACPAC. Para más información sobre la implementación de extensiones de máquina virtual de Azure mediante plantillas de Azure Resource Manager, consulte Tutorial: Implementación de extensiones de máquina virtual con plantillas de Resource Manager.

En este tutorial se describen las tareas siguientes:

  • Preparación de un archivo BACPAC.
  • Apertura de una plantilla de inicio rápido.
  • Edición de la plantilla.
  • Implemente la plantilla.
  • Comprobación de la implementación.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

Para completar este artículo, necesitará lo siguiente:

Preparación de un archivo BACPAC

En GitHub se comparte un archivo BACPAC. Para crear el suyo propio, consulte Exportación de una base de datos de Azure SQL Database a un archivo BACPAC. Si elige publicar el archivo en su propia ubicación, tendrá que actualizar la plantilla más adelante en el tutorial.

El archivo BACPAC se debe almacenar en una cuenta de Azure Storage para poder importarlo con una plantilla de Resource Manager. El siguiente script de PowerShell prepara el archivo BACPAC con estos pasos:

  • Descargue el archivo BACPAC.
  • Cree una cuenta de Azure Storage.
  • Cree un contenedor de blobs en una cuenta de almacenamiento.
  • Cargue el archivo BACPAC en el contenedor.
  • Muestre la clave de la cuenta de almacenamiento, la dirección URL del blob, el nombre del grupo de recursos y la ubicación.
  1. Seleccione Probar para abrir Cloud Shell. Luego, copie y pegue el siguiente script de PowerShell en la ventana del 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 la clave de la cuenta de almacenamiento, la dirección URL del archivo BACPAC, el nombre del proyecto y la ubicación. Estos valores los usará al implementar la plantilla más adelante en este tutorial.

Apertura de una plantilla de inicio rápido

La plantilla que se usa en este tutorial se almacena en GitHub.

  1. En Visual Studio Code, seleccione Archivo>Abrir archivo.

  2. En Nombre de archivo, pegue el código URL siguiente:

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Seleccione Abrir para abrir el archivo.

    En la plantilla hay dos recursos definidos:

  4. Seleccione Archivo>Guardar como para guardar una copia del archivo en la máquina local con el nombre azuredeploy.json.

Edición de la plantilla

  1. Agregue dos parámetros más al final de la sección parameters para establecer la clave de la cuenta de almacenamiento y la dirección URL de 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."
          }
        }
    

    Agregue una coma después de la llave de cierre (}) de la propiedad adminPassword. Para dar formato al archivo JSON desde Visual Studio Code, seleccione Mayús+Alt+F.

  2. Agregue dos recursos a la plantilla.

    • Para permitir que la extensión de SQL Database importe archivos BACPAC, debe permitir el tráfico desde los servicios de Azure. Cuando se implementa SQL servidor, la regla de firewall activa la opción Permitir que los servicios y recursos de Azure accedan a este servidor.

      Agregue la siguiente regla de firewall en la definición del 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"
          }
        }
      ]
      

      En el ejemplo siguiente se muestra la plantilla actualizada:

      Captura de pantalla de la plantilla con definición firewall.

    • Agregue un recurso de extensión de SQL Database a la definición de la base de datos con el siguiente código 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"
          }
        }
      ]
      

      En el ejemplo siguiente se muestra la plantilla actualizada:

      Captura de pantalla de la plantilla con extensión a SQL Database.

      Para conocer la definición de recursos, consulte la referencia de extensiones de SQL Database de la versión de la API. Estos son algunos elementos importantes:

      • dependsOn: el recurso de la extensión debe crearse después de que se haya creado la base de datos.
      • storageKeyType: especifique el tipo de clave de almacenamiento que se usa. El valor puede ser o StorageAccessKey o SharedAccessKey. Use StorageAccessKey en este tutorial.
      • storageKey: Especifique la clave de la cuenta de almacenamiento donde se almacena el archivo BACPAC. Si el tipo de clave de almacenamiento es SharedAccessKey, debe ir precedida de "?".
      • storageUri: Especifique la dirección URL del archivo BACPAC almacenado en una cuenta de almacenamiento.
      • administratorLogin: nombre de la cuenta del administrador de SQL.
      • administratorLoginPassword: contraseña del administrador de SQL. Para usar una contraseña generada, consulte los requisitos previos.

En el ejemplo siguiente se muestra la plantilla completada:

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

Implementación de la plantilla

Use el nombre del proyecto y la ubicación que se usaron al preparar el archivo BACPAC. Esto agrupa todos los recursos en el mismo grupo de recursos, lo que resulta útil cuando se eliminan recursos.

  1. Inicie sesión en Cloud Shell.

  2. Seleccione PowerShell en la esquina superior izquierda.

    Captura de pantalla de Azure Cloud Shell en PowerShell con la opción de cargar un archivo.

  3. Seleccione Cargar/descargar archivos y cargue el archivo azuredeploy.json.

  4. Para implementar la plantilla, copie y pegue el siguiente script en la ventana del 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 ..."
    

Comprobación de la implementación

Para acceder al servidor desde el equipo cliente, es preciso agregar una regla de firewall. La dirección IP del cliente y la dirección IP que se usa para conectarse al servidor pueden ser diferentes debido a la traducción de direcciones de red (NAT). Para más información, consulte Creación y administración de reglas de firewall de IP.

Por ejemplo, al iniciar sesión en el Editor de consultas se muestra un mensaje que indica que no se permite la dirección IP. La dirección es diferente de la dirección IP del cliente debido a NAT. Seleccione el vínculo del mensaje para agregar una regla de firewall para la dirección IP. Cuando haya terminado, puede eliminar la dirección IP de la configuración de Firewalls y redes virtuales del servidor.

En Azure Portal, en el grupo de recursos, seleccione la base de datos. Seleccione Editor de consultas (versión preliminar) y escriba las credenciales de administrador. Verá que se han importado dos tablas en la base de datos.

Captura de pantalla del editor de consultas (vista preliminar) en Azure Portal.

Limpieza de recursos

Cuando los recursos de Azure que implementó dejen de ser necesarios, elimine el grupo de recursos. Se eliminan el grupo de recursos, la cuenta de almacenamiento, el servidor SQL Server y las bases de datos SQL.

  1. En Azure Portal, escriba Grupo de recursos en el cuadro de búsqueda.
  2. Escriba el nombre del grupo de recursos en el campo Filtrar por nombre.
  3. Seleccione el nombre del grupo de recursos.
  4. Seleccione Eliminar grupo de recursos.
  5. Para confirmar la eliminación, escriba el nombre del grupo de recursos y seleccione Eliminar.

Pasos siguientes

En este tutorial ha implementado un servidor y una base de datos, y ha importado un archivo BACPAC. Para obtener información sobre cómo solucionar problemas de implementación de plantillas, consulte: