Microsoft Azure Api Management

Api-Management
Cada vez son más las compañías que ofrecen su información a terceros con el fin de integrar su negocio en otros lugares de Internet. Cuando nuestra información es importante para otros, la forma más común de compartirla es a través de Apis. Esto a veces no es una tarea fácil, ya que debemos tener en cuenta cuotas, autenticación, cacheo, análisis del tráfico, límite de llamadas, etcétera. Para ello Microsoft Azure ha puesto a nuestra disposición un nuevo servicio llamado Api Management, el cual nos permite administrar todas las Apis de nuestra organización de una forma centralizada.

Crear cuenta de Api Management

Para poder utilizar este servicio es necesario crear una cuenta de Api Management a través del portal de Microsoft Azure:

Create an Api Management Service

Utilizamos la opción NEW del menú inferior y lanzamos el asistente para la creación de una nueva cuenta:

Create an Api Management Service Wizard

En la primera parte del asistente es necesario indicar el nombre que formará parte de la URL del servicio, y la región donde estará ubicado.

Create an Api Management Service Organization Name

Tanto para mostrarlo en el portal de Api Management como para los correos que forman parte del servicio, debemos elegir el nombre de la organización y el correo electrónico del administrador.
Las opciones avanzadas simplemente nos permiten seleccionar el tipo de cuenta (TIER) que necesitamos: Developer o Standard. Esta información puede ser cambiada más adelante desde el portal, en el apartado SCALE.

Aceptamos los cambios y esperamos a que termine la creación. Este proceso puede durar varios minutos.

Your Api management service was created

Una vez que la creación de la cuenta ha terminado tenemos dos portales: uno para la administración del servicio, independiente del portal de Microsoft Azure, y otro para los desarrolladores o usuarios que utilizarán las Apis. En el primero de ellos, tenemos un conjunto de opciones que nos permitirán agregar Apis, políticas, modificar el portal del desarrollador, etcétera.

Agregar Apis al servicio

Para poder contaros este servicio, he creado una Api en .NET, que agregaremos a Api Management y expondremos a los desarrolladores:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace WebApi.Controllers
{
    public class TestController : ApiController
    {
        static List<string> list = new List<string> { "Barney", "Robin", "Ted", "Lily" };

        // GET: api/Test
        public IEnumerable<string> Get()
        {
            return list;
        }

        // GET: api/Test/5
        public string Get(int id)
        {
            return list[id];
        }

        // POST: api/Test
        public void Post([FromBody]string value)
        {
            list.Add(value);
        }

        // PUT: api/Test/5
        public void Put(int id, [FromBody]string value)
        {
            if (id < list.Count)
            {
                list[id] = value;
            }
        }

        // DELETE: api/Test/5
        public void Delete(int id)
        {
            if (id < list.Count)
            {
                list.RemoveAt(id);
            }
        }
    }
}

Accedemos al portal de administración a través de cualquiera de los dos enlaces del portal de Azure, botón MANAGE del menú inferior o a través del enlace Management console. En la página de administración utilizamos la acción ADD API en el DASHBOARD o desde la sección APIS, como se muestra en la imagen:

Add API

Los datos que debemos indicar para la creación de una nueva Api son los siguientes: un nombre descriptivo de la misma, la URL donde está alojada (en este ejemplo he desplegado la Api anterior en el servicio de Microsoft Azure Web sites, pero podría estar en cualquier otro hosting) y el sufijo por el cual nos vamos a referir a ella dentro de la cuenta de Api Management.

Add New Api

Una vez que haya finalizado la creación, el asistente nos llevará a la nueva Api donde podremos dar de alta las operaciones o métodos que el desarrollador podrá utilizar. Para ello basta con hacer clic sobre la opción ADD OPERATION:

New Api Add Operation

Para que este ejemplo resultara lo más sencillo posible, he utilizado la convención de ASP.NET Web Api con la que podemos utilizar la misma URL cambiando únicamente el Http Verb en cada petición, para llevar a cabo la obtención, creación, modificación y eliminación de elementos. En el asistente New operation damos de alta cada una de las operaciones utilizando como URL /test, ya que es el nombre del controller de Web Api, escribimos un nombre descriptivo para cada acción y utilizamos el HTTP Verb que corresponda:

New operation GET

En aquellas operaciones donde sea necesario obtener el id, basta con modificar la URL template y añadir {id} al final de la dirección, tal y como se muestra en la siguiente imagen:

New Operation URL template

Por otro lado, podemos elegir el tipo de dato que se espera para dicho Id en el apartado Request > Parameters:

Api New Operation Request Parameters

