Como componer aplicaciones Windows Azure AppFabric ?


Windows Azure AppFabric ofrece servicios en dos areas distintas. La primera la forman servicios de middleware como Service Bus, Access Control, Caching e Integration. La segunda está formada por un servicio para contener aplicaciones AppFabric, un gestor de estas aplicaciones que se ofrece desde el portal de la plataforma y herramientas para el desarrollo de este tipo de aplicaciones.

La segunda area, Windows Azure AppFabric Applications, está en CTP desde Junio pasado y es el motivo de este post.

Las aplicaciones AppFabric están compuestas por componentes orientados a Azure que se orquestan de forma gráfica con nuevos diseñadores para Visual Studio. Cuando hacemos un build de estas aplicaciones se genera un único fichero que contiene los componentes y configuración necesarios para su despliegue en la plataforma Azure. Para ello podremos utilizar Visual Studio y también el gestor de aplicaciones AppFabric que proporciona el portal.

Con este gestor de aplicaciones el personal de IT podrá encargarse del despliegue y gestión de estas nuevas aplicaciones, permitiendo una separación efectiva de responsabilidades en la organización.

Como el resto de funciones AppFabric en CTP este nuevo servicio se ofrece desde el sitio https://portal.appfabriclabs.com/:

Con el botón superior izquierdo "Request Namespace" podremos solicitar un espacio de nombres para un servicio con la funcionalidad de gestión de aplicaciones habilitada. Recibiremos un correo confirmando el espacio de nombres reservado con el que podremos desplegar y gestionar aplicaciones AppFabric en la plataforma.

El SDK de AppFabric del CTP y las herramientas para Visual Studio de AppFabric están aquí. La instalación te guía en todo momento indicándote sus posibles incompatibilidades con el software instalado, por ejemplo Windows Server AppFabric. También advierte del software que te falta, por ejemplo una versión Express de SQL Server 2008.

Una vez instalado lo necesario en este enlace encontraremos un tutorial para construir nuestra primera aplicación. Destacan los nuevos diseñadores gráficos y el gran número de componentes que podemos utilizar: aplicaciones web ASP.NET, blobs y tablas de Azure Storage, caching, subscripciones colas y tópicos de Service Bus, bases de datos SQL Azure, programador de tareas, servicios WCF con o sin estado y WorkFlows.

La herramienta permite conectar los componentes entre sí de forma gráfica y ofrece un diagrama de la aplicación que puede resultar útil para comunicar cómo funciona la aplicación:

También destaca que los emuladores de Azure que proporciona en entorno de desarrollo incluyen los nuevos contenedores de aplicaciones AppFabric, por lo que podremos probar y poner a punto la aplicación en local antes de su despliegue en la plataforma.

Al finalizar podremos desplegar la aplicación en Azure directamente desde Visual Studio y también desde el gestor de aplicaciones que proporciona el portal, utilizando el fichero con extensión .afpkg que se genera con cada build de la solución. Este fichero contiene todos los componentes y configuraciones necesarios para su despliegue en la plataforma. Es un zip que podemos examinar si tenemos curiosidad:

En siguientes posts veremos como publicar aplicaciones AppFabric en la plataforma y la información que ofrece el gestor de aplicaciones que proporciona el portal.

author: Alfredo Delsors | Posted On Wednesday, October 05, 2011 9:36 PM | Feedback (0)

Como utilizar WebDeploy para actualizar rápidamente una aplicación en Azure durante su desarrollo ?


Windows Azure SDK 1.4 Refresh proporciona WebDeploy, una tecnología que permite actualizaciones rápidas de un Web role sin tener que publicar de nuevo toda la aplicación en Azure para facilitar las tareas de desarrollo. Es un procedimiento de IIS descrito aquí hace algún tiempo por Wade Wegner. Cuando la instancia se recicle todos los cambios realizados a través de WebDeploy se perderán.

Ahora WebDeploy se incluye en el SDK. No he podido encontrar ninguna información explicando como utilizarla, pero después de algunas investigaciones he conseguido utilizarla tal como explico en este post.

WebDeploy se proporciona como un plugin y como cualquier otro plugin en Azure, hay que añadir una nueva entrada Import en la sección Imports del fichero de configuración de la aplicación ServiceDefinition.csdef:

    <Imports>
      <Import moduleName="WebDeploy" />

Cuando se despliega la aplicación se ha de configurar una conexión de desktop remoto proporcionando las credenciales necesarias:

