Azure App Configuration: Configuración centralizada de aplicaciones

Tiempo de lectura: 8 minutos
La imagen muestra el icono de Azure App Configuration

Vuelta al trabajo y vuelta al blog tras un merecido descanso navideño. Después de unas semanas de parón hoy vengo a hablaros de un servicio muy interesante para centralizar la configuración de aplicaciones. Este servicio es Azure App Configuration.

Es hora ya de dejar .Net Core 3, sus interfaces, expresiones switch y demás novedades y volver a meternos de lleno con diferentes herramientas que utilizar en nuestro día a día.

Situación

La idea de escribir sobre este servicio viene de que no hace mucho en el trabajo estuvimos comentando cual podría ser una buena manera de mantener de manera centralizada las diferentes configuraciones que tienes nuestros contenedores en kubernetes, ya que el hecho de utilizar variables de entorno obliga a reiniciar el contenedor para actualizar las variables.

Existen múltiples opciones para resolver ese problema utilizando volúmenes de persistencia para almacenar esas configuraciones, pero eso requiere de tener un volumen, lo que no siempre es posible o aceptable…

Hace cosa de un año Microsoft puso en preview el servicio Azure App Configuration que promete resolver todos los problemas de centralizar la configuración de un plumazo. La parte mala es que después de un año, sigue en preview… Por esta razón no lo estamos implementando aún. Pero no quita que sea un servicio muy interesante y por eso vamos a verlo en profundidad en esta entrada.

¿Qué es Azure App Configuration?

En primer lugar, conviene tener claro de que estamos hablando. Azure App Configuration es un servicio que nos permite tener de manera unificada y centralizada las diferentes configuraciones que tienen una o varias aplicaciones. Este servicio funciona no solo con C# y .Net, sino también con Java, Python y JavaScript.

Con esto vamos a poder resolver de manera muy sencilla situaciones donde, por ejemplo, estamos haciendo una escalabilidad horizontal. La escalabilidad horizontal consiste en tener varias instancias de nuestro servicio corriendo a la vez de modo que aumentemos la capacidad de respuesta que tiene. Un ejemplo de esto puede ser una web corriendo en varias máquinas a la vez de modo que se pueda responder a muchas más peticiones que si solo estuviese en una.

Este es un escenario tipo donde compartir la configuración es vital, ya que si tenemos el mismo servicio en paralelo, pero hay que configurarlo en cada instancia que está corriendo, podemos tener problemas porque una instancia no esté configurada igual que las demás.

Aquí es donde entra en juego Azure App Configuration. Gracias a este servicio vamos a tener concentradas en un almacén las configuraciones de modo que, al cambiarlas en ese punto, todas las instancias se enteren y actualicen sus datos. Un punto interesante es que mientras siga en preview es gratuito, por lo que te recomiendo que lo pruebes ya que es gratis y puede ser una solución a algún problema.

Crear el almacén

Para poder utilizar un almacén de Azure App Configuration vamos a tener que crear el servicio en el portal de Azure. Para esto basta con que pulsemos crear un recurso y escribamos ‘App Configuration’:

La imagen muestra el portal de Azure creando un Azure App Configuration

Tras esto le damos a crear y solo es necesario rellenar 4 campos para crear el almacén:

La imagen muestra los 4 datos que solicita para crear el almacen. Nombre del recurso, Suscripción, Grupo de recursos y localización

Con esto se inicia el proceso de creación del almacén que estará disponible en unos segundos. Una vez que esté disponible, ya podemos empezar a usarlo como almacén de configuraciones.

Lo primero será registrar las diferentes configuraciones que van a estar disponibles para las aplicaciones. Para eso dentro del servicio vamos a ir a ‘Explorador de configuración’ y después a ‘Crear’:

La imagen muestra el panel principal de Azure App Services indicados los botones `Explorador de configuración` y `Crear`

Seleccionamos clave valor (algunas traducciones de Azure son…) y ya podemos registrar la clave:

La imagen muestra la ventana de creación de claves

