Parando las máquinas virtuales en Microsoft Azure

En varias conversaciones sobre el estado de las máquinas en Microsoft Azure, siempre queda la duda sobre qué ocurre realmente y cuál es el sistema para evitar cargos adicionales a nuestra cuenta.

Cuando creamos una nueva máquina virtual, el estado natural es Running, con el que tenemos la máquina funcionando. Sin embargo, nos está permitido dentro de la plataforma reiniciar e incluso parar las máquinas, a través del menú inferior, desde el propio SO, PowerShell, ectétera.

En cuanto al apagado de la máquina, existen tres formas de llevarlo a cabo: a través del botón del portal, desde el propio SO de la máquina o a través de la API REST, usando por ejemplo Powershell.

Cuando hacemos clic en el botón SHUT DOWN, la VM es apagada de manera segura y desasigna los recursos asociados. Esto significa que actualmente no está haciendo uso de los recursos del datacenter, como CPU, memoria y red. En cuanto al coste por computación, en este estado no se está facturando por la máquina. Un dato importante a tener en cuenta es que cuando pasamos una máquina a un estado Stopped (Deallocated) la DIP y VIP no se mantendran.

IP addresses will be released

La máquina aparecerá con el estado Stopped (Deallocated):

VM stopped deallocated

Y en el quick glance podremos ver que no hay asignados un host name, DIP y VIP.

Stopped Deallocated IPs

Esto puede significar que la próxima vez que la máquina se inicie reciba una DIP y una VIP diferente. Para que esto se de, pueden ocurrir varios escenarios: Si hay más de una VM en un Cloud Service, la VIP se mantiene siempre y cuando haya una VM iniciada (se perderá cuando todas las VM estén apagadas en el mismo momento). La DIP se pierde cuando apagas la máquina e inicias/creas una nueva que ocupe su lugar.

Si damos la orden de apagado desde dentro del SO, la máquina se apagará pero no desasignará los recursos asociados a la misma, es decir que mantendra la misma DIP y VIP obtenidas en el último inicio y seguirá suponiendo un gasto de computación:

VM stopped

En este caso, como podemos comprobar en el quick glance, las IPs y el host name se mantienen para la máquina:

quick glance stopped vm

Un último caso, es llevar a cabo la parada del servicio desde PowerShell a través de Stop-AzureVM.

Stop-AzureVM -ServiceName "shutdowntesting" -Name "sql2014testing"

A través del comando anterior, conseguimos que el servicio pase a un estado Stopped (Deallocated). La consola nos mostrará un cuadro de diálogo de confirmación, ya que esta acción desasignará los recursos:

Confirm Stop-AzureVM

Si quisiéramos mantener los recursos ligados al servicio, basta con añadir la opción -StayProvisioned, con lo que la VM pasará solamente a un estado Stopped.

Stop-AzureVM -ServiceName "shutdowntesting" -Name "sql2014testing" -StayProvisioned

Actualización 01/07/2014: A día de hoy existe la posibilidad de reservar IPs públicas, evitando así la pérdida de la IP asignada cuando se paran las máquinas de un Cloud Service. Más información en el siguiente post: Reserva de IPs en Microsoft Azure.

¡Saludos!

Microsoft Azure IaaS: Creación de VMs y asignación de IPs internas (DIPs) desde PowerShell

Cuando necesitamos tener una creación estructurada de un conjunto de máquinas es interesante apoyarnos en PowerShell, ya que una vez establecidos los parámetros es un proceso mucho más rápido y personalizable que desde el portal.

Por otro lado, cuando trabajamos con Virtual Networks en Microsoft Azure, es importante saber que existe la posibilidad de asignar una IP específica a una máquina virtual, dentro del rango de IPs de la subnet elegida.

En este post voy a mostrar cómo es posible crear una máquina virtual desde Powershell y cómo configurar una IP estática interna para dicha máquina.

Creación de una máquina virtual desde PowerShell

Si bien es cierto que existen numerosos parámetros para la creación de una máquina, en este post voy a intentar simplificarlo a los mínimos necesarios para la creación. Hay que tener en cuenta de que debemos combinar varios comandos:

  1. New-AzureVMConfig: Crea un objeto de configuración de la VM, donde se indica el tamaño que debe tener la máquina, la imagen que se va a utilizar, el availability set, etcétera.
  2. Add-AzureProvisioningConfig: Una vez que se ha elegido el tipo de máquina, a través de la imagen, es necesario establecer algunos valores como el nombre de usuario, la contraseña, dominio, certificados, etcétera.
  3. New-AzureVM: Una vez completados los pasos anteriores ya es posible lanzar la creación de la máquina. A través de este comando confirmamos el nombre del cloud service a usar, affinity group o localización, etcétera.

Un ejemplo de creación de una máquina virtual small con Windows Server 2012 R2 Datacenter sería el siguiente:

$image = (Get-AzureVMImage | Where-Object {$_.Label -like "Windows Server 2012 R2 Datacenter, March 2014"}).ImageName
$adminUserName = "gis"
$pwd = "Passw0rd!"
$serviceName = "myfarmscv"
$affinitygroup = "Europe"
$vm = "mygisvm2"


New-AzureVMConfig -Name $vm -InstanceSize Small -ImageName $image  |
Add-AzureProvisioningConfig -windows -AdminUsername $adminUserName -Password $pwd |
New-AzureVM -ServiceName $serviceName -AffinityGroup $affinitygroup

En el apartado superior, he creado un conjunto de variables con los datos que necesito para la creación: el nombre de la imagen que quiero utilizar, nombre de usuario, contraseña, nombre del cloud service, el affinity group que quiero utilizar y el nombre de la máquina.

