jueves, 27 de enero de 2011

Mis experiencias con Amazon EC2

Por mis necesidades freak me he visto necesitado de disponer de más recursos para poder montar mis entornos adecuadamente hasta que he llegado a la gran pregunta “On-premise o cloud”, pues la respuesta no ha sido sencilla ya que partía de la premisa que necesitaba un entorno que me permitiera disponer de distintas máquinas y que dispusiera de bastantes recursos como >12GB de RAM, un buen procesador y placa y varios discos rápidos. He estado varios días comparando distintos presupuestos de servidores físicos con la opción de utilizar las VM en modo Cloud.

Al final me he decantado por utilizar un proveedor Cloud ya que la inversión inicial es muy baja, rápida de adquirir y muy personalizable en cuanto a características.

Una vez decidido que me iba al cloud, tocaba decidir el proveedor. Lo primero que me vino a la cabeza fué utilizar el Rol de VM de Azure, pero tuve que descartarlo (muy a mi pesar) porque de momento solo puedes utilizar el servicio subiendo tus propias imágines y no puedes utilizar plantillas de VM prediseñadas, pensar que estar subiendo 25 GB cada cierto tiempo no me era factible. Después estuve barajando distintos proveedores que ofrecían templates hasta que al final me decidí por Amazon EC2 Elastic Compute Cloud. Los motivos fueron:

  • el coste por hora de los recursos era bastante competitivo.
  • distintas opciones de pago por consumo: en demanda, slots de precios, VM reservadas.
  • permite bastante flexibilidad en cuanto a la configuración de recursos.
  • dispone de templates de VM, entre ellos Windows 2008.
  • consola de configuración.
  • podemos crear nuestros propios snapshots (AIMS).
  • disponemos de un api de configuración y despliegue.
  • integración con una gran variedad de servicios adicionales: bbdd, balanceo, VPN, monitorización,…

image image

Lo primero que debes hacer es registrarte en Amazon Web Services (AWS) para conseguir un usuario, a continuación tendrás que logarte en la consola de AWS para subscribirte en los servicios que desees. La primera vez tendrás que crear un cliente que se asociará al usuario. Durante este registro habrá que introducir los datos de contacto, envío facturación y datos de pago. Esto es lo que más me ha impactado ya que para identificar a la persona te realizan una llamada al teléfono de contacto para que introduzcas un pin.

Como en mi caso he utilizado EC2, desde la consola AWS seleccioné la opción “Launch instance” para iniciar el asistente de creación de una nueva VM. Amazon te empieza a cobrar en el momento que inicias la instancia y la mantienes. La VM as por los siguientes estados:

  • stopped: apagada solo nos cobrarán por el espacio
  • running: está encendida, ya empieza contar el consumo de proceso por hora, las I/O a disco y red y consumo de resto de servicios. Aquí hay que tener en cuenta que nos van a cobrar una hora entera cada vez que arranquemos independientemente de si si es completa o no. Por lo que no os aconsejo encender y apagar. Ojo los reboot no cuentan.
  • terminatted: Indica que queremos que se borre la instancia, tarda bastante pero al final se elimina sola. Una vez terminada no se puede volver a encender así que cuidado…

Pero no todo es jauja’ al crear la primera instancia me encontré con el primer problemilla (de unas cuantas horas), una vez había creado la VM con éxito descubrí que tenía un límite de 30GB de disco y que encima no podía configurarlo desde la consola AWS :(  Al parecer aunque varias herramientas free tuve que recurrir a ejecutar una serie de scripts para crear de nuevo la VM pero esta vez con 200GB.

Primero te tienes que bajar las Amazon EC2 API tools que consisten en un conjunto de comandos hechos en java para configurar tus instancias, volúmenes y servicios. Una vez descargado y descargado y descomprimido tenemos que configurar las variables de entorno para que funcionen desde cmd:

 

SET EC2_HOME =c:\ec2-api-tools-1.3-62308

SET PATH =PATH; c:\ec2-api-tools-1.3-62308\bin

 

Para crear una instancia del tipo “Large” 7GB de RAM, con Windows 2008 y con 200GB de RAM ejecutamos:

ec2-run-instances --region eu-west-1 -K pk-xxxxxxxxxxxxxxxx.pem -C cert-xxxxxxxxxx.pem -b "/dev/sda1=:100:false" ami-c9517bbd --key key3 -g quick-start-1 -t m1.large --disable-api-termination stop -z eu-west-1a

 

donde ami-c9517bbd corresponde con el id de la AIM (imagen de la VM), key3 corresponde con un key pair, pk-xxxxxxxxxxxxxxxx.pem y cert-xxxxxxxxxxxxxxxx.pem corresponden con la private key y el certificado. Para obtenerlos teneis que acceder al menú superior Account > Credenciales de seguridad  > credenciales de acceso.

 

image image image

 

image image

Por último me gustaría concluir comentando las pegas que le veo al servicio:

  • no es nada intuitivo
  • no hay suficiente documentación o está dispersa
  • no tiene una consola con la que realizar todas las operaciones, al final te tienes que meter a ejecutar scripts
  • EC2 está basado en VMWare por lo que será muy difícil poder reaprovechar las VM para exportalas/importarlas algún día on-premise si vienes del mundo Microsoft.

 

Para conocer más sobre mis experiencias en cloud y SharePoint podéis seguirme en twitter @mariocortesf

Encontrar las páginas que hacen Crash!!

Aunque las buenas prácticas dicen que deberíamos de tener pruebas unitarias para validar que nuestro código tiene un comportamiento correcto durante todo el ciclo de vida del desarrollo, en el caso de SharePoint nos podemos encontrar con que puede que nuestros componentes estén correctamente pero haya otros elementos que impidan la ejecución provocando errores fatales. Si disponemos de Visual Studio 2010 Ultimate dispondremos de los WebTest con los que realizar una prueba sobre las páginas en un entorno de integración.

El problema nos puede venir porque no dispongamos de esta versión o porque no hayamos creado pruebas unitarias durante todo el proyecto. Para poder identificar al menos las páginas que están dando problemas al desplegar nuestras soluciones, podemos realizar peticiones GET a todas las páginas de nuestras colecciones de sitio y comprobar que no nos devuelva una excepción o la cabecera HTTP “SharePointError”. Esta cabecera se añade automáticamente en las repuestas a páginas que han generado un error no controlado.

 

Os dejo un pequeño ejemplo de código de como hacer este proceso, muy útil en migraciones ;)

 