Cuando el desktop remoto esté configurado hay que activar la opción "Enable Web Deploy":

Una vez desplegada la aplicación, cualquier instancia de Web role puede ser actualizada rápidamente publicando la aplicación y seleccionando Web Deploy:

El nombre del sitio es el nombre de la instancia (WebRole1_IN_0) seguido por "_Web", las credenciales son las credenciales configuradas para el desktop remoto.

Es extraordinario lo fácil que es. Buen trabajo.

author: Alfredo Delsors | Posted On Saturday, April 16, 2011 12:10 PM | Feedback (0)

Como autoescalar instancias en Azure basándose en el calendario?


Imagina que tenemos una aplicación corporativa para completar tareas como el registro de los gastos del empleado por ejemplo. Todo parece indicar que esta aplicación va a utilizarse mucho durante la semana y poco durante el fin de semana. Se puede ahorrar bastante dinero en la factura mensual de Azure reduciendo el número de instancias en ejecución dependiendo del calendario. Esta clase de escalado es fácil de implementar en Azure utilizando cmdlets PowerShell y el programador de tareas incluido en Windows 7 / Windows Server 2008.

Patterns & Practices publica un libro en línea "Moving Applications to the Cloud on the Microsoft Windows Azure Platform" donde pueden verse los detalles del ahorro obtenido por este tipo de escalado del servicio por calendario en el capítulo "How Much Will it Cost?" en http://msdn.microsoft.com/en-us/library/ff803375.aspx (ver la sección Variations).

Primero son necesarios los scripts PowerShell que se necesitan para incrementar o decrementar el número de instancias de Azure a través de internet http://archive.msdn.microsoft.com/azurecmdlets/, que "... provides a set of cmdlets that wrap the Windows Azure Management and Diagnostics APIs and enable a user to configure and manage their Windows Azure operations. ".

Un ejemplo del script requerido para escalar a 2 el número de instancias, requeridas para mantener el SLA de Microsoft, es:

Add-PSSnapin AzureManagementToolsSnapIn

$cert = Get-Item cert:\CurrentUser\My\EBF61XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

$sub = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'

Get-HostedServices -SubscriptionId $sub -Certificate $cert | get-deployment staging | set-deploymentconfiguration {$_.RolesConfiguration["WebRole1"].InstanceCount = 2}

Donde $cert es la huella (thumbprint) de un cerfificado de administración para la subscripción y subido al portal de Azure, y $sub es el identificador de la subscripción disponible también en el portal.

Con el script necesario, sólo hay que programar la ejecución periódica de una tarea utilizando el programador de tareas del SO:

 

 

 

De esta manera tan sencilla los fines de semana ejecutaremos menos instancias de computación en Azure ahorrando dinero en la factura mensual y sin que nuestra aplicación deje de prestar servicio.

 

author: Alfredo Delsors | Posted On Friday, April 08, 2011 1:42 PM | Feedback (0)

Como publicar una lista de Sharepoint 2010 en Azure con LightSwitch Beta 2?


Si tenemos un Sharepoint 2010 corporativo tras los firewalls, con LightSwitch Beta 2 podremos publicar cualquiera de sus listas en Azure sin una línea de código.

Los pasos necesarios.

1. Crear una lista con Sharepoint 2010, por ejemplo AzureSpainTasks:


3. Sharepoint 2010 publica sus listas en un endpoint WCF Data Services que utiliza protocolo OData para hacer consultas y actualizaciones de datos a través de web. Sharepoint publica una lista en la siguiente URL http://<spserver>/_vti_bin/ListData.svc/<ListName>, en la lista del ejemplo sería:

 4. Con el botón "Install Local Endpoint" que proporciona el servicio "Virtual Network" del portal de Azure, instalaremos el agente Windows Azure Connect en el servidor de Sharepoint:

5. Instalaremos de la misma forma el agente Azure Connect en la máquina de desarrollo, utilizando el portal de Azure para crear un grupo en la red virtual con ambas máquinas. Marcar "Allow connections between endpoints in group" lo que permitirá que el servidor esté disponible por nombre en la máquina de desarrollo.

6. Esperar a que el agente Azure Connect muestre un estado "Connected" en ambas máquinas, utilizando el botón derecho sobre el incono del agente Azure Connect en la barra de tareas y seleccionando "Open Windows Azure Connect".