De este modo tan sencillo vamos a poder ir creando diferentes claves en Azure App Configuration con sus valores que van a poder ser consumidos por las diferentes aplicaciones. Para esta entrada yo he creado dos claves que luego se consumirán desde una aplicación ASP NET Core:

La imagen muestra dos claves: asp:welcomesettings:author=FixedBuffer y asp:welcomesettings:message=Hola a todos!

En caso de que tengas ficheros de configuración ya creados, es posible importarlos desde varios formatos gracias a la opción Importar/Exportar. De igual modo es posible exportarlos a varios formatos.

Obteniendo acceso de aplicaciones para Azure App Configuration

Ahora que ya está creado el almacén y tiene algunas claves creadas, es necesario tener unos datos de acceso de modo que las aplicaciones se puedan conectar con el este para leer la configuración.

Esto lo vamos a conseguir desde el menú ‘Claves de Acceso’ donde vamos a poder elegir si queremos de lectura y escritura o solo de lectura:

La imagen señala los botones 'Claves de acceso', 'Claves de lectura' y 'Copiar cadena de conexión'

Elijamos de lectura y escritura o solo lectura, lo que nos interesa es la cadena de conexión ya que es lo que vamos a necesitar en las aplicaciones para poder acceder al almacén.

Utilizando Azure App Configuration en una aplicación .Net Core

Para poder utilizar el almacén de Azure App Configuration dentro de una aplicación .Net, es preciso añadir el paquete NuGet ‘Microsoft.Extensions.Configuration.AzureAppConfiguration‘. Además, para poder buscarlo dentro de Visual Studio es necesario tener activado el check de mostrar paquetes en preview.

Una vez que esta el paquete instalado simplemente es necesario obtener el ‘IConfiguration’ de donde vamos a recuperar las configuraciones:

private static IConfiguration _configuration = null;
//...
var builder = new ConfigurationBuilder();
builder.AddAzureAppConfiguration(options =>
{
    options.Connect(connectionString)
           .ConfigureRefresh(refresh => //registramos el refresco
           {
               refresh.Register("asp:welcomesettings:author")
                      .Register("asp:welcomesettings:message")
                      .SetCacheExpiration(TimeSpan.FromSeconds(10));
           });
});
_configuration = builder.Build();
//Escribimos un mensaje accediendo a la configuración
Console.WriteLine(_configuration["asp:welcomesettings:message"]);

Con el código anterior estamos recuperando las configuraciones que haya registradas en Azure App Configuration y además le estamos indicando que queremos que ‘asp:welcomesetting:author’ y ‘asp:welcomesetting:message’ se actualicen. También estamos invalidando el tiempo de actualización por defecto que es 30 segundos para hacer que se actualice cada 10.

Con esto, simplemente sería necesario añadir el IConfiguration al inyector de dependencias si lo hubiese o mantenerlo con un acceso global para poder acceder a la configuración siempre que nos haga falta. Además, el único dato de configuración que necesita la propia aplicación es la cadena de conexión al almacén.

Utilizando Azure App Configuration en una aplicación web ASP NET Core

Aunque con lo que acabamos de ver para aplicaciones puede ser suficiente, hay otro paquete que nos permite directamente utilizar este almacén como uno de los propios de la web de modo que automáticamente podamos inyectar las configuraciones como una dependencia. Este paquete es ‘Microsoft.Azure.AppConfiguration.AspNetCore‘.

Para el ejemplo se está utilizando una aplicación ASP NET Core 3.1 MVC

Una vez instalado vamos a añadir la configuración directamente sobre el HostBuilder (en Program.cs):

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureAppConfiguration((hostingContext, config) =>
      {
          config.AddAzureAppConfiguration(options =>
          {
              options.Connect(connectionString)
                   .ConfigureRefresh(refresh =>
                   {
                       refresh.Register("asp:welcomesettings:message")
                            .Register("asp:welcomesettings:author")
                            .SetCacheExpiration(TimeSpan.FromSeconds(10));
                   });
           });
       })
       .ConfigureWebHostDefaults(webBuilder =>
       {
           webBuilder.UseStartup<Startup>();
       });

