Wednesday, November 20, 2013

Como compartir archivos entre una VM y un Web Role en diferentes Cloud Services

Al migrar una aplicación Web (o cualquier aplicación) a la nube resulta habitual encontrarse con la necesidad de almacenar archivos en un file share. Y si bien esta necesidad es una típica candidata a resolverse mediante el uso de Windows Azure Blob Storage, muchas veces esta posibilidad resulta compleja de implementar en forma inmediata ya que generalmente implica modificar el código de la aplicación.

La solución que rápidamente viene a la mente es crear un File Share en alguna VM para que nuestra aplicación pueda leer y escribir archivos, de la misma forma que lo haría en nuestro ambiente on-premises. Sin embargo, esto que resulta bastante obvio de hacer en un ambiente local no lo es en la nube, ya que típicamente nuestros servicios virtualizados (VMs, web roles y worker roles) pueden encontrarse en diferentes redes securizadas dentro del datacenter de Windows Azure.

Para ilustrar esta situación imaginemos que tenemos que configurar un Web Role ejecutando en su propio cloud service, y que contiene un directorio virtual apuntando a un file share en una VM ejecutando en otro cloud service. ¿Como logramos esta configuración? La siguiente lista lo resume:

1. Crear un grupo de afinidad (Azure Portal -> Settings -> Affinity Groups)
2. Crear la VM asociándola al grupo de afinidad que acabamos de crear
3. Crear el Web Role en el mismo grupo de afinidad
4. Crear un cuenta local de usuario en la VM (que tendrá acceso a la carpeta a compartir)
5. Crear una carpeta compartida en la VM (de la misma forma que lo haríamos localmente). Al hacerlo la primera vez Windows nos preguntará si queremos habilitar "File and Printer Sharing" para la red a la que estamos conectados, a lo cual responderemos que sí. Esto creará las reglas necesarias en el Windows Firewall para poder acceder a la carpeta compartida
6. Asegurarse que el usuario tenga permisos de lectura o escritura sobre la carpeta compartida
7. Crear un Endpoint en la instancia de la VM para brindar acceso al puerto TCP 445 (Azure Portal-> virtual machines -> Instances -> Endpoints)
8. Crear una cuenta local de usuario en el Web Role del mismo nombre y contraseña que la creada en la VM
9. Cambiar el path del virtual directory en el sitio web para que apunte al share de la VM (utilizar el path UNC compuesto por el nombre completo de la VM, es decir \\[nombreVM].cloudapp.net\[nombrefileShare])

Acá van algunos screenshots de donde están todas estas configuraciones:

1. Crear un grupo de afinidad (Azure Portal -> Settings -> Affinity Groups)




2. Crear la VM asociándola al grupo de afinidad que acabamos de crear



3. Crear el Web Role en el mismo grupo de afinidad



7. Crear un Endpoint en la instancia de la VM para brindar acceso al puerto TCP 445