Esta información se utilizará para la documentación de la Api. Una vez que hayamos terminado de añadir todas las operaciones, veremos el listado de las mismas en el apartado operations, con el fin de poder modificarlas en un futuro:

Api Operations

Productos

Para que una Api pueda ser expuesta a los desarrolladores/clientes, esta debe estar contenida dentro de lo que se conoce como Product en Api Management. Un producto nos permite agrupar varias Apis, controlar el acceso a las mismas mediante grupos, etcétera.

Api Management Products

Para este ejemplo crearemos un nuevo producto, a través de ADD PRODUCT donde deberemos asignar un nombre, una descripción (opcional) y marcaremos Require suscription approval:

Api Management Add New Product

Una vez creado, hacemos clic sobre el nuevo elemento en el listado de la sección PRODUCTS y añadiremos la Api que dimos de alta en el paso anterior, a través de la opción ADD API TO PRODUCT.

Add Api to product

El último paso sería publicarlo a través de la opción PUBLISH, con el fin de que la Api sea visible para los desarrolladores:

Api Management Product Publish

Usuarios y grupos

Para que un usuario/cliente/desarrollador pueda acceder al producto creado anteriormente, este debe tener un usuario dentro de la cuenta de Api Management. Existen dos formas de dar de alta un usuario: creando una cuenta de forma manual, asociando un email y contraseña a través de la opción ADD USER, o bien permitiendo al usuario que configure su propia credencial a través de una invitación utilizando INVITE USER:

Api management Users ADD USER INVITE USER

Si el usuario es creado a través de invitación, el mismo no será visible hasta que el desarrollador haya elegido su contraseña a través del correo electrónico recibido (es necesario comprobar que la dirección apimgmt-noreply@mail.windowsazure.com no esté en SPAM). Una vez que el usuario haya elegido su contraseña, podrá acceder al apartado PRODUCTS y suscribirse a nuestra Api:

Api management product subscribe

Como marcamos la opción Require suscription approval durante la creación del producto, el usuario recibirá el siguiente mensaje a la espera de ser aprobada su solicitud al producto:

Api Management Product you'll be notified

Cuando un administrador acceda al portal, podrá ver en el Dashboard que alguno de los productos tiene peticiones pendientes de aprobar/denegar:

Api Management Dashboard Alert Product Request

Seleccionamos el producto y aceptamos el acceso al nuevo usuario a través de la pestaña Subscription requests:

Api Management Suscription Request

A partir de este momento, el usuario tendrá acceso a las operaciones dadas de alta en la Api y se le asignará además un token (subscription key) para poder acceder a la misma.

Probando la Api

El último paso de este post es probar la Api que hemos configurado dentro del servicio Api Management de Microsoft Azure. Con el nuevo usuario accedemos al nuevo portal a través de https://[ACCOUNT_NAME].portal.azure-api.net/ o bien haciendo clic en el enlace superior Developer Portal del sitio de administración. Seleccionamos la opción APIS donde podremos ver el listado de las apis disponibles y seleccionamos la creada durante este post:

Developer portal APIS returngis

Cuando accedemos a cualquiera de ellas podemos observar que en el lado izquierdo aparecerá el listado de las operaciones disponibles y, por cada una de ellas, la opción de abrir una consola y lanzar peticiones o bien copiar el código de cliente en diferentes lenguajes:

Testing Api

Esta ha sido una introducción general al nuevo servicio de administración de Apis, con el objetivo de entender cuál es la intención del mismo.

Espero que haya sido de utilidad.

¡Saludos!

¡Evento de Microsoft Azure Media Services en Barcelona!

AzureMediaServicesPlatformPromo_960

Durante los días 28 y 29 de Octubre tienes la oportunidad de conocer más sobre Azure Media Services en el hotel Hilton Diagonal Mar en Barcelona. Hemos preparado un evento gratuíto donde podrás conocer la solución para media de Microsoft Azure. Durante el primer día, hablaremos del servicio y las nuevas características lanzadas recientemente, como Live Streaming, Content Protection e Indexing. Para registrarte puedes hacerlo a través del siguiente enlace: Media in the Cloud Summit: Microsoft Azure Media Services.

El segundo día está pensado para los más techies, donde abriremos Visual Studio y te ayudaremos a crear tu propia aplicación. Para este día puedes apuntarte a través de este otro enlace:Media in the Cloud Workshop: Microsoft Azure Media Services.

¡Esperamos veros allí!

Azure Automation: creando runbooks