Como puedes comprobar, hasta aquí es exactamente igual que hacíamos en una aplicación. La diferencia radica en que ahora vamos a crear una clase para esos settings:

public class WelcomeSettings
{
    public string Message { get; set; }
    public string Author { get; set; }
}

Y en ‘ConfigureServices’ de la clase ‘Startup’ vamos a añadir la línea para convertir la configuración en la clase:

services.Configure<WelcomeSettings>(Configuration.GetSection("asp:welcomesettings"));

Por último, dentro del método ‘Configure’ de esta misma clase vamos a añadir el middleware de Azure App Copnfiguration:

app.UseAzureAppConfiguration();

Ahora todo está listo y configurado para poder utilizar Azure App Configuration como un almacén de configuración dentro de nuestra aplicación web. Vamos a probarlo inyectando la configuración como un snapshot a HomeController y pasándoselo a una vista donde lo visualicemos:

public class HomeController : Controller
{
    private readonly WelcomeSettings _welcomeOptions;

    public HomeController( IOptionsSnapshot<WelcomeSettings> welcomeOptions)
    {
        _welcomeOptions = welcomeOptions.Value;
    }

    public IActionResult Index()
    {
        return View(_welcomeOptions);
    }
}
@model WelcomeSettings

<div class="text-center">
    <h1 class="display-4">@Model.Message</h1>
    <h2 class="display-4">By: @Model.Author</h2>
</div>'

Una vez que esta esto listo, solo nos queda probarlo. Si arrancamos la aplicación nos encontramos con algo como esto:

La imagen muestra la web con los mensajes obtenidos desde Azure App Configuration

Sin detener la aplicación vamos a editar el valor de la configuración ‘asp:welcomesettings:author’ desde el servicio haciendo click en los 3 puntos y pulsando editar:

La imagen muestra con flechas como se llega a los 3 puntos de la derecha y al botón editar

Una vez que hemos editado su valor, simplemente vamos a recargar la página de nuestra web y vamos a comprobar cómo ha cambiado el valor.

Recuerda que le hemos dado 10 segundos de tiempo de vida a la cache de la configuración, por lo que puede tardar hasta 10 segundos en actualizarse el valor que vemos.

La imagen muestra la misma web ASP NET Core que hemos creado con los valores del Azure App Configuration actualizados

Conclusión

Aunque ahora mismo el servicio de Azure App Configuration está en preview y lleva así desde hace mucho tiempo, es un servicio que funciona bien. Personalmente me gusta y lo utilizo en mis proyectos personales ya que me permite centralizar la configuración de todos mis proyectos en un único sitio de manera muy cómoda.

De igual manera me permite que cuando los contenedores que tengo desplegados sobre un AKS escalan (AKS es el servicio de Kubernetes de Azure, del que hablaremos en algún momento 🙂 ), automáticamente adopten la configuración y apliquen los cambios. Sí, sé que esto lo puedo conseguir perfectamente con volúmenes donde se persistan las configuraciones, pero gracias Azure App Configuration tengo las que pertenecen a contenedores y las que no en el mismo sitio.

No es recomendable utilizar elementos en preview si vamos a llevar algo a producción y no seré yo el que recomiende hacerlo, si alguien quiere hacerlo es bajo su cuenta y riesgo. No obstante, durante la fase de desarrollo donde las configuraciones cambian frecuentemente, sobre todo en entornos de desarrollo, es una opción a tener muy encuenta.

¿Qué opinas tú? ¿Conocías Azure App Configuration como almacén de configuraciones?

Para que puedas probar tú mismo Azure App Configuration en ambos escenarios, he subido el código a GitHub en dos ramas, application para la aplicación de consola y web para la aplicación MVC. En ambos casos tendrás que añadir las configuraciones en el servicio y reemplazar la cadena de conexión.

Deja un comentario