Crear cluster de Azure Redis Cache en una Red Virtual y hacer visible el cluster a aplicaciones de App Service Environment

Nota:

Este post es la continuación de la guía: “Configurar y desplegar una Web API en Azure App Service Environment , favor de realizar primero los paso del post antes de seguir con esta publicación.

En muchas ocasiones no se desea tener el servidor de cache expuesto a Internet, ya sea por temas de seguridad o bien se quiere disminuir la latencia de los mensajes del servidor o ancho de banda.
 
Para lograr aislar un servidor de Azure Redis Cache es necesario crear una Subnet dentro de una VNET  que le corresponda a tu aplicación, para posteriormente crear o asignar el servidor de Redis dentro de esa Subnet. Una vez creado el servicio de Redis, solamente las aplicaciones dentro de la misma VNET podrán acceder al servidor de cache, ya que lo hemos aislado en la VNET de nuestra aplicación.
 
App Service Environment nos facilita aislar nuestras aplicaciones en una infraestructura de plataforma como servicio (PaaS) dedicado, lo cual nos da un mayor control del ambiente de la aplicación productiva.
 
La ventaja de tener la aplicación en ASE, es que podemos hacer uso de la VNET que pertenece a la infraestructura de nuestra aplicación y solo agregamos Subnets nuevas para realizar una comunicación interna entre nuestros componente de Azure. En este caso vamos a comunicar un servidor de Azure Redis Cache con nuestra Web API que creamos anteriormente.

Pre Requisitos

Arquitectura resultante:

image

Descargar código de GitHub:

https://github.com/Kodran/AppServiceEnvironment-ClusterRedis-Tutorial


Crear Subnet en Virtual Network de ASE

Ingresamos a https://portal.azure.com y vamos a la sección de “Virtual Network”.

Seleccionamos la VNET de nuestra API “myapp-vnet”, posteriormente damos clic en la opción “Subnets” y agregamos una nueva Subnet “redis-subnet”.

1

2

Les comparto un articulo de Microsoft donde explica a detalle como asignar las IPs de la Subnet para obtener una configuración optima:

https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-manage-subnet


Crear servicio de Azure Redis Cache y agregarlo a nueva Subnet “redis-subnet”

En la opción de Marketplace buscamos por Redis Cache y agregamos un nuevo servidor de Redis y habilitamos el cluster.

Nota: para poder habilitar un cluster, es necesario tener un servidor de Redis premium.

3

5

Una vez que habilitamos el cluster, vamos a seleccionar la VNET de nuestra aplicación y la Subnet que creamos anteriormente y le asignamos una IP estática (no publica).

Damos clic en crear para empezar con el despliegue del cluster.

Nota: el cluster de Redis no debe de compartir una misma subnet con otra aplicación o recurso de Azure, de lo contrario obtendremos errores de creación de Redis y no podremos crear nuestro servicio exitosamente.

6

7


Una vez que finalizada la creación del recurso, podemos ver la información general de Redis: Host, puertos, llaves de autorización y cadenas de conexión:

10

12

11


Crear API para consumo de Redis

Vamos a nuestro proyecto “MyAPI.Demo” y agregamos como referencia la librería: “StackExchange.Redis” el cual nos va a facilitar la interacción con el cluster de Redis. Una vez que tengamos la referencia de la librería, creamos un nuevo controlador llamado “RedisController”:

8

9

18

19


Insertar siguiente código:

RedisController:

using MyAPI.Demo.Models;
using StackExchange.Redis;
using Swashbuckle.Swagger.Annotations;
using System;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;

namespace MyAPI.Demo.Controllers
{
    public class RedisController : ApiController
    {
        private static string redisClusterConnection = "My StackExchange.Redis primary connection string";
        public static IDatabase redisCache = ConnectionMultiplexer.Connect(redisClusterConnection).GetDatabase();

        [SwaggerOperation("GetByKey")]
        [SwaggerResponse(HttpStatusCode.OK)]
        [SwaggerResponse(HttpStatusCode.NotFound)]
        public async Task Get(string key)
        {
            var result = string.Empty;
            try
            {
                result = await redisCache.StringGetAsync(key);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return Ok(result);
        }

        [SwaggerOperation("Create")]
        [SwaggerResponse(HttpStatusCode.Created)]
        public async Task Post([FromBody]CreateRequest request)
        {
            var result = false;
            try
            {
                result =  await redisCache.StringSetAsync(request.key, request.value);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return Ok(result);
        }
    }
}

       
 

CreateRequest model


namespace MyAPI.Demo.Models
{
    public class CreateRequest
    {
        public string key { get; set; }
        public string value { get; set; }
    }
}

Nota: se recomienda encriptar o asegurar la cadena de conexión dentro de un Web.config o Azure Key Vault

 

Probar API localmente conexión a cluster de Redis.

Para comprobar que el servidor de Redis se encuentra aislado en Azure, vamos a probar localmente la API, esperando un “Timeout” ya que no podremos establecer comunicación con el servidor.

Tipo de pruebas:

Postman:

Al activar el debug de Visual Studio veremos como la petición llega correctamente, pero al establecer la comunicación con Redis, obtenemos un Timeout.

30

22

23


Redis Desktop Manager

Para configurar la conexión con Redis, solo basta con introducir los datos de conexión que tenemos en Azure y luego activamos el protocolo SSL, ya que Azure solo acepta este protocolo de comunicación.

14

13

15


Publicar Web API en App Service Environment y probar conexión al cluster de Redis.

Para lograr alcanzar al servidor de Redis, es necesario que despleguemos nuestra aplicación a la misma VNET que Redis. De esta manera podremos alcanzar internamente al servidor y hacer peticiones sin ningún problema.

20

21

 

Pruebas:

Ingresamos la dirección del endpoint que nos expone ASE en Postman y creamos un registro, como resultado vamos a obtener un “true” ya que logramos insertar el dato en Redis.

Posteriormente vamos a consumir el servicio de consulta por llave para obtener el registro insertado:24

25

 

Con fines ilustrativos, vamos a lanzar otra petición pero con una llave que no existe, por ejemplo la llave número 2 y como resultado obtendremos un “null” al no encontrar la llave que buscamos.26

Vamos a crear y a volver a consultar la llave numero 2 para probar que nuestra API funciona correctamente:

27

28

Si ingresamos a Azure y vamos a nuestro recurso de cache, podremos ver que ya se registró actividad en el cluster:

31


Felicidades! haz logrado crear, configurar, conectar y aislar una aplicación Web API junto con su servidor de cache usando los servicios PaaS de Azure y ARM.

Si podrás notar, este tipo de estrategias también aplican para infraestructuras de IaaS, lo cual toma mas tiempo en configuración manual de las maquinas virtuales, pero  al final podemos aislar utilizando redes virtuales y grupos de seguridad de Azure.

 

Descargar código de GitHub:

https://github.com/Kodran/AppServiceEnvironment-ClusterRedis-Tutorial

 

Saludos!

Comments

Popular posts from this blog

Configurar y desplegar una Web API en Azure App Service Environment

Patrones de diseño para aplicaciones de alta disponibilidad en Azure - Resilient Applications (Parte I: Retry Policy)

Integrar Web API de .NET en proyecto de Xamarin.Forms utilizando Visual Studio y Azure API App

Conectar .NET Web API con Azure API Management

Publicar resultados de una consulta de Azure SQL Database a Azure Service Bus con Logic App