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.
Pre Requisitos
- Visual Studio, obtenerlo aquí.
- Tener una suscripción de Azure
- Si no tienes una, puedes obtener un free trial
- Configurar y desplegar una Web API en Azure App Service Environment
Arquitectura resultante:
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”.
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.
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.
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:
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”:
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:
- Probar con Postman Rest Client
- Probar conexión con Redis Desktop Manager.
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.
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.
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.
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:
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.
Vamos a crear y a volver a consultar la llave numero 2 para probar que nuestra API funciona correctamente:
Si ingresamos a Azure y vamos a nuestro recurso de cache, podremos ver que ya se registró actividad en el cluster:
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
Post a Comment