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:
Visual Studio Code con la extensión Herramientas de Resource Manager. Consulte Quickstart: Creación de plantillas de ARM mediante Visual Studio Code.
Para aumentar la seguridad, utilice una contraseña generada para la cuenta de administrador del servidor. Puede usar Azure Cloud Shell ejecutar el siguiente comando en PowerShell o Bash:
openssl rand -base64 32
Para más información, ejecute
man openssl rand
para abrir la página manual.Azure Key Vault está diseñado para proteger las claves criptográficas y otros secretos. Para más información, consulte el Tutorial: Integración de Azure Key Vault en la implementación de la plantilla de Resource Manager. También se recomienda actualizar la contraseña cada tres meses.
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.
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 ..."
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.
En Visual Studio Code, seleccione Archivo>Abrir archivo.
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
Seleccione Abrir para abrir el archivo.
En la plantilla hay dos recursos definidos:
Microsoft.Sql/servers
. Consulte la referencia de plantilla.Microsoft.SQL.servers/databases
. Consulte la referencia de plantilla.Resulta útil obtener cierta información básica de la plantilla antes de personalizarla.
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
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 propiedadadminPassword
. Para dar formato al archivo JSON desde Visual Studio Code, seleccione Mayús+Alt+F.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:
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:
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 oStorageAccessKey
oSharedAccessKey
. UseStorageAccessKey
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 esSharedAccessKey
, 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.
Inicie sesión en Cloud Shell.
Seleccione PowerShell en la esquina superior izquierda.
Seleccione Cargar/descargar archivos y cargue el archivo azuredeploy.json.
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.
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.
- En Azure Portal, escriba Grupo de recursos en el cuadro de búsqueda.
- Escriba el nombre del grupo de recursos en el campo Filtrar por nombre.
- Seleccione el nombre del grupo de recursos.
- Seleccione Eliminar grupo de recursos.
- 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: