Syntax Highlighter

martes, 19 de febrero de 2013

[DNN Azure Accelerator] Le damos la bienvenida a la Alta Disponibilidad

high_availabilityUna de las características más solicitadas en el DotNetNuke Azure Accelerator es la posibilidad de poder hacer despliegues en alta disponibilidad (añadiendo dos o más roles) y que además no existan problemas de recuperación en caso de que el acceso a los contenidos almacenados en el VHD sea interrumpido. Si bien en la actualidad se podían hacer despliegues de más de un servidor para servir los contenidos (modo webfarm), en el caso de que el servidor que montaba la unidad VHD cayera por algún motivo –como que Microsoft hiciera un mantenimiento planeado haciendo un upgrade del cloud service- podía acabar en que el site dejara de estar disponible.

Todo esto tiene su raíz en la exclusividad que mantiene sobre el blob el role que monta el VHD, a través del mantenimiento de leases sobre el mismo, no permitiendo a los demás roles montarlo en modo lectura/escritura.

Nuevas características en el DNN Azure Accelerator

Antes de comenzar a detallar cómo funciona el nuevo sistema de “competición por el lease”, echemos un vistazo a las nuevas características implementadas en el Accelerator desde su última versión y que he ido añadiendo a lo largo de los últimos meses:

  • Solución actualizada al Azure SDK 1.8 (October 2012)
  • Modificado el sistema operativo predeterminado de los paquetes a OSVersion=3 (Windows Server 2012, IIS 8)
  • Añadido soporte para servicio FTP (activo y pasivo)
  • Corregida la causa por la que en determinadas ocasiones el site no se iniciaba correctamente tras reiniciar el role (ver este enlace para más información)
  • Añadido nuevo paquete con soporte para co-located caché
  • Añadido soporte de pre-carga del sitio y modo de inicio del appPool en AlwaysRunning, características de IIS8 (ver este enlace para más información)
  • Arquitectura modificada añadiendo soporte para Alta Disponibilidad

Antes de empaquetar la nueva versión, voy a realizar algunos cambios en la interfaz de usuario para acomodar las nuevas opciones de configuración como las del servicio FTP, etc.

Alta Disponibilidad: compitiendo por el lease

A la espera de que Microsoft saque la solución definitiva a este problema de leases sobre los VHD, la nueva implementación realizada en el DNN Azure Accelerator minimiza estos efectos para estar dentro de los márgenes del SLA de alta disponibilidad de Windows Azure.

La solución está basada en la actualización del post de Dinesh Haridas -artículo en el que está inspirado el DNN Azure Accelerator- en el que se introduce una aproximación a la alta disponibilidad con una técnica de competición por el VHD.

Por simplificación, centremos el problema de la alta disponibilidad en las operaciones alrededor del VHD donde residen los contenidos del site. Estas operaciones serán realizadas entre dos roles: SMBServer, que actúa como el servidor de contenidos; SMBClient, que actúa como servidor que se conecta a la unidad compartida por el servidor de contenidos.

El resumen de las operaciones realizadas en el role que comparte los contenidos es:

  • SMBServer (1 o más instancias)
    • Cada X segundos (en el evento OnRun), intenta montar el VHD (Compete for the lease)
      • Si tiene éxito:
        • comparte la unidad con un “NET SHARE”
        • Cada X segundos sigue comprobando que tiene el lease. Si no lo tiene, elimina el share y vuelve al principio

Tal y como se observa, todos los roles que actúan como servidor de ficheros están continuamente compitiendo por el lease del VHD. El lease actual, que se mantiene durante 60seg por el driver del servidor que monta con éxito el VHD, asegura que la unidad siga estando en posesión del mismo servidor mientras sea posible. Por este motivo, en caso de caída del role que comparte los contenidos, la recuperación completa toma entre 60 y 90seg. Si tenemos en cuenta que ésto sólo ocurre cuando actualizamos el servicio –o cuando Microsoft realiza una operación de mantenimiento, normalmente una vez cada 2 o 3 meses-, si bien no es perfecto, entra dentro de los márgenes del SLA de Azure.

