Añadir IP a Azure SQL DB con PowerShell

Azure brinda enormes ventajas; entre ellas, la posibilidad de poder configurarlo y administrarlo desde cualquier parte del mundo. Sin embargo en ambientes como el de SQLDB (antes conocido como SQL Azure) para poder entrar a administrar la DB la ip de nuestra máquina de trabajo ha de estar autorizada; así que cada vez que nos conectamos desde una IP nueva, debemos entrar al portal a autorizarla… y esto me parece una pérdida de tiempo que puede ahorrarse a través de las herramientas de automatización que Azure provee tanto para línea de comandos multiplataforma (Windows, Linux, MacOS) como para PowerShell (únicamente en Windows)

image

Las interfaces de comandos cross platform están basadas en JavaScript y requieren de NodeJS; las puedes descargar de aquí:

Pero; aunque hasta aquí vamos bien, podemos ir mejor! Y es que en Windows, como lo mencioné existe PowerShell que ofrece muchas más utilidades que la simple consola de comandos. Así que también se publicaron los cmdlets (así se llaman los comandos en PowerShell) para esta plataforma y los pueden descargar de aquí. El poder de PowerShell lo lleva hasta a integrarse a Visual Studio 2013, tal como lo ilustro en este post.

Los nombres técnicos que adquirieron cada uno de estos conjuntos de interfaces fueron azure-sdk-tools para PowerShell y azure-sdk-tools-xplat para las consolas cross platform. Y, siguiendo los links citados, podrán observar que además de todo, tanto el código C# para PowerShell como el código JavaScript para xplat ha sido abierto y publicado en GitHub.

Y bien, ya que los empapé con el contexto que gira alrededor de mi solución para el problemilla aquel de agregar la IP a mi servidor de SQLDB, les comento que decidí usar PowerShell con el fin de aprovechar que ahora puedo editar código PowerShell desde el mismísimo Visual Studio 2013, aprovechando características como IntelliSense y demás que hacen la codificación más agradable. Para lograr esto, instalé PowerShell Tools for Visual Studio 2013, que es una extensión para nuestro editor preferido. (Si quieres saber cómo construir tu propia extensión, haz clic aquí).

Luego de esto, de una manera bastante cómoda escribí las siguientes líneas de código, que con fines ilustrativos comentaré de manera extensiva:

 #
# SQLDBAuthCurrentIP.ps1
#===========================
#By: @WarNov 7/12/2014 - 18:12
#This script adds to the Specified SQL DB Server Database the IP
#of this machine as a new firewallrule



Param(

    #Nombre del servidor SQLDB ej. p5x8y4oi1z    
    [string]$serverName,  
    #Nombre de la regla de firewall que se insertará. A pesar de ser
    #obligatorio en el comando de Azure, en este script es opcional 
    #si se omite, el script produce un GUID como nombre
    #y lo pasa a Azure
    [string]$ruleName,
    #La ruta donde el archivo *.publishsettings está localizado con
    #la información de la suscripción de Azure a la que accederemos
    [string]$publish    
)


#Hacemos referencia a la suscripción de Azure, sencillamente 
#importando el archivo



Import-AzurePublishSettingsFile -PublishSettingsFile $publish

#Procesamos el nombre de la regla. Si viene vacío,
#creamos un GUID. Observen el manejo que se da a los comparadores
if($ruleName.Length -eq 0){
    #A través de .NET instanciamos la clase guid y asignamos
    $ruleName=[guid]::NewGuid();
}

#Ahora obtendremos la ip que queremos agregar. 
#Dado que no hay forma de obtener la ip externa usada por nuestro 
#cliente es necesario usar una herramienta online que nos informe
#cual es nuestra ip; en este caso, usaré una que construí yo mismo
#y que corre en Azure basada en un Generic Handler sencillo de
#ASP.NET; con esta sencilla línea de código: 
#Request.UserHostAddress
#Luego a través de .NET creamos un WebClient 
#y ejecutamos un downloadstring especificando la url
$ipAddress=(New-Object Net.WebClient).
        DownloadString('https://warnov.com/@ip')

#Finalmente ejecutamos el comando principal,
#que agregará la IP al servidor bajo la suscripción de Azure
New-AzureSqlDatabaseServerFirewallRule -ServerName $serverName `
    -RuleName $ruleName -StartIpAddress $ipAddress ` 
    -EndIpAddress $ipAddress

Ya con este script listo, lo podemos ejecutar desde el mismo VS2013 para chequear si hay posibles errores.

Una vez depurado, lo podemos llamar desde la consola de comandos, pasando como parámetro el nombre del servidor, el nombre de la regla (opcional) y la ruta del archivo de .publishsettings de Azure que se requiere para que tengamos acceso a la suscripción desde nuestra máquina. Este archivo se descarga una sola vez con este comando: azure account download

Un ejemplo de ejecución:

image

Y, como en la mayoría de casos tanto el nombre del servidor como el archivo de settings es el mismo, lo que podemos es hacer otro script que ponga estos parámetros automáticamente por nosotros, así cuando necesitemos agregar la IP solo llamamos a este segundo script sin necesidad de poner parámetros.

Así pues, hemos visto cómo mediante PowerShell podemos automatizar tediosas tareas como la de agregar la IP a Azure como una regla de firewall cada vez que queremos administrar nuestras bases de datos SQL DB desde una máquina distinta.

He abierto el código de este pequeño proyecto en Github, donde también podrán encontrar por ejemplo, una rutina que permite borrar todas las reglas de firewall que tengamos para un servidor SQL DB dado, a través de PowerShell: