Para un entorno de pruebas que estoy montando, en el que todo tiene que estar desplegado en máquinas virtuales, he estado dedicándole un ratito a la que tiene el rol de base de datos. No he encontrado cómo generar la máquina virtual y además instalar SQL Server IaaS agent extension utilizando Azure CLI, y es por ello que hoy quiero compartir contigo cuáles son los comandos que he utilizado.
Variables
Para la creación de este entorno vas a necesitar como mínimo estas variables:
# General variables
RESOURCE_GROUP="tour-of-heroes-on-vms"
LOCATION="westeurope"
VM_SIZE="Standard_B2s"
STORAGE_ACCOUNT_NAME="tourofheroesbackups"
# VNET variables
VNET_NAME="tour-of-heroes-vnet"
VNET_ADDRESS_PREFIX=192.168.0.0/16
DB_SUBNET_NAME="db-subnet"
DB_SUBNET_ADDRESS_PREFIX=192.168.1.0/24
# SQL Server VM on Azure
DB_VM_NAME="db-vm"
DB_VM_IMAGE="MicrosoftSQLServer:sql2022-ws2022:sqldev-gen2:16.0.230613"
DB_VM_ADMIN_USERNAME="dbadmin"
DB_VM_ADMIN_PASSWORD="Db@dmin123!$"
DB_VM_NSG_NAME="db-vm-nsg"
Crear el grupo de recursos y la red virtual
Antes de poder crear la máquina virtual con SQL Server necesitas un grupo de recursos y una red virtual donde esta pueda vivir:
echo -e "Creating resource group $RESOURCE_GROUP in $LOCATION"
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
echo -e "Creating virtual network $VNET_NAME with address prefix $VNET_ADDRESS_PREFIX and subnet $DB_SUBNET_NAME with address prefix $DB_SUBNET_ADDRESS_PREFIX"
az network vnet create \
--resource-group $RESOURCE_GROUP \
--name $VNET_NAME \
--address-prefixes $VNET_ADDRESS_PREFIX \
--subnet-name $DB_SUBNET_NAME \
--subnet-prefixes $DB_SUBNET_ADDRESS_PREFIX
Crear máquina virtual con SQL Server
Con las variables que hemos definido al inicio de este artículo, podemos crear la máquina virtual con el siguiente comando:
echo -e "Create a database vm named $DB_VM_NAME with image $DB_VM_IMAGE"
az vm create \
--resource-group $RESOURCE_GROUP \
--name $DB_VM_NAME \
--image $DB_VM_IMAGE \
--admin-username $DB_VM_ADMIN_USERNAME \
--admin-password $DB_VM_ADMIN_PASSWORD \
--vnet-name $VNET_NAME \
--subnet $DB_SUBNET_NAME \
--size $VM_SIZE
Sin embargo, con este no somos capaces de configurar características propias de un SQL Server, como el backup, actualizaciones, el usuario para la autenticación vía SQL login, entre otras.
Instalar SQL Server IaaS Agent extension
Para todo lo anterior, tenemos una extensión llamada SQL Server IaaS agent que nos permite simplificar esta parte para aquellas instancias de SQL Server que vivan en máquinas virtuales. Para configurar dicho agente puedes hacerlo también a través de Azure CLI de la siguiente manera:
echo -e "Create a storage acount for the backups"
az storage account create \
--name $STORAGE_ACCOUNT_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--sku Standard_LRS \
--kind StorageV2
STORAGE_KEY=$(az storage account keys list \
--resource-group $RESOURCE_GROUP \
--account-name $STORAGE_ACCOUNT_NAME \
--query "[0].value" \
--output tsv)
echo -e "Add SQL Server extension to the database vm"
az sql vm create \
--name $DB_VM_NAME \
--license-type payg \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--connectivity-type PUBLIC \
--port 1433 \
--sql-auth-update-username $DB_VM_ADMIN_USERNAME \
--sql-auth-update-pwd $DB_VM_ADMIN_PASSWORD \
--backup-schedule-type manual \
--full-backup-frequency Weekly \
--full-backup-start-hour 2 \
--full-backup-duration 2 \
--storage-account "https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/" \
--sa-key $STORAGE_KEY \
--retention-period 30 \
--log-backup-frequency 60
Como ves, primero creo una cuenta de almacenamiento donde voy a almacenar los backups de mi base de datos y después, a través del comando az sql vm create, instalo y configuro la extensión. Una vez completado este paso podrás ver en el portal que tienes dos recursos asociados con tu máquina virtual: el de la propia máquina y el que nos permite configurar las propiedades de este agente.

Si accedes a la segunda verás algo como lo siguiente:
Importante: en este caso se le está pidiendo al agente que la configuración de este SQL Server sea para que permita conexiones públicas (–connectivity-type PUBLIC), lo cual no es lo adecuado para un entorno productivo. Si quieres ver una configuración de tipo privada puedes echar un vistazo a este otro artículo, donde me comunico internamente con la base de datos a través de una API dentro de su misma red.
Crear network security group para dar acceso desde el exterior
Para finalizar, si lo que quieres es acceder a tu SQL Server desde tu local necesitas crear y configurar un network security group de la siguiente forma:
echo -e "Create a network security group for the database vm"
az network nsg create \
--resource-group $RESOURCE_GROUP \
--name $DB_VM_NSG_NAME
echo -e "Create a network security group rule for SQL Server port 1433"
az network nsg rule create \
--resource-group $RESOURCE_GROUP \
--nsg-name $DB_VM_NSG_NAME \
--name AllowSQLServer \
--priority 1001 \
--destination-port-ranges 1433 \
--direction Inbound
echo -e "Create a network security group rule for RDP port 3389"
az network nsg rule create \
--resource-group $RESOURCE_GROUP \
--nsg-name $DB_VM_NSG_NAME \
--name AllowRDP \
--priority 1002 \
--destination-port-ranges 3389 \
--direction Inbound
echo -e "Associate the network security group to the database vm"
az network nic update \
--resource-group $RESOURCE_GROUP \
--name "${DB_VM_NAME}VMNic" \
--network-security-group $DB_VM_NSG_NAME
Si ahora intentas acceder con SQL Server Management Studio o Azure Data Studio podrás comprobar que puedes acceder sin problemas a tu nuevo SQL Server en tu máquina virtual en Azure.
¡Saludos!