El resumen de las operaciones realizadas en el role que actúa como cliente es:

  • SMBClient (1 o más instancias)
    • Cada X segundos (en el evento OnRun), intenta mapear una unidad de red con el share del role SMBServer, iterando sobre todas las instancias del mismo
      • Si tiene éxito:
        • Cada X segundos escribe en un fichero de log en la carpeta “\logs”. Si ocurre un error al escribir dicha entrada, elimina la unidad mapeada y vuelve al principio

En el caso del servidor SMBClient, se hacen varios reintentos de escritura en el log antes de comenzar de nuevo el proceso de mapeo para evitar falsos positivos.

AzureHADemo

En el archivo adjunto está la solución simplificada que sirve de demostración por si a alguien le interesan los detalles.

Implementación en el Accelerator

La implementación final en el Accelerator también está disponible en CodePlex. Cabe destacar las siguientes características en la implementación final:

  • El código de creación del site en el IIS se ha movido justo después del intento exitoso de mapeo de la unidad de red en el webrole
  • Existen tres cloud services distintos dentro de la solución:
    • DNNAzureSMB: mantiene worker roles (SMBServer) y webroles (DNNAzure) separados para cada operación. Si bien lo normal es usar el menor número de servidores posible, hay escenarios donde, por rendimiento, no se desea sobrecargar a un webrole con las tareas de servir también los archivos al resto de instancias. Es por ello que se sigue manteniendo esta solución.
    • DNNAzureSingle: al desplegar este cloud service, los webroles (DNNAzure) actúan también como servidores de contenidos compitiendo por el lease del VHD. Para ello se mantienen dos threads: uno para competir por el lease y realizar las tareas propias del SMBServer y otro para realizar el mapeo de red y las tareas propias del SMBClient. Este será normalmente el paquete a desplegar en la mayoría de los escenarios.

Aún queda una problemática por solucionar, y es el escenario donde se usa FTP o WebDeploy y has desplegado más de una instancia de los webroles. Esto es debido a que estos protocolos requieren afinidad a nivel de protocolo de comunicaciones y la implementación actual del Load Balancer de Azure no permite especificar la misma. Como “workaround” para esta incidencia –y hasta que Microsoft lo solucione a nivel de Load Balancer- la solución pasaría por añadir un tercer webrole para estos servicios que requieren afinidad y desplegar sólo una instancia del mismo. 

Conclusión

Con esta versión se soluciona el problema de alta disponibilidad en el DNN Azure Accelerator así como el problema de actualización del servicio, ya esté en alta disponibilidad como si no, con lo que será una actualización recomendada para todos los despliegues que actualmente estén usando el DNN Azure Accelerator.

En breve realizaré un empaquetado y estará disponible como descarga en CodePlex. Si tienes alguna sugerencia, no olvides dejar tus comentarios, ya sea en este mismo blog o como una entrada en el área de discusiones de CodePlex.

Un saludo y Happy Coding!

domingo, 25 de noviembre de 2012

Cómo eliminar registros de la tabla de trazas en Azure

Dentro de las buenas prácticas a la hora de implementar un cloud service en Azure, ya se trate de un webrole o un worker role, es la de configurar la transferencia de datos de diagnóstico a Azure Storage para poder ver cómo se está comportando nuestro servicio. En el artículo “Enabling Diagnostics in Windows Azure” se detalla paso a paso cómo habilitar cada uno de los tipos de diagnóstico.

Una vez configuradas las fuentes de datos de diagnóstico –IIS logs, Windows Events logs, etc.-, los datos son transferidos a Azure Storage en ciclos de X minutos según hayamos configurado. Uno de estas fuentes de datos son los Windows Azure logs, conteniendo los mensajes enviados a través de operaciones de traza (“Trace.WriteInformation”, etc.), y yendo a parar a la tabla “WADLogsTable” en Azure Storage.

WADLogsTable

Esta información es una de nuestras primeras herramientas de diagnóstico en la que podemos escribir información de traza. Personalmente también añado un listener para tener la misma información en el Event Viewer de mi aplicación ya que así no tengo que esperar al mínimo de 1 minuto de transferencia a Storage, accediendo al mismo a través de RDP.

Y si bien en el caso del visor de sucesos podemos indicar diversos métodos de eliminación automática de sucesos –por fecha, por tamaño en Mb, etc.-, no existe una opción similar para eliminar esta información de forma automática de la tabla WADLogsTable de Azure Storage. Es cierto que el almacenamiento de Azure Storage es muy económico, pero cuando vas acumulando información de traza, es muy probable que los mensajes que fueron generados hace varios meses o años atrás deje de ser relevante, y haya que realizar algún mantenimiento en la misma sin perder los últimos datos relevantes (vamos, sin eliminar la tabla completamente).