static bool BuscarErrorAlCargarPagina(SPSite Site, List<string> ErroresEncontrados)
        {
            Console.WriteLine("BuscarErrorAlCargarPagina...");

            bool res = false;
            try
            {
                foreach (SPWeb web in Site.AllWebs)
                {
                    try
                    {
                            PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web);
                            foreach (PublishingPage page in pubWeb.GetPublishingPages())
                            {
                                string url = string.Format("{0}/{1}", pubWeb.Url, page.Url);
                                try
                                {
                                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                                    req.PreAuthenticate = true;
                                    req.Credentials = CredentialCache.DefaultNetworkCredentials;

                                    byte[] result = null;
                                    byte[] buffer = new byte[4096];

                                    using (WebResponse resp = req.GetResponse())
                                    using (Stream responseStream = resp.GetResponseStream())
                                    using (MemoryStream memoryStream = new MemoryStream())
                                    {
                                        int count = 0;
                                        do
                                        {
                                            count = responseStream.Read(buffer, 0, buffer.Length);
                                            memoryStream.Write(buffer, 0, count);

                                        } while (count != 0);

                                        result = memoryStream.ToArray();

                                        if (result.Length < 1)
                                            ErroresEncontrados.Add(string.Format("Error al recibir datos de página {0}", page.Url));
                                        else if (resp.Headers["SharePointError"] != null)
                                        {
                                            ErroresEncontrados.Add(string.Format("Error al procesar página {0} correlation {1}", url, resp.Headers["SPRequestGuid"]));

                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    ErroresEncontrados.Add(string.Format("Error al cargar página {0}", url));
                                }
                            }
                    }
                    finally
                    {
                        web.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                ErroresEncontrados.Add(string.Format("Error BuscarErrorAlCargarPagina: {0}", ex.Message));
            }
            return res;
        }

miércoles, 26 de enero de 2011

Material evento ALM en SharePoint 2010 con TFS 2010

El 12 de enero pude realizar junto con Roberto González el evento ALM con TFS 2010 y SharePoint 2010 donde pudimos ver aspectos de ALM aplicados al desarrollo de soluciones para SharePoint 2010 apoyándonos de Team Foundation Server 2010.
En el post de Roberto Pruebas Unitarias SharePoint 2010 y Moles podréis encontrar parte del material de este evento junto con más información sobre ALM y una serie de ejemplos de moles para SharePoint.

También os dejo la otra parte del material del evento más orientada al diseño de soluciones y trabajo diario con SharePoint 2010 y TFS 2010.

 

Presentación ALM para SharePoint 2010

Material de trabajo ALM

Pruebas Unitarias SharePoint 2010 y Moles (Roberto González)

viernes, 21 de enero de 2011

Página para encontrar empresas de hosting

A raíz de una pregunta de Alberto Díaz me he encontrado con el sitio web de Microsoft “Find Web Hosting” desde el que podemos encontrar una lista de proveedores de hosting sobre la que podemos realizar distintos tipos de filtro como encontrar por paises, computación, almacenamiento, tecnología,…

Incluso he podido encontrar distintos proveedores de SharePoint que no conocía quitando el filtro por país e insertando la palabra clave “Sharepoint”  ;)

 

imageimage

25º aniversario de Microsoft Excel

Continuando con la serie The History of Microsoft, Channel 9 ha publicado dos nuevos capítulos en esta ocasión sobre los inicios de Microsoft Excel. La serie Excel 25th Anniversary (compuesta de momento de dos capítulos) cuenta los inicios del producto y como ha ido evolucionando desde su primera versión hasta las última versión Microsoft Excel 2010 disponible para distintos dispositivos y entornos (Office Web Apps y Excel Mobile).

 

Excel 25th Anniversary - Part One
Excel 25th Anniversary - Part Two

miércoles, 19 de enero de 2011

Automatizar App_Offline para SharePoint

ASP.NET incluye una funcionalidad par indicar que estamos realizando tareas de mantenimiento sobre nuestros servidores de forma que se muestre siempre una página por defecto. Agregando una página con el nombre “AppOffline.htm” en la raíz del directorio virtual del sitio web, ASP.NET interpretará automáticamente que estamos realizando tareas de mantenimiento y dejará de responder a las peticiones y devolviendo directamente el contenido de la página html, de esta forma podremos realizar tantos cambios de estructuras e iisresets como necesitemos sin que se deje de responder a las peticiones de los usuarios.

image image

SharePoint 2010 está construido sobre ASP.NET por lo que también funciona de forma similar, podemos coger manualmente y copiar el fichero en el directorio virtual que nos crea, ahora bien, esa no es la manera adecuada sobre todo si disponemos de una granja de servidores grande o no tenemos acceso a los servidores directamente. Para solucionarlo he creado una solución WSP de SharePoint que he subido a MSDN compuesta por una feature que al activarla despliega en todos los servidores de la granja el fichero App_Offline.htm en la aplicación web que le indiquemos, de forma que es tan fácil como habilitar o deshabilitar la feature.

image 

La solución está desarrollada sobre Visual Studio 2010 y está compuesta por una feature con un EventReceiver que al activarse instala un job de SharePoint encargado de copiar el fichero App_Offline.htm en todos los servidores de la granja de SharePoint par la aplicación web indicada.

Desde Visual Studio 2010 creamos un proyecto “Empty SharePoint Project”  del tipo “Farm solution” para que podamos desplegar elementos y tengamos acceso al modelo de objetos por encima de SPSite. Desde el icono del proyecto “Features” con el botón derecho añadimos una nueva featura indicando el nombre y el ámbito de la feature, en este caso Site (Colección de Sitios).

imageimage image

Para poder distribuir el fichero App_Offline.htm podremos agregar un módulo de SharePoint o bien indicando un “Mapped folder” de SharePoint.

Para conseguir la ejecución del job al activar la feature añadiremos un event feature seleccionando la feature recién creada y con botón derecho marcaremos “Add event receiver”, añadiremos el código de registro del job indícándole que se ejecute inmediatamente.

image image

Ahora quedaría por implementar la ejecución del job creando una clase que herede de SPJobDefinition .

image

Por último quedaría compilar el proyecto y empaquetarlo mediante la opción “Package”, esto generará en el directorio bin del proyecto la solución con extensión WSP.

 

Aunque este ejemplo está pensado para desplegar el fichero App_Offline también podremos aprovechar su funcionamiento para desplegar otros ficheros o incluso hacer modificaciones muy específicas aunque por supuesto cuanto menos nos salgamos del estándar mejor ;)

Espero que os sirva el ejemplo.

http://code.msdn.microsoft.com/appofflineformoss

lunes, 17 de enero de 2011

Dónde está el explorador de SharePoint en Visual Studio 2010?

Visual Studio 2010 incorpora una gran de novedades en cuanto al desarrollo para SharePoint 2010, entre ellas disponemos del explorador de SharePoint que nos permite navegar visualmente por la estructura de una Colección de Sitios de SharePoint 2010. Esta utilidad está pensada para comprobar la estructura y las propiedades de las listas, sitios, columnas,…

Gracias a la capacidad de extender Visual Studio, existen algunas soluciones como Imtech Get SPMetal Definition Extension que aprovecha la exploración de SharePoint para generar el esquema de LinQ To SharePoint.

Entre sus limitaciones: no podremos realizar acciones de edición ni modificación por lo que solo la utilizaremos en modo consulta. Además el usuario con el que estemos logados en windows tendrá que tener permisos de lectura de estructura de SharePoint.

 

Para utilizar la exploración de SharePoint abriremos desde Visual Studio 2010 el “Explorador de Servidores” desde la opción “Ver”.

A continuación encontraremos un nuevo icono para agregar conexiones en este caso del tipo SharePoint, al pulsarlo aparecerá una caja de texto donde introduciremos la url completa de la Colección de Sitios a la que queremos conectarnos.

Una vez conectados nos aparecerá una nueva conexión con el símbolo de sitio de SharePoint, donde podremos ir navegando por los elementos: listas, bibliotecas, tipos de contenido, sitios, plantillas de lista plantillas de WF, features, columnas, vistas y asociaciones de WF.

image image image