Hace unos días estaba pensando en la mejor forma de poder apagar y encender todas las máquinas que tenía en mi suscripción de pruebas, con el fin de ahorrar gastos innecesarios. Este puede ser además un escenario muy común en el mundo cloud para entornos de desarrollo, preproducción, QA, etcétera: Si conozco el horario en el que se están haciendo uso de ciertas máquinas ¿Por qué no apagarlas cuando no son necesarias y así ahorrar costes?
El servicio pensando para este tipo de tareas automáticas dentro de la plataforma Microsoft Azure se conoce como Automation (todavía en preview). Básicamente lo que nos permite es crear scripts en PowerShell llamados runbooks que nos ayuden a realizar múltiples tareas. En este post me gustaría mostrar cómo apagaríamos y encenderíamos nuestras máquinas virtuales de una forma programada.

Crear y subir un certificado de administración al portal

Lo primero que debemos hacer es subir un certificado para poder dar acceso a los runbooks del servicio. Para esta demo basta con crear un certificado firmado por nosotros mismos, haciendo uso de la herramienta makecert.exe:

makecert.exe -n "CN=AutomationCert" -pe -ss My -sr CurrentUser -r -a sha1 -sy 24 -sky exchange -len 2048

Azure Automation makecert

Exportamos el mismo con y sin la contraseña privada (seleccionando el certificado dentro de Personal > Certificates y con el botón derecho All Tasks > Export):

Automation certs

Dentro del apartado Settings > MANAGEMENT CERTIFICATES subimos el archivo .cer:

Settings Management Certificates Azure Automation

Crear un servicio de Azure Automation

La forma de crear un servicio de Azure Automation es muy sencillo. Lo primero es necesario comprobar que tenemos acceso a la preview del servicio a través de la página de Preview features:

Azure Automation Preview Feature

Dentro del portal buscamos la sección AUTOMATION y hacemos clic sobre CREATE AN AUTOMATION ACCOUNT:

Create an automation account

Es necesario elegir un nombre para la cuenta y la ubicación de la misma. Durante la preview sólo es posible crear el servicio en East US:

Add a New Automation Account

Esta operación tardará tan sólo unos segundos. Si accedemos a la nueva cuenta veremos que tenemos diferentes apartados:

  • DASHBOARD: nos muestra el estado de la cuenta, el número de jobs lanzados en los últimos 30 días, su estado, número de runbooks, conexiones, variables, etcétera.
  • RUNBOOKS: se utiliza para gestionar los runbooks o listado de procedimientos.
  • ASSETS: nos permite agregar diferentes tipos de elementos, como certificados, conexiones, variables, etc.

Asociar el certificado de administración con Automation

Si recordamos el primero de los pasos, tuvimos que crear un certificado y exportar el mismo con y sin la clave privada. El archivo .cer lo subimos directamente al portal y ahora necesitamos enlazar el certificado con clave privada con nuestra nueva cuenta de Azure Automation. Para ello, seleccionamos la pestaña ASSETS y hacemos clic en la opción ADD SETTING del menú inferior. En el nuevo cuadro de diálogo seleccionamos ADD CREDENTIAL para la asociación del certificado:

Azure Automation Add Setting Credential

Cuando creamos una credencial existen a día de hoy dos posibilidades: Windows Powershell Credential y Certificate. La primera de ella nos permite utilizar Azure Active Directory para la conexión con Azure Automation. En este ejemplo utilizaremos la segunda opción basada en certificados.

Automation ADD CREDENTIAL Define Credential

Crear una conexión

Una vez que tenemos dado de alta el certificado que queremos utilizar necesitamos un nuevo elemento llamado conexión. Lo que nos va a permitir es enlazar el certificado, que a su vez se corresponde con el certificado que subimos en el apartado settings, y la suscripción a la que pertenece. Para ello, volvemos a utilizar ADD SETTING, pero esta vez elegimos la opción ADD CONNECTION:

Azure Automation Add Setting Add Connection

En el primer paso del asistente es muy importante utilizar como nombre el nombre de la suscripción a la que va asociada, ya que de lo contrario no funcionará:

Automation Add Connection Configure connection

Por último, debemos escribir el nombre del certificado que dimos de alta dentro de la cuenta de Azure Automation y el Id de la suscripción:

Automation Add Connection Configure connection properties

Runbooks

Una vez que tenemos creada y configurada la nueva cuenta ya estamos preparados para la creación o importación de runbooks. Un runbook básicamente es un script en Powershell a través del cual podemos lanzar una o más acciones. Lo ideal es que cada módulo sea lo más simple y concreto posible, con el fin de que varios de ellos puedan ser reutilizados dentro de otros runbooks. En este ejemplo vamos a crear 3 scripts: uno que conecte con la suscripción, otro que pare las máquinas virtuales de la misma y un último que sea capaz de arrancarlas.

