Cuando desarrollamos APIs serverless en Azure, podemos tener la necesidad de controlar las llamadas que recibimos, por ejemplo, para exponer una arquitectura de microservicios en múltiples aplicaciones de funciones mediante un único punto de entrada para los clientes. Aunque Azure Api Management nos provee de una plataforma muy completa para la gestión de APIs, tenemos a nuestra disposición los proxies, una opción out of the box del servicio de Azure Functions, más limitada pero que, por su mayor simplicidad, puede ser muy interesante en algunos escenarios.
Los proxies básicamente son una fachada por encima de nuestras funciones, generando un conjunto de endpoints HTTP adicionales a los de nuestro API. Actualmente están disponibles en las versiones 1.x a 3.x de Azure Functions.
¿Qué podemos hacer con ellos? Algunos posibles casos de uso serían:
Creamos una aplicación de funciones en .NET 3.1. Una vez implementado el recurso, generamos una función HTTP sobre la plantilla estándar de una función HTTP para desarrollar en el portal.
Dentro de la función, en la sección Integration del menú lateral izquierdo, pulsamos en el esquema sobre el trigger. Ésto nos habilita un panel lateral en el que vamos a hacer alguna modificación. Nuestro endpoint va a responder a las peticiones GET en la ruta v1/hello.
Esta plantilla devuelve un texto saludando al nombre que se pase por query string.
Vamos a crear nuestro primer proxy, que se va a encargar de redirigir las peticiones que lleguen sin indicar la versión en la URL a la v1 por defecto. Para ello, en el menú principal de la aplicación de función, en la sección Functions entramos en Proxies y creamos uno con los siguientes datos.
Esta configuración indica que cualquier GET a api/hello será redireccionado a api/v1/hello, que es donde responde nuestra función.
En el editor de app service podremos ver que se ha generado un fichero llamado proxies.json con la estructura de nuestros proxies.
Si realizamos una petición a la dirección URL del proxy (se puede obtener haciendo clic sobre el mismo) vemos que redirige correctamente a nuestro endpoint.
Ahora vamos a realizar un mock del API. Supongamos que estamos desarrollando una versión 2 del API y queremos devolver datos al cliente mientras finalizamos el desarrollo.
Para ello, vamos a sobrescribir tanto la entrada como la salida del endpoint. Fijamos el valor del query string y devolvemos un JSON, modificando cabeceras como el content-type. Además, vamos a leer de la configuración de la función una clave, en este caso, un GUID que hemos generado simulando un API Key y la devolvemos en otra cabecera.
Realizamos la petición al nuevo proxy y observamos como, independientemente del nombre que proporcionemos, la respuesta es la que hemos fijado en el proxy así como las cabeceras que indicamos.
Por último, vamos a crear otro proxy para que responda a las peticiones realizadas a v1/hello/{name}. El proxy recogerá el nombre de la ruta y lo mapeará al query string para que nuestro endpoint funcione correctamente.
En nuestra solución, donde tenemos alojado el código fuente de nuestra aplicación de funciones, podemos crear el fichero proxies.json con el esquema correspondiente, disponiendo, además, de intellisense para mayor comodidad en su implementación. Para poder desarrollar localmente es importante indicar en las propiedades del fichero que se debe copiar al directorio de salida.
Si deseamos desplegar estas funciones en Azure, ya sea mediante Azure Devops, Github Actions o un perfil de publicación de Visual Studio, el fichero generaría los proxies automáticamente en nuestra aplicación de función en Azure.
A continuación, adjunto el repositorio de Github con el código del ejemplo propuesto.
Azure Functions Proxies nos proporciona una herramienta simple y útil para poder controlar y gestionar las peticiones que recibe nuestra API en Azure Functions.
Saludos y Happy Coding!
Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continuas navegando, estás dando tu consentimiento para aceptar las cookies y también nuestra política de cookies (esperemos que no te empaches con tanta cookie 😊)