Azure Functions Proxies: para qué son y cómo usarlos

Cuando escribí el artículo de introducción a Azure Functions, el servicio serverless de Microsoft Azure, solamente traté el apartado de Functions, en el que puedes crear las funciones, pero dejé de lado Proxies y Slots. En este te quiero contar para qué son los proxies y cómo puedes usarlos.

Como su propio nombre indica, los proxies son pasarelas que se utilizan para controlar las peticiones que llegan a tu servicio de Azure Functions y poder tratarlas y redirigirlas si fuera necesario. El ejemplo más sencillo es el siguiente: Si recuerdas, en el post donde expliqué Azure Functions utilicé la plantilla por defecto, que lo que hacía era recibir un parámetro llamado name y lo contatenaba con ‘Hello ‘. Vamos a utilizar un proxy para modificar la petición a esta función de prueba.

Accede a tu servicio de Azure Functions y en el apartado Proxies haz clic en el símbolo + para agregar uno nuevo. Incluye los siguientes valores en él:

Crear proxy en Azure Functions
Crear proxy en Azure Functions

Por un lado, dale un nombre descriptivo al proxy en el apartado Name. Route template trata de la URL que vas a utilizar para llamar a la función que establezcas en el campo Backend URL. Puedes elegir todos o solo algunos métodos HTTP para que este proxy sea invocado. Por otro lado, en la parte inferior tienes la posibilidad de sobreescribir tanto la petición (antes de que llegue a la función) como la respuesta. Para este ejemplo se ha modificado la petición, incluyendo en el apartado Query el valor para el parámetro name, que en este caso es Gisela Torres.
Una vez pulsado el botón Create, podrás ver la URL a la que debes invocar, que será la URL de tu servicio + el valor del route template que elegiste. En este caso vamos a poner la misma forma de acceso que te da Azure Functions que es /api/nombre_del_trigger.

URL para utilizar el proxy
URL para utilizar el proxy

Si accedes a la URL del proxy desde el navegador podrás ver el resultado.

Probando el proxy de Azure Functions
Probando el proxy de Azure Functions

Como ves, cuando llamas al proxy, este te redirige a la función indicada en Backend URL y, además, es capaz de sobrescribir valores en la petición e incluso en la respuesta. Al final el asistente del portal se traduce en el archivo proxies.js

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "pass-name-parameter": {
            "matchCondition": {
                "route": "/api/HTTPHelloWorldTrigger"
            },
            "backendUri": "https://localhost/api/HTTPHelloWorldTrigger?code=SUg32W7jKWm74leFnUtAbEB5shseaiQIiSKHI/b/55gctr9NfWMV6A==",
            "requestOverrides": {
                "backend.request.querystring.name": "Gisela Torres"
            }
        }
    }
}

Por otro lado, date cuenta de que he utilizado como backend URL localhost, ya que la función está dentro del mismo servicio donde he creado el proxy, lo cual significa que también es posible llamar a otras funciones que estén creadas en otros servicios de Azure Functions.

Este ejemplo está muy bien para comprender cómo funciona esta característica, pero no es muy práctico, ya que el query string no puede ser modificado. Otro ejemplo sería cambiar la URL de llamada a nuestra función y, además, ser capaces de pasarle como parámetro el nombre que queremos que concatene. El archivo proxies.js quedaría de la siguiente manera:

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "pass-name-parameter": {
            "matchCondition": {
                "route": "/helloworld/{name}"
            },
            "backendUri": "https://localhost/api/HTTPHelloWorldTrigger?code=SUg32W7jKWm74leFnUtAbEB5shseaiQIiSKHI/b/55gctr9NfWMV6A==",
            "requestOverrides": {
                "backend.request.querystring.name": "{name}"
            }
        }
    }
}

Como ves, también es posible utilizar variables dentro de la definición del proxy para recuperar el nombre. Además, a partir de ahora para poder llamar a tu función deberás de utilizar /helloworld/{name} en lugar de /api/HTTPHelloWorldTrigger.

¡Saludos!