De este modo, una de las opciones que tenemos es la de ir eliminando registros de la tabla a través de algún filtro, algo que podemos hacer programáticamente o a través de uno de los comandos Powershell disponibles en el conjunto de Windows Azure Management Cmdlets.

Instalando Windows Azure Management Cmdlets

InstallWPILa forma más sencilla de instalar estos comandos de PowerShell es a través de Web Platform Installer. Siguiendo este enlace (http://go.microsoft.com/?linkid=9811175&clcid=0x409) se iniciará la instalación de paquete en cuestión.

Si lo que deseas es automatizar la instalación de estos Cmdlets dentro de tu instancia de Windows Azure, puedes usar la herramienta de línea de comandos de Web Platform Installer con una línea de comandos como la siguiente (visita mi post anterior Configurando Web Platform Installer y WebDeploy en un Azure WebRole para ampliar información):

   1: ~dp0WebPICMD.exe /Install /Products:WindowsAzurePowerShell /AcceptEULA

Realizando mantenimiento de WADLogsTable


Una vez instalados los Cmdlets, abrimos la consola de Windows Azure PowerShell. Para ello, buscamos en el menú de inicio el acceso directo para iniciarla.


WAPowerShell


Una vez iniciada la consola de comandos, procedemos a buscar la ayuda del Cmdlet para realizar mantenimiento de esta tabla, escribiendo “help Clear-WindowsAzureLog”:




PS C:\> help clear-windowsazurelog
 
NAME
    Clear-WindowsAzureLog
 
SYNOPSIS
    Removes Windows Azure trace log data from a storage account.
 
SYNTAX
    Clear-WindowsAzureLog [-DeploymentId <String>] [-From <DateTime>] [-To <DateTime>] [-StorageAccountName <String>]
    [-StorageAccountKey <String>] [-UseDevelopmentStorage] [-StorageAccountCredentials
    <StorageCredentialsAccountAndKey>] [<CommonParameters>]
 
    Clear-WindowsAzureLog [-DeploymentId <String>] [-FromUtc <DateTime>] [-ToUtc <DateTime>] [-StorageAccountName
    <String>] [-StorageAccountKey <String>] [-UseDevelopmentStorage] [-StorageAccountCredentials
    <StorageCredentialsAccountAndKey>] [<CommonParameters>]
 
DESCRIPTION
    The Clear-WindowsAzureLog cmdlet clears trace log data exported by Windows Azure Diagnostics to the WADLogsTable
    of the specified storage account.A subset of the data available can be removed by specifying a period of time for
    which to clear data.
 
RELATED LINKS
    Get-WindowsAzureLog
    Set-WindowsAzureLog
 
REMARKS
    To see the examples, type: "get-help Clear-WindowsAzureLog -examples".
    For more information, type: "get-help Clear-WindowsAzureLog -detailed".
    For technical information, type: "get-help Clear-WindowsAzureLog -full".
    For online help, type: "get-help Clear-WindowsAzureLog -online"


De este modo, un ejemplo para eliminar todas las entradas anteriores al 20 de noviembre de 2012 en DevFabric sería algo así:



PS C:\> Clear-WindowsAzureLog -ToUtc 2012-11-20T00:00:00 -UseDevelopmentStorage
47 record(s) were deleted in the 'WADLogsTable' table.

Como véis, muy simple. De hecho, una buena idea para automatizar esta tarea sería:



  1. Automatizar la instalación de los Cmdlets en el role con la herramienta de línea de comandos de WPI (ver apartado anterior)

  2. Crear una tarea programada en el role startup que llame al cmdlet de powershell para eliminar entradas anteriores a X días

Para no inventar nada nuevo respecto a la creación de tareas programadas, la mejor forma es utilizar el propio planificador de tareas del sistema dentro del mismo role. Sin embargo, para no alargar más esta entrada, lo veremos en el próximo “capítulo”.


Un saludo y Happy Coding!

lunes, 19 de noviembre de 2012

Cómo desencriptar una password de RDP de Azure olvidada

password-decrypting-600x394¿Alguna vez te ha pasado que has olvidado la contraseña que pusiste al publicar tu servicio hospedado en Azure y ahora no te puedes conectar por RDP?

Actualmente, hay una solución muy sencilla –y recomendada-, que es volver a restablecer la contraseña a través del portal de Windows Azure, siguiendo los pasos siguientes:

  1. Acceder al portal de Windows Azure
  2. Ir al servicio hospedado e ir a la sección “Configurar”
  3. Hacer click en el botón “Remoto” de la barra de herramientas inferior
  4. Restablecer la contraseña introduciéndola en los campos solicitados, reconfigurando así las credenciales del usuario RDP.

ResetPassword

Esto cambiará el estado del role a “Actualizando” y al cabo de unos minutos ya podremos acceder con la nueva contraseña.

Si bien esta operación restablece correctamente los credenciales, a veces no nos conviene por un motivo u otro realizar este cambio. Así que aquí va el truco siguiente.

Desencriptar una contraseña RDP olvidada de Windows Azure

Para poder desencriptar la contraseña olvidada necesitamos:

  • Tener la cadena de texto de la contraseña encriptada
  • Tener instalado en el equipo local el certificado con la que fue encriptada

La contraseña encriptada se almacena en el archivo .cscfg con el que fue desplegado tu servicio, si bien éste puede ser distinto si alguien la ha modificado siguiendo el método anterior. Para asegurarnos de tener la última contraseña, puedes seguir los pasos siguientes:

  1. Acceder al portal anterior de Windows Azure a través de la URL https://windows.azure.com (te solicitará tus credenciales) y luego mostrará la versión anterior del portal en Silverlight
  2. Ir al servicio en cuestión y seleccionar el despliegue. En la parte derecha aparecerán las propiedades del mismo con los valores actuales
  3. Copiar al portapapeles el valor de la propiedad “Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountEncryptedPassword”

PasswordEncripted

Ahora que tienes la contraseña, puedes usar el certificado almacenado en tu almacén de certificados local para desencriptarla, del mismo modo que hace el agente de RDP de Windows Azure para crear las credenciales en el role startup.

El código para ello sería la función siguiente:

   1: private static string DecryptPassword(string encryptedPassword)
   2: {
   3:     if (string.IsNullOrEmpty(encryptedPassword))
   4:     {
   5:         throw new ArgumentNullException("encryptedPassword");
   6:     }
   7:     SecureString secPassword;
   8:     try
   9:     {
  10:         var encryptedBytes = Convert.FromBase64String(encryptedPassword);
  11:         var envelope = new EnvelopedCms();
  12:         envelope.Decode(encryptedBytes);
  13:         var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
  14:         store.Open(OpenFlags.ReadOnly);
  15:         envelope.Decrypt(store.Certificates);
  16:         char[] passwordChars = Encoding.UTF8.GetChars(envelope.ContentInfo.Content);
  17:         secPassword = new SecureString();
  18:         foreach (var character in passwordChars)
  19:         {
  20:             secPassword.AppendChar(character);
  21:         }
  22:         Array.Clear(envelope.ContentInfo.Content, 0, envelope.ContentInfo.Content.Length);
  23:         Array.Clear(passwordChars, 0, passwordChars.Length);
  24:         secPassword.MakeReadOnly();
  25:     }
  26:     catch (CryptographicException cex)
  27:     {
  28:         throw new SecurityException("Unable to decrypt password. Make sure that the cert used for encryption was uploaded to the Azure service", cex);
  29:     }
  30:     catch (FormatException fex)
  31:     {
  32:         throw new SecurityException("Encrypted password is not a valid base64 string", fex);
  33:     }
  34:  
  35:     return GetUnsecuredString(secPassword);
  36: }
  37:  
  38: private static string GetUnsecuredString(SecureString secureString)
  39: {
  40:     if (secureString == null)
  41:     {
  42:         throw new ArgumentNullException("secureString");
  43:     }
  44:  
  45:     IntPtr ptrUnsecureString = IntPtr.Zero;
  46:     try
  47:     {
  48:         ptrUnsecureString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
  49:         return Marshal.PtrToStringUni(ptrUnsecureString);
  50:     }
  51:     finally
  52:     {
  53:         Marshal.ZeroFreeGlobalAllocUnicode(ptrUnsecureString);
  54:     }
  55: }
  56:  

Adjunto una solución con el código de ejemplo por si alguno le interesa.



Un saludo y happy coding!

domingo, 21 de octubre de 2012

[Evento] Lanzamiento de Visual Studio 2012 con TenerifeDev

Seguimos en modo metralleta, y aprovechando la movida realizada desde MadridDotNet no queríamos ser menos. Así que el el próximo 9 de Noviembre desde TenerifeDev vamos a hacer un evento para festejar el lanzamiento de Visual Studio 2012, con una serie de charlas a modo de píldoras informativas y finalizando con cervezas en algún bar de la Heraclio.

logoRegistro

  • Evento MSDN: Lanzamiento de Visual Studio 2012 con TenerifeDev
  • Fecha: 9 de Noviembre de 2012, de 17:00 a 20:00
  • Lugar: Aulas de Fundación Empresa Universidad de la Laguna (FEULL)

Regístrate aquí

Agenda:

En la parte que nos toca a César y a mí, haremos un repaso de la evolución de ASP.net a WebAPI, viendo con ejemplos el nuevo paradigma de programación de APIs orientadas a su consumo por páginas web. Y como no podía ser menos, aprovechando la salida de DotNetNuke 7.0, que facilita el desarrollo de WebAPIs integradas con DotNetNuke (i.e. autenticación integrada), veremos algún ejemplo de cómo implementar un WebAPI en DNN para luego consumirlo en otra aplicación cliente, como puede ser desde una app Windows 8.

Un saludo y Happy Coding!

lunes, 8 de octubre de 2012

DotNetNuke Azure Accelerator 6.3 Released!

DotNetNukePoweredWA

Since a few minutes ago the new version 6.3 of the DotNetNuke deployment wizard for Windows Azure PaaS -Cloud Services- is available on CodePlex. In this new version there are a number of very interesting new features as well as the correction of certain issues that have arisen since the last packaging.

One of the most interesting new features from the administrative point of view is the new WebDeploy support on our websites deployed on Azure PaaS. I recommend you take a look at this post for more information (use the translate controls in the right panel).

Of course, if you are one of the lucky ones going to the DNN World Conference 2012 in Orlando, you can not miss the chance to see these and other features in the sessions dedicated to the deployment of DotNetNuke on Windows Azure from the hands of Joe Brinkman and Aaron Hayon.

Download DNN Azure Accelerator 6.3

New Features

  • Added SMTP support: added a new startup task to setup and configure the localhost SMTP server on the webroles. Now you can use LOCALHOST as SMTP server without the need of using a 3rd party SMTP server
  • Added "post-install" addons feature: if an url pointing to a .zip file is specified in the service configuration file, after the successful start of the SMB server the .zip file will be downloaded and decompressed into the DotNetNuke folder maintaining the same files and folder architecture and overwriting contents. This is an useful feature to add in an automated way 3rd party files, dependencies, etc. to a DotNetNuke clean install. Use it as you wish.
  • Added SSL binding support: the Accelerator wizard does not include a step to setup this yet, but the work is done in the package. To manually setup SSL on your service configuration file, please read this thread http://dnnazureaccelerator.codeplex.com/discussions/359504
  • Added Web Platform Installer support: a new startup task has been added to enable WebPI products installations and dependencies, like MVC3, WebDeploy, etc.
  • Added WebDeploy support: a new checkbox has been added in the Remote Desktop setup step, in order to enable WebDeploy. Using the new Web Plaform Installer feature, with Web Deploy enabled (note that enabling this feature takes about 10 more minutes for the VM deployment), you can access to your site using tools like WebMatrix or other command line tools like WebDeploy's command line utility, in order to copy or modify files or create your own backups.

Fixes

  • Changed the way to import the publish settings file: discontinued the automatic download while refreshing the subscription data, you have to manually download and import the file in the wizard.
  • The packages are using the latest Azure SDK 1.7 (June 2012)
  • Fixed the packageUrl on the SMB package
  • Fixed references to use latest versions
  • Fixed an issue causing the "fileshare" user's password being expired after a month
  • Fixed an issue on the wizard's verification step while deploying ("No deployments were found")

Enjoy!

Un saludo and Happy Coding!

Related Posts Plugin for WordPress, Blogger...