Runbook #1: Conexión con la suscripción

Antes de comenzar a crear nuestros propios scripts es importante saber que existe un sitio llamado Script Center, donde el propio equipo del producto, y otros desarrolladores, comparten sus propios runbooks. Para este ejemplo he utilizado el llamado Connect to an Azure Subscription using Certificates. Cuando creamos o descargamos un runbook la única acción que debemos llevar a cabo es la importación del archivo dentro de la cuenta. Para ello, accedemos al apartado de RUNBOOKS y utilizamos la opción IMPORT del menú inferior:

Automation IMPORT runbook

Si hacemos clic en la opción EDIT RUNBOOK o bien seleccionamos el nuevo elemento dentro del listado podemos acceder al script e incluso realizar pruebas antes de publicarlo. En este caso, pulsamos sobre la opción PUBLISH del menú inferior:

Automation Connect-Azure Runbook

Runbook #2: Apagando máquinas

En el caso del runbook que se encarga del apagado de las máquinas virtuales lo vamos a crear desde cero. Para ello, dentro del apartado RUNBOOKS pulsamos sobre el botón NEW > APP SERVICES > AUTOMATION PREVIEW > RUNBOOK > QUICK CREATE y utilizamos como nombre Stop-VMs:

New Automation Runbook

Una vez que el nuevo elemento se haya creado aparecerá en la lista junto con Connect-Azure. Hacemos clic sobre él y seleccionamos la pestaña AUTHOR. Al tratarse de un nuevo script, encontraremos la siguiente estructura:

workflow Stop-VMs
{
}

Todos los runbooks deben estar encapsulados dentro de un workflow con el nombre que hayamos elegido. En este script además vamos a hacer uso del módulo anterior, Connect-Azure, para poder acceder a los elementos de la suscripción sobre la cual queremos operar. Una vez que tengamos acceso, recuperaremos todas las máquinas virtuales existentes y utilizaremos el comando Stop-AzureVM por cada una de ellas. El código del script sería similar al siguiente:

workflow Stop-VMs
{
    #Connect-Azure -AzureConnectionName
    $subscriptionName = "Internal Consumption"
    Connect-Azure -AzureConnectionName $subscriptionName  
    Select-AzureSubscription $subscriptionName
    
    # Get VMs 
    $VMs = Get-AzureVM
    $VerbosePreference = "Continue"
     
    if( $VMs.Count -gt 0 ){
        
        Foreach($vm in $VMs){
            $vmName = $vm.Name
            Write-Verbose "Stopping $vmName"
            Stop-AzureVM -ServiceName $vm.ServiceName -Name $vm.Name -Force            
        }
        
        "All machines are now stopped!"
    }
    else{
        "You don't have machines in this subscription"
    }
}

Antes de publicar el código anterior, podemos realizar pruebas y ver el resultado a través de la sección Output, utilizando el botón TEST del menú inferior:

Automation Runbook Output pane

Runbook #3: Arrancando máquinas

El último script que debemos crear es exactamente igual que el anterior a excepción del comando a utilizar, ya que en este caso será Start-AzureVM:

workflow Start-VMs
{
    #Connect-Azure -AzureConnectionName
    $subscriptionName = "Internal Consumption"
    Connect-Azure -AzureConnectionName $subscriptionName  
    Select-AzureSubscription $subscriptionName
    
    # Get VMs 
    $VMs = Get-AzureVM

    if( $VMs.Count -gt 0 ){
        
        Foreach($vm in $VMs){
            $vmName = $vm.Name
            Write-Verbose "Starting $vmName"
            Start-AzureVM -ServiceName $vm.ServiceName -Name $vm.Name            
        }
        
        "All machines are now started!"
    }
    else{
        "You don't have machines in this subscription"
    }
}

Una vez que hayamos realizado las pruebas pertinentes publicamos los runbooks Stop-VMs y Start-VMs.

Programando runbooks

En el caso de la parada de las máquinas, accedo al runbook Stop-VMs y en la pestaña Schedule seleccionamos la opción Link to a new schedule:

Automation Stop-VMs Link to a new Schedule

Lo único que necesitamos es elegir un nombre y de manera opcional una descripción:

Automation Configure Schedule

Por último debemos elegir cuándo y con qué frecuencia queremos que se lance:

Automation Configure Schedule Daily

En el caso del arranque de las máquinas sería exactamente igual pero, en mi caso, cambiando la hora de ejecución a las 8:00.

Espero que haya sido de utilidad.

¡Saludos!