Azure Websites: WordPress + SQL Azure + Azure Storage

He recibido varias peticiones sobre cómo trabajar con WordPress y SQL Azure, y es por ello que me gustaría dedicar este post a mostraros una opción disponible en el marketplace de Microsoft Azure para este escenario. Por otro lado, podemos hacer uso también de Azure Storage para el almacenamiento del contenido media, el cual suele tener un peso importante en blogs con mucha información.

Brandoo WordPress

Brandoo WordPress

Existe un proyecto llamado Brandoo WordPress que nos permite trabajar con SQL Azure y MariaDB. Desde la galeria de Azure Websites tenemos disponible este proyecto, seleccionando New > Compute > Website > From Gallery > Brandoo WordPress (MS SQL or Azure SQL):

Brandoo WordPress (MS SQL or Azure SQL)

Si seguimos el asistente, podremos elegir o crear una base de datos en SQL Azure:

Configure Brandoo WordPress

Una vez finalizado el asistente, tendremos listo WordPress utilizando SQL Azure como base de datos, en lugar de MySQL.

Actualización de WordPress

Cuando accedemos por primera vez al nuevo sitio, podemos comprobar que no está utilizando la última versión del CMS (A día de hoy 4.0.1). La versión del proyecto que está en el marketplace no tiene la última versión, aunque podemos solucinarlo fácilmente desde el propio Dashboard:

Brandoo Update WordPress

Azure Storage para el almacenamiento de media

Por último, me gustaría aprovechar el post para añadir Azure Storage para el almacenamiento del contenido media. Sé de primera mano la gran cantidad de imágenes, vídeos, archivos, etcétera que se pueden llegar a almacenar en un CMS y, es por ello, que sería más que acertado alojar este tipo de contenido en un lugar ajeno al sitio web, mejorando de esta forma el rendimiento del sitio. Para ello, basta con buscar el plugin Windows Azure Storage for WordPress en Plugins > Add New.

Windows Azure Storage for WordPress

Una vez instalado, aparecerá una nueva sección en el apartado Settings de WordPress llamada Windows Azure:

Wordpress Settings Windows Azure

Si no tenemos una cuenta de Azure Storage podemos crearla a través de New > Data Services > Storage. En la nueva sección, debemos incluir el nombre de la cuenta y la primary access key para poder realizar la conexión. Por otro lado, será necesario crear un contenedor (en este ejemplo lo he llamado media) para poder alojar el contenido:

Mandatory Windows Azure Storage Settings

Es muy importante seleccionar la opción Use Windows Azure Storage for default upload antes de guardar los cambios, ya que de lo contrario no será el destino por defecto cuando subamos nuevos elementos:

Wordpress Use Windows Azure Storage for default upload

A partir de este momento, si modificamos el post de la plantilla y añadimos, por ejemplo, una nueva imagen podemos comprobar que Azure Storage es el lugar de almacenamiento por defecto:

Wordpress Azure Storage result

Espero que sea de utilidad.

¡Saludos!

Ejecutar WebJobs desde Fiddler o tu aplicación

En varias ocasiones he hablado de los WebJobs, asociados a Microsoft Azure Websites, y cómo es posible convertir una aplicación de consola utilizando este servicio e incluso lanzar acciones dentro de WebJobs mediante queues o blobs. En esta ocasión quería mostrar cómo es posible ejecutar un WebJob desde Fiddler o incluso desde nuestra propia aplicación.

Descargar el perfil de publicación

Para poder llamar a un WebJob es necesario estar autenticados pero ¿con qué credenciales? Con las del perfil de publicación. Cuando utilizamos Web Deploy, y tenemos asociado nuestro Visual Studio a una cuenta de Microsoft Azure, este es un paso transparente para nosotros. El propio IDE descarga un archivo XML, el cual nos completa la información de despliegue:

Publish Web

Para poder descargar dicho archivo basta con seleccionar el sitio web donde queremos alojar el WebJob y hacer clic sobre la opción Download the publish profile del apartado quick glance:

quick glance - download the publish profile

Este archivo contiene tanto las credenciales de despliegue como de publicación (Web Deploy y FTP). Para este post, los valores que debemos copiar son: userName (sin el nombre del sitio) y el hash de la password, almacenado en userPWD.

Obtener la URL de llamada al WebJob

El siguiente paso es saber a dónde tenemos que llamar para poder ejecutar el WebJob. Si bien no está lo suficientemente visible, existe una URL por cada WebJob que creamos. La misma se compone de https://SITE_NAME.scm.azurewebsites.net/api/triggeredwebjobs/NOMBRE_DEL_JOB/run. Sólo cuando creamos uno de tipo programado podemos acceder a esta información, haciendo clic sobre el enlace Schedule del WebJob:

