viernes, 3 de abril de 2015

Could not load file or assembly Microsoft.WindowsAzure.Packaging

Luego de instalar la última actualización del Azure SDK 2.5.1 para Visual Studio 2013 ya no pude volver a publicar mi Cloud Service. El error reportado era:

Could not load file or assembly 'Microsoft.WindowsAzure.Packaging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

Error al intentar publicar mi Cloud Service

Buscando en diferentes sitios pude dar con una comentario de Wayne Kuo en StackOverflow explicando que el problema era originado por un problema en el instalador de la nueva versión del Azure SDK, y que pudieron comprobar que quitando y volviendo a instalar las Microsoft Azure Authoring Tools 2.5.1 el problema se solucionaba.
Azure Authoring Tools Installer

Las Microsoft Azure Authoring Tools 2.5.1 pueden bajarse desde:
http://download.microsoft.com/download/1/E/7/1E76DD6F-66F1-47E0-A76A-3BBAAC617316/MicrosoftAzureAuthoringTools-x64.msi
http://download.microsoft.com/download/1/E/7/1E76DD6F-66F1-47E0-A76A-3BBAAC617316/MicrosoftAzureAuthoringTools-x86.msi

En mi caso bastó con ejecutar la opción Repair del instalador de las Authoring Tools, no fue necesario hacerlo en dos pasos (desinstalar y volver a instalarlas).

Opción de reparación

Una vez finalizada la reparación de las Microsoft Azure Authoring Tools 2.5.1 pude volver a publicar mi Cloud Service normalmente.

martes, 17 de marzo de 2015

Como compilar Docker Client en Windows

Desde noviembre de 2014, cuando Ahmet Alp Balkan anunció la disponibilidad de compilar Docker Client sobre Windows, han cambiado algunas cosas.

Acá dejo los comandos que utilicé para compilar el cliente Docker sobre un Windows 8.1 usando Git for Windows, y obviamente Go, el lenguaje en el cual está programado Docker.

Requisitos


Para poder compilar Docker es necesario tener instalado previamente Git for Windows y Go.

Por default el instalador para Windows deja Go en la carpeta C:\Go, y en el ejemplo a continuación se muestra así. Si cambias la carpeta de instalación de Go entonces modifica también la carpeta del primer comando (export GOPATH="c:\go").

Procedimiento

  1. Abrir una consola de Git Bash desde el disco donde está instalado el Go. Para esto dale clic derecho sobre el icono del disco en cualquier explorador de archivos, y selecciona la opción Git Bash que agregó la instalación del Git for Windows.

  2. En la consola de Git Bash ejecuta los siguientes comandos:
# Get the Docker source
export GOPATH="c:\go"
cd $GOPATH
go get github.com/docker/docker

# Compile go-autogen
export GOPATH="$GOPATH;$GOPATH\src\github.com\docker\docker\vendor"
cd src/github.com/docker/docker
hack/make/.go-autogen

# Finally compile Docker Client
export DOCKER_CLIENTONLY=1
cd docker
go build -v

..y listo, en la carpeta $GOPATH\src\github.com\docker\docker\docker te quedó el archivo docker.exe que estabas buscando.

Consola de Git Bash

Si no queres hacer todo esto podes bajarte el Docker 1.18 compilado en Windows desde esta ubicación: https://seketman.blob.core.windows.net/docker/docker_1.18.exe... mucho mas rápido.

sábado, 14 de marzo de 2015

Microsoft Azure Cloud Service - VIP swap feature

El Cloud Service de Microsoft Azure provee la posibilidad de implementar nuestro servicio en dos entornos propios: Production y Staging, y mediante un proceso denominado VIP swap intercambiar los mismos.

Esto es grandioso porque permite implementar un servicio en el entorno de Staging, probarlo, y cuando está todo ok hacer el swap que lo dejará en Production, pero hay que tener en cuenta que este 'intercambio de implementaciones', o 'promoción del servicio en ensayo al entorno de producción', tal como se nombra en varios documentos, en verdad es solamente un intercambio de punteros (la VIP y URL de cada uno de los entornos), las implementaciones en sí no se ven modificadas por este proceso en su configuración ni estado.

