Replicar una cuenta de Api Management

Estos días estoy trasteando mucho con Azure Api Management, preparando entornos, haciendo cambios continuamente, etcétera. Por todo ello he necesitado replicar en más de una ocasión una cuenta con el fin de simular entornos de preproducción y producción. En este post me he valido del artículo How to implement disaster recovery using service backup and restore in Azure API Management, donde se explica cómo crear backups y restaurarlos, lo cual puede ser igualmente útil para la replicación de entornos.

Acceso a la API de Resource Manager

Lo primero que debes hacer es crear una aplicación dentro del Azure Active Directory que gestiona la suscripción Microsoft Azure donde está la cuenta de Api Management que quieres replicar.

Azure Active Directory - Add application

El tipo de acción debe ser Add an application my organization is developing, elige un nombre descriptivo (en mi caso resources) y el tipo debe ser native client application. El último paso del asistente es la URL a la que se redirige el servidor de autenticación con la respuesta. No tiene por qué ser una dirección real, por lo que en esta aplicación será http://resources.

Una vez creada, en el apartado CONFIGURE deberás añadir la aplicación Windows Azure Service Management API a través del botón inferior Add application.

Azure AD - Permissions to other applications

Por último, en el combo Delegated permissions de la aplicación que acabas de agregar, debes seleccionar Access Azure Service Management (preview) y guardar los cambios.

Azure Active Directory - Delegated permissions

Antes de poder invocar a las Apis que generan el backup y lo restauran es necesario conseguir un token. Para conseguirlo, podemos utilizar un código como el siguiente, utilizando el paquete de Nuget Microsoft.IdentityModel.Clients.ActiveDirectory:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System;

namespace GetTokenResourceManagerRequests
{
    class Program
    {
        static void Main(string[] args)
        {
            var authenticationContext = new AuthenticationContext("https://login.windows.net/{tenant id}");
            var result = authenticationContext.AcquireToken("https://management.azure.com/", {application id}, new Uri({redirect uri});

            if (result == null) {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            Console.WriteLine(result.AccessToken);

            Console.ReadLine();
        }
    }
}

Los valores que debes reemplazar del código anterior son:

  • {tenantId}: Se trata del Id del tenant de Azure Active Directory, el cual puedes encontrar en el apartado View Endpoints  de la aplicación que acabas de crear.
    Azure Active Directory - app - view endpoints
    Puedes copiar el id del tenant que está asociado a esa aplicación de cualquiera de los endpoints.
  • {application id} y {redirect uri} son el Client ID de la aplicación y URL que figura en redirect URIs, que fue la que asignaste durante la creación de la aplicación.
    Azure Active Directory - Configure - Client ID - URL

Si los datos son correctos, obtendrás un resultado parecido a este:

Azure Active Directory - resources - token

Con estos pasos ya habrás pasado la parte más tediosa. Ya sólo basta con crear un backup y restaurarlo en otra cuenta para replicar el contenido.

Backup y restore

Con el fin de facilitar la comprensión de las llamadas, he utilizado Postman, uno de los clientes que utilizo para probar Apis. En él he creado un entorno con los siguientes valores:

Postman - Api Management env

Para crear un backup de un entorno, debes hacer una llamada POST a la siguiente URL: https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.ApiManagement/service/{{serviceName}}/backup?api-version={{api-version}}

Como cabeceras son necesarias el Content-Type: application/json y Authentication: Bearer {{AccessToken}}. Debes actualizar la variable AccessToken con el token obtenido en el paso anterior. El cuerpo del mensaje está compuesto por un JSON con los datos de la cuenta de storage donde se almacenará el backup:

{
    "storageAccount" : "{{StorageName}}",
    "accessKey" : "{{StorageKey}}",
    "containerName" : "{{ContainerName}}",
    "backupName" : "{{BackupName}}"
}

Al lanzar la solicitud recibirás un 202 (Accepted) y deberás esperar a que el proceso finalice.

Postman - Backup Api Management

Si quieres comprobar si el backup ha finalizado, puedes hacer una llamada GET a la URL devuelta en la cabecera llamada Location (mientrás está en proceso el resultado será un 202 y un 200 cuando el proceso ha finalizado).

Api Management- Backup - Location header

El objetivo final de este post era replicar el contenido del entorno principal a uno de desarrollo, por lo que para finalizar deberás hacer una llamada POST a la siguiente URL: https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.ApiManagement/service/{{serviceNameTarget}}/restore?api-version={{api-version}}

El cuerpo del mensaje será exactamente el mismo que el utilizado durante el backup. También devolverá un 202 Accepted y podrás comprobar también a través de la URL en la cabecera Location el estado de la restauración en el nuevo entorno.

¡Saludos!