Si quisiéramos añadir la máquina a un cloud service que ya está creado bastaría con omitir el parámetro -AffinityGroup o -Location.

El segundo apartado es la ejecución de los tres comandos mencionados anteriormente concatenados entre sí. El resultado esperado de la operación debe ser similar al siguiente:

VM creation Powershell

Antes de la creación de máquinas a través de PowerShell, debemos asegurarnos de que tenemos una cuenta de storage por defecto asociada a la suscripción. Para ello, podemos lanzar el comando Get-AzureSubscription y comprobar el valor de CurrentStorageAccountName. Esta cuenta se utiliza por defecto para almacenar los vhds de las máquinas virtuales que creamos. De no definir ninguna cuenta, si intentamos crear una máquina nos devolverá un error. El siguiente comando nos permite establecer una por defecto:

Set-AzureSubscription -SubscriptionName “mysuscriptionname” -CurrentStorageAccountName “mystorage”

Por otro lado, si quisiéramos indicar el storage a utilizar en cada creación, debemos utilizar el parámetro -MediaLocation a nivel del comando New-AzureVMConfig

Creación y asignación de IP

Otra de las configuraciones que podríamos añadir a la creación de una máquina virtual es la asociación a una red virtual y, además, la IP queremos que tenga la máquina dentro de la misma (desde el portal a día de hoy no es posible esta operación). Para ello, podemos ampliar el comando anterior con Set-AzureSubnet y Set-AzureStaticVNetIP, además de añadir, a través del comando New-AzureVM, la red virtual a la que debe pertenecer la máquina:

$image = (Get-AzureVMImage | Where-Object {$_.Label -like "Windows Server 2012 R2 Datacenter, March 2014"}).ImageName
$adminUserName = "gis"
$pwd = "Passw0rd!"
$serviceName = "myfarmscv"
$vm = "mygisvm2"
$vnet = "gis-network"
$subnet = "front-end"

New-AzureVMConfig -Name $vm -InstanceSize Small -ImageName $image |
Set-AzureSubnet -SubnetNames $subnet | Set-AzureStaticVNetIP -IPAddress 192.168.1.5 |
Add-AzureProvisioningConfig -Windows -AdminUsername $adminUserName -Password $pwd |
New-AzureVM -ServiceName $serviceName -VNetName $vnet

En el código anterior, he creado una VM dentro de un cloud service que ya existe y le he asignado una red virtual (gis-network), la subnet a la que debe pertenecer y qué IP quiero asignarle de manera explícita. Existe un comando que podemos utilizar para comprobar la disponibilidad de una IP dentro de una subnet:

Test-AzureStaticVNetIP -VNetName "gis-network" -IPAddress 192.168.1.5

Para más información sobre la configuración de IPs internas puedes consultar el siguiente enlace.

¡Saludos!

Subir un vhd de datos a través de Windows Azure PowerShell y asociarlo a una VM

Una tarea común cuando trabajamos con máquinas virtuales es subir un conjunto de archivos o ejecutables para tenerlos disponibles desde el cloud.
Como sabéis, desde la administración de nuestro equipo, en Disk Management podemos crear discos VHD, montarlos en nuestro local, añadir los elementos necesarios y desmontarlo de nuevo con el objetivo de que pueda ser trasladado a otra máquina.

En este post voy a mostrar cómo es posible subir un vhd utilizando Windows Azure PowerShell y cómo podríamos montarlo en una máquina virtual existente.
Si todavía no tienes instalado Windows Azure Powershell puedes hacerlo desde la página de descargas de Windows Azure (Command-line tools – Windows PowerShell).

Si es la primera vez que utilizamos la consola con una suscripción, el primer paso es recuperar el archivo con la configuración de la misma:

Get-AzurePublishSettingsFile

Este comando abrirá una ventana de nuestro navegador y descargará el archivo. Una vez lo hemos recuperado, importamos el mismo a través del siguiente comando:

Import-AzurePublishSettingsFile 'C:\vms\My-subscription.publishsettings'

A partir de este momento tenemos acceso a todos los servicios creados en esta suscripción. Con la conexión establecida a través de Powershell, y nuestro vhd listo, debemos lanzar el siguiente comando para que inicie la subida a la plataforma:

Add-AzureVhd -Destination http://gisvhds.blob.core.windows.net/vhds/gis.vhd -LocalFilePath C:\vms\gis.vhd

Una vez finalizado, el mensaje por consola debería ser parecido al siguiente:

vhd uploaded Windows Azure Powershell

Para asociar este vhd a una máquina virtual, primero debemos registrarlo como disco:

Add-AzureDisk -DiskName "mydata" -MediaLocation "http://gisvhds.blob.core.windows.net/vhds/gis.vhd" -Label "gisvhd"

A partir de este momento, aparecerá en el apartado Disks de Virtual Machines:

Virtual Marchines Disks

Por último, vinculamos el mismo a la máquina que queramos a través de Add-AzureDataDisk:

 Get-AzureVM "myiisservice" -Name "VM1" ` | Add-AzureDataDisk -Import -DiskName "mydata" -LUN 0 ` | Update-AzureVM

Podemos comprobar en el portal que el disco queda asociado a la máquina seleccionada:

mydata attached to VM1

Dependiendo del tamaño de nuestra máquina podremos agregar un número determinado de discos. Esta información se puede consultar en Virtual Machine and Cloud Service Sizes for Windows Azure.

Espero que sea de utilidad.

¡Saludos!