Algunos puntos a tener en cuenta:
  • Cada uno de los entornos de un Cloud Service poseen tres atributos propios:
    • Su denominación: Staging o Production
    • Una virtual IP pública, o VIP.
    • ..y una URL: <nombredns>.cloudapp.net (Production), o <guid>.cloudapp.net (Staging)
  • Tanto la VIP como la URL de Staging se mantienen durante todo el ciclo de vida de la implementación mientras no sea borrada (no cambia entre deploys). 
  • Cuando una implementación es borrada de un entorno recién entonces se liberan estos valores, y al hacer una nueva implementación sobre ese entorno siempre se asigna un nuevo valor de VIP. La URL de Staging <guid>.cloudapp.net solo cambia si este proceso de borrado y nueva implementación se lleva a cabo sobre el entorno de Staging.
  • Antes de ejecutar el VIP swap debemos asegurarnos de que la configuración de la implementación en Staging sea la adecuada para pasarla a Production, ya que el proceso no altera ninguno de los valores en cuanto a cantidad de instancias de los roles, ni configuración de autoscaling.
  • Las conexiones establecidas con cada implementación al momento de ejecutar el VIP swap se mantendrán así hasta su cierre por parte del cliente o servidor, no serán canceladas por el proceso de intercambio. Solo las nuevas conexiones son dirigidas a la nueva implementación que ocupa cada entorno.
  • La opción de VIP swap aún no está disponible en el Preview Portal; para ejecutarlo tendremos que servirnos del Management Portal, o invocando la Microsoft Azure Management Service Rest API directamente, o a través del wrapper que conforman las Microsoft Azure Management Libraries, o MAML.
Sección de Management Portal - Cloud Service Dashboard
Sección del Management Portal - Cloud Service Dashboard

Bueno, sigo leyendo el Exam Ref 70-532 Developing Microsoft Azure Solutions a ver como continúa la historia de los Cloud Services.

sábado, 31 de enero de 2015

Tienda online en ASP.NET 5 sobre Docker

Intro

Entusiasmado con la posibilidad que brinda ASP.NET 5 de correr mis sitios web sobre distintas plataformas, me puse a averiguar y escribir un resumen de como levantar un sitio y correrlo sobre Docker dentro de una VM Ubuntu de Microsoft Azure... la sorpresa fue que no te lleva mas de 10 minutos, y funciona de maravillas.


Requisitos

  • Suscripción de Microsoft Azure.
  • Una VM Ubuntu Trusty 14.04 como mínimo, con el puerto 80 habilitado.
  • Estar registrado en Docker.com si queremos salvar allí la nueva imagen creada.

Contenido

  1. Preparar el contenido de la nueva imagen.
  2. Construir la imagen Docker con nuestra aplicación.
  3. Levantar un nuevo container con nuestra imagen.
  4. Salvar nuestra imagen en Docker Hub.

Docker 1. Preparar los componentes de la nueva imagen

La imagen Docker que vamos a crear para correr nuestra aplicación MVC MusicStore estará basada en la microsoft/aspnet publicado por Microsoft meses atrás que, si bien aún está en preview, sirve perfectamente para nuestro propósito.

Actualizamos nuestro Ubuntu; instalamos Docker según se explica en docs.docker.com/installation/ubuntulinux; y también nos aseguramos de contar con Git:
sudo apt-get update
sudo apt-get install docker.io
sudo apt-get install git-core

Por último clonamos en la carpeta local storeapp el proyecto MVC MusicStore de GitHub, con el comando:
git clone http://github.com/aspnet/MusicStore storeapp

Git clone
Git clone

2. Construir la imagen Docker de nuestra aplicación

Nos movemos a la carpeta storeapp/src/MusicStore y ahí creamos el archivo Dockerfile que usaremos para configurar nuestra imagen. Podes crear el archivo con nano o el editor que prefieras:
cd storeapp/src/MusicStore
nano Dockerfile

Copia el siguiente contenido dentro del archivo Dockerfile (las lineas que comienzan con # son comentarios):
# Base image
FROM microsoft/aspnet

# Copy project folder into image and restore Nuget packages
COPY . /app
WORKDIR /app
RUN ["kpm", "restore"]

# Run de web site
EXPOSE 5004
ENTRYPOINT ["k", "kestrel"]

..y creamos la imagen usando el comando:
sudo docker build -t storeapp .

Esto demora un poco, paciencia.

3. Levantar un nuevo container con nuestra imagen

Podemos ver las imágenes en nuestro sistema mediante el comando Docker images, luego levantamos nuestra imagen en un nuevo container con run, y por ultimo listamos los containers con el comando ps:
sudo docker images
sudo docker run -t -d -p 80:5004 --restart=on-failure:10 storeapp
sudo docker ps -a

Creando el Docker container con nuestra imagen

Y ya tenemos nuestra imagen corriendo en un container de Docker en nuestra VM, publicado en el puerto 80 de Ubuntu (no olvides configurar el endpoint en Azure).

4. Salvar nuestra imagen en Docker Hub

Ahora si queremos salvar la imagen en Docker Hub para utilizarla desde cualquier otra VM, o publicarla para la comunidad, podemos agregarle un tag y hacerle un push (previamente tenemos que registrarnos en Docker.com).

Tanto el image id (934e56caf9b8), como el nombre de la cuenta registrada (seketman), deben cambiarse por los valores que corresponden:
sudo docker tag 934e56caf9b8 seketman/storeapp:demo
sudo docker push seketman/storeapp:demo

Nuestro sitio funcionando

Pueden ver este sitio corriendo en soundstore.cloudapp.net

Mucha de la info mostrada se basa en el post Running ASP.NET 5 applications in Linux Containers with Docker de Ahmet Alp Balkan.