7. Crear un proyecto LightSwitch en la máquina de desarrollo:

8. Para publicar en Azure habrá que utilizar LightSwitch Beta 2:

 9. Seleccionar una fuente de datos Sharepoint:

10. Con la red virtual que proporciona Azure Connect se dispone de un DNS resolviendo los nombres en el grupo. En la dirección del sitio Sharepoint habrá que indicar el nombre del servidor Sharepoint:

11. Al cabo de un momento se mostrarán todas las listas publicadas por el servidor y seleccionaremos la nuestra:

12. Los detalles:
 

13. Añadiremos una pantalla:

14. Seleccionaremos una plantilla para la pantalla y como datos de la pantalla la fuente de datos que acabamos de crear:

15. Tendremos acceso a la lista de sharepoint también cuando no estemos en la red corporativa gracias a Azure Connect: 

16. Para poder acceder a la lista desde cualquier lugar y poder compartirla publicaremos el proyecto LightSwitch en Azure:


 

17. En el apartado "Other Connections" pondremos la conexión al servidor sharepoint: 

18. Una vez publicado en Azure habrá que incluir el rol LightSwitch en el grupo de red virtual del servidor de Sharepoint, para permitir la comunicación de la aplicación ejecutándose en Azure con el servidor Sharepoint:

19. Incluimos el rol en el grupo:

20. Esperamos a que la plataforma finalice de configurar la red virtual:
 

21. Navegamos al sitio Azure y podremos hacer operaciones CRUD sobre la lista Sharepoint:
 

La lista Sharepoint corporativa publicada en Internet sin escribir ni una línea de código. Wow. 

author: Alfredo Delsors | Posted On Tuesday, April 05, 2011 9:37 AM | Feedback (0)

Como ahorrarse una instancia implementando un patrón cliente/servidor en Azure?


A veces es necesario tener una instancia realizando el rol de servidor mientras que las otras instancias realizan el rol de cliente. Un ejemplo puede ser una carpeta compartida como se explica en este gran post: http://blogs.msdn.com/b/mariok/archive/2011/02/11/sharing-folders-in-azure.aspx. Una instancia comparte una carpeta mientras que las demás la utilizan para escribir los ficheros que la que hace de servidor procesa.

El problema aquí es qe no hay un mecanismo en Azure que nos permita descubrir cuál es la instancia que comparte la carpeta. Una primera aproximación es la ofrecida en el post anterior, tener instancias con el rol de servidor y otras con el rol de cliente. Pero esto significa más instancias y más dinero cuando probablemente lo que hay que hacer puede hacerse por cualquiera de las instancias "cliente" sin necesidad de una instancia distinta adicional que solo haga eso.

Una solución para ahorrarnos el rol de servidor es utilizar la Instancia 0, siempre disponible, para que actúe de servidor. Una instancia puede saber que debe actuar como servidor viendo si es la 0 o no con RoleEnvironment.CurrentRoleInstance.Id.EndsWith(".0"). Las otras instancias pueden iterar la colección de instancias hasta encontrar la instancia cuyo nombre acaba en ".0", cogiendo sus endpoints y actuando como su cliente.

En Cloud hay que tener siempre cuidado de no desperdiciar capacidad de computación con diseños muy bonitos pero que dan lugar a instancias infra-utilizadas. No hay que olvidar que uno de sus propósitos principales es el ahorro de costes.

author: Alfredo Delsors | Posted On Friday, February 18, 2011 8:11 PM | Feedback (0)

Como aprovechar los endpoints internos disponibles en los Web Roles de Azure?


Supongamos que tenemos una aplicación Web utilizando una colección in-memory que cambia ocasionalmente pero que se utiliza muy a menudo. La colección se cargaría desde tablas Azure en el arranque de la aplicación, utilizando el evento Application_Start de global.asax, y se actualizaría cuando la aplicación actualizara la tabla, de forma que las consultas podrían realizarse sobre la colección en memoria.

Si vamos a desplegar la en Azure habrá que tener presente que se ejecutará más de una instancia de la aplicación en cada momento y en este caso el mecanismo descrito no sirve, las instancias no comparten una única colección.

Una opción para solucionar el problema sería utilizar Windows Azure AppFabric Caching para almacenar la colección. Cuando desde alguna instancia se modificara el valor de la colección, se actualizaría en la cache distribuida que comparten todas las instancias. Si las consultas van a ser muy frecuentes a lo mejor resulta que la factura que habremos de pagar para poder utilizar esta caché acaba siendo demasiado elevada, teniendo en cuenta que cada consulta contará como una transacción.