Website - WebJob - Schedule link

Este nos llevará al servicio Scheduler donde podremos ver todos aquellos WebJobs que estén siendo lanzados de una forma programada:

Scheduler WebJobs

Si accedemos al que aparece en la lista, nos llevará a una sección llamada job action, donde podremos comprobar su configuración:

Scheduler job action

El servicio Scheduler está realizando una llamada POST a la URL mencionada anteriormente, con las cabeceras Authorization, donde se incluyen las credenciales del perfil de publicación, y Content-Type usando text/plain.

Si no tuvieras ningún WebJob programado, puedes utilizar los recuadros de este post para obtener la cadena en base64, compuesta por userName:userPWD

Llamada desde Fiddler

¡Listo! ya sabemos cómo funcionan las llamadas a los WebJobs. En este ejemplo he utilizado Fiddler para realizar la prueba:

Fiddler calling a WebJob

El resultado de esta acción debería ser un 202 (Accepted). Además, podemos comprobar los logs del WebJob en la siguiente URL: https://SITE_NAME.scm.azurewebsites.net/azurejobs/#/jobs/triggered/WEBJOB_NAME

WebJob Recent job runs

Espero que sea de utilidad.

¡Saludos!

Modificar Encoding Reserved Units desde .NET

Si lo sé, hoy no he parado de publicar ¡pero hay tantas cosas por aprender! y estas son dudas o solicitudes que me piden y, siempre que tengo la oportunidad, me gusta compartirlas con todo el mundo. Al igual que esta mañana veíamos cómo se podían modificar las unidades reservadas para el streaming desde .NET, ahora queda por modificar las unidades de encoding que hemos reservado:

using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace ReservedUnits
{
    class Program
    {
        static void Main(string[] args)
        {
            //1. Get Application Settings
            var ServiceManagementUrl = ConfigurationManager.AppSettings["ServiceManagementUrl"];
            var SuscriptionId = ConfigurationManager.AppSettings["SubscriptionId"];
            var MediaAccountName = ConfigurationManager.AppSettings["MediaAccountName"];
            var CertificateB64 = ConfigurationManager.AppSettings["CertificateB64"];
            var Units = 1;


            //2. Create the request
            
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/{1}/services/mediaservices/Accounts/{2}/ServiceQuotas", ServiceManagementUrl, SuscriptionId, MediaAccountName));
            
            request.Method = "PUT";
            request.Accept = "application/json";
            request.ContentType = "application/json; charset=utf-8";
            request.Headers.Add("x-ms-version", "2011-10-01");
            request.Headers.Add("Accept-Encoding: gzip, deflate");
            request.ClientCertificates.Add(new X509Certificate2(Convert.FromBase64String(CertificateB64)));


            //3. Payload
            string json = @"[{""RequestedUnits"": " + Units + @",""ServiceType"":""Encoding""}]";

            //4. Make the call

            using (Stream requestStream = request.GetRequestStream())
            {
                var requestBytes = Encoding.ASCII.GetBytes(json);
                requestStream.Write(requestBytes, 0, requestBytes.Length);

                //5. Get the response

                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    var responseStream = response.GetResponseStream();
                    var reader = new StreamReader(responseStream);

                    Console.WriteLine(reader.ReadToEnd());
                }
            }

            Console.ReadLine();
        }
    }
}

Antes de nada quiero aclarar que esta Api REST no está documentada y no puedo garantizar que este código siga funcionando en el futuro. He conseguido localizar esta información revisando el código fuente de la herramienta Azure Media Services Explorer.

Para esta operación no disponemos todavía de un método en el SDK, por lo que hay que realizar la llamada directamente a la API REST. Para ello necesitamos la URL de administración (https://management.core.windows.net), el id de la suscripción, el nombre de la cuenta de Azure Media Service que queremos modificar y un certificado que esté asociado al portal de Azure. Para este ejemplo (no apto para producción), he obtenido toda esta información del archivo de publicación de la plataforma. Para descargar el tuyo, basta con hacer clic sobre este enlace y logarse con las credenciales de la suscripción de Microsoft Azure.

Una vez que tenemos todos los valores, creamos la petición a través de WebRequest.Create y configuramos la misma con los valores mostrados en el código anterior. Para añadir el certificado he utilizado new X509Certificate2(Convert.FromBase64String(CertificateB64) para poder realizar la transformación. El payload de la petición está en formato JSON y, simplificando el ejemplo, he montado el objeto en una cadena de texto, concatenado con el número de unidades que vamos a solicitar.

Por último, realizamos la llamada y obtenemos la respuesta de la petición. El resultado debería ser el siguiente:

Encoding Reserved Units request result

Espero que sea de utilidad.

¡Saludos!