Windows Azure Startups

Una de las cosas que más me gustan de la plataforma Windows Azure es que nuestras soluciones se convierten en un paquete capaz de acondicionar su entorno de vida :) Todos aquellos pasos previos, como la instalación de librerías, configuración de puertos en el firewall, etcétera, podemos definirlos gracias a la sección Startup del archivo ServiceDefinition.csdef.

Esta sección nos permite ejecutar cualquier tipo de acción desatendida que sea necesaria para cada una de las instancias de nuestro rol. Para verlo con un ejemplo, voy a mostrar cómo sería posible la instalación de las librerías de ASP.NET MVC 3, ya que, a día de hoy, estas no están disponibles por defecto en las imágenes que utilizan las instancias de Windows Azure.

En primer lugar, creamos un projecto de tipo cloud sin seleccionar ningún rol. Para poder añadir un proyecto del tipo ASP.NET MVC 3, seleccionamos con el botón derecho sobre la solución y hacemos clic sobre Add -> New Project…

por último seleccionamos la plantilla ASP.NET MVC 3 Web Application (En mi caso la plantilla que he utilizado fue Internet Application) y esperamos a que la misma se genere.

Si llegados a este punto pulsamos F5 para ejecutar la aplicación, Visual Studio nos informará del siguiente error:

El motivo es que, si bien hemos añadido una aplicación web a nuestro proyecto, la misma no está asociada con el proyecto cloud. Para ello, nos posicionamos en la carpeta Roles y, haciendo clic con el botón derecho sobre ella, seleccionamos Add -> Web Role Project in solution…

Pulsamos F5 para comprobar que en local todo funciona correctamente :)

Una vez que tenemos nuestro proyecto listo, descargamos el ejecutable para la instalación llamado AspNetMVC3ToolsUpdateSetup.exe desde el siguiente enlace.

Este archivo debemos incluirlo dentro del proyecto y modificar las propiedades del mismo para que sea copiado en el paquete que posteriormente subiremos a la nube.

¡Perfecto! Ya tenemos nuestra solución con una aplicación ASP.NET MVC 3 y el ejecutable que instalará las librerías necesarias para que el sitio web funcione en Windows Azure. Como último paso, debemos definir el apartado Startup y definir una tarea donde indiquemos que es necesario instalar ASP.NET MVC 3 antes de que la aplicación esté disponible para los usuarios. Para ello, abrimos el archivo ServiceDefinition.csdef donde añadimos la sección Startup con los siguientes valores:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="Startups" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="MyASPNETMVC3">
<Startup >
<Task commandLine ="installaspnetmvc3.cmd" executionContext="elevated" taskType="simple"></Task>
</Startup>
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
</WebRole>
</ServiceDefinition>

Dentro del apartado Startup podemos tener tantas tareas como sean necesarias con los siguiente parámetros:

  • commandLine: Recibe como valor el nombre del programa o script que queremos ejecutar. En este caso vamos a invocar a un archivo llamado installaspnetmvc3.cmd, el cual situaremos en la raiz del proyecto web.

    En él vamos a incluir la llamada al archivo AspNetMVC3ToolsUpdateSetup.exe con la opción /q para indicar que debe ser una instalación “silenciosa” o desatendida ;)
    E:approotfilesAspNetMVC3ToolsUpdateSetup.exe /q
  • Nota: Existe un problema a la hora de generar scripts desde Visual Studio, el cual añade un byte para marcar todos los ficheros por defecto. Para evitar incidentes, recomiendo crear estos archivos con Notepad o modificar las opciones de guardado en File -> Advanced Save Options… donde deberemos seleccionar Unicode (UTF-8 without signature) – Codepage 650001 encoding.

  • executionContext: Nos permite indicar el nivel de permisos que queremos que tenga la tarea (limited o elevated)
  • taskType: Dependiendo de la implicación que tenga nuestra tarea en relación con el rol, podemos elegir entre:
    • simple: Se trata del tipo de tarea síncrona, la cual paraliza cualquier proceso hasta que la misma termina. Si no especificamos ningún tipo, esta es la opción por defecto.
    • background: Nuestra tarea se ejecutará a la par que otras (la ejecución de nuestro rol por ejemplo).
    • foreground: A diferencia del tipo anterior, cuando especificamos una tarea foreground esta se ejecutará de manera asíncrona como la anterior. La peculiaridad consiste en que el rol no podrá detenerse hasta que dicha tarea haya finalizado.

Si desplegamos nuestra aplicación en Windows Azure, podremos disfrutar de ASP.NET MVC 3 gracias a Startup section :D

Espero que haya sido de utilidad :)

¡Saludos!