Pensando en que la comunicación entre los endpoints internos es gratis, una alternativa podría ser mantener la información en tablas de Azure, leer su contenido con el mismo evento anterior y comunicar los cambios que se produzcan en cada instancia al resto de instancias utilizando el endpoint interno HTTP disponible en los Web Roles de Azure.

Para hacerlo habría que seguir los siguientes pasos:

1.   Definir un endpoint interno HTTP en las propiedades del Web Role, por ejemplo InternalHttpEndpoint

 

2.   Añadir un nuevo servicio WCF al Web Role, por ejemplo NotificationService.svc

3.   Deshabilitar multiple site bindings en el web.config:

<serviceHostingEnvironment multipleSiteBindingsEnabled="false">

4.   Añadir un método en el nuevo servicio para recibir notificaciones desde las otras instancias del Rol.

namespace Service {

[ServiceContract]

public interface INotificationService {

    [OperationContract(IsOneWay = true)]

    void Notify(Information info);

}}

5.   Declarar una clase que herede de System.ServiceModel.Activation.ServiceHostFactory y sobreescribir el método CreateServiceHost para hospedar el endpoint interno.

public class InternalServiceFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        var internalEndpointAddress = string.Format(
			"http://{0}/NotificationService.svc",
			RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["InternalHttpEndpoint"].IPEndpoint);

        ServiceHost host = new ServiceHost(
			typeof(NotificationService), 
			new Uri(internalEndpointAddress));

        BasicHttpBinding binding = new BasicHttpBinding(SecurityMode.None);

        host.AddServiceEndpoint(
			typeof(INotificationService), 
			binding,
			internalEndpointAddress);

        return host;
    }
}

Nota: se puede utilizar SecurityMode.None porque los endpoints internos son privados a las instancias del servicio, no son accesibles desde el exterior y por lo tanto completamente seguros.

6.   Editar el markup del servicio pulsando con el botón derecho del ratón sobre el fichero svc y seleccionando "View markup" para añadir la factoría anterior como la factoría que debe utilizarse para crear instancias del servicio.

<%@ ServiceHost Language="C#" Debug="true" Factory="Service.InternalServiceFactory" Service="Service.NotificationService" CodeBehind="NotificationService.svc.cs" %>

7.   Ahora se pueden notificar los cambios a otras instancias como sigue:

var current = RoleEnvironment.CurrentRoleInstance;

var endPoints = current.Role.Instances
                    .Where(instance => instance != current)
                    .Select(instance => instance.InstanceEndpoints["InternalHttpEndpoint"]);

foreach (var ep in endPoints)
{
    EndpointAddress address = new EndpointAddress(
		String.Format("http://{0}/NotificationService.svc",
		ep.IPEndpoint));

    BasicHttpBinding binding = new BasicHttpBinding(SecurityMode.None);

    var factory = new ChannelFactory<INotificationService>(binding);

    INotificationService instance = factory.CreateChannel(address);

    instance.Notify(changedinfo);
}

Si el número de consultas sobre la colección puede llegar a ser muy grande, el coste de implementación de esta aproximación puede resultar rentable.

author: Alfredo Delsors | Posted On Saturday, January 29, 2011 7:40 PM | Feedback (2)

Como probar un Windows Azure WCF Service Web Role?


Para desarrollar y probar un servicio WCF suelo incluir una prueba unitaria en el proyecto con una referencia al servicio a probar, añadida utilizando el botón "Discover".

b

Recientemente tenía que escribir un servicio WCF en Azure y añadí el proyecto de test que comentaba. Pero al ejecutar la prueba se producía un error accediendo al RoleEnvironment desde el servicio: role discovery data is unavailable.

Al final resultó que el problema era que el emulador de computación también emula al balanceador de carga, de manera que al acceder al servicio desde fuera del emulador el puerto externo publicado por el balanceador es el que debe utilizarse para acceder, en vez del puerto que graba Visual Studio en el fichero de configuración cuando usamos el botón "Discover":

Para resolver el problema sólo hay que cambiar el puerto del servicio en el app.config del test:

Por el puerto externo:

author: Alfredo Delsors | Posted On Thursday, January 20, 2011 12:47 PM | Feedback (0)