Integración de Apache APISIX con Azure Serverless

API7.ai

December 1, 2021

Ecosystem

Integración de Apache APISIX con Azure Serverless

Apache APISIX ofrece soporte para frameworks serverless de proveedores de nube populares (y más en camino). En lugar de codificar manualmente la URL de la función en la aplicación, Apache APISIX sugiere definir una ruta con el plugin serverless habilitado. Esto brinda a los desarrolladores la flexibilidad de actualizar dinámicamente la URI de la función, así como cambiar completamente el proveedor de FaaS a otro proveedor de nube sin complicaciones. Además, este enfoque mitiga las preocupaciones de autorización y autenticación de la lógica de la aplicación, ya que Apache APISIX tiene un soporte de autenticación muy sólido que puede usarse para identificar y autorizar a los consumidores del cliente para acceder a la ruta específica con el FaaS. Este artículo habla sobre la reciente adición de un nuevo plugin azure-functions y proporciona instrucciones detalladas sobre cómo integrar Azure Functions, una solución serverless ampliamente utilizada, en la suite serverless de Apache APISIX.

Cómo funciona el plugin azure-functions

El plugin azure-functions permite a los usuarios definir un upstream para la función serverless HTTP Trigger de Azure en una URI de puerta de enlace. Si está habilitado, este plugin termina la solicitud en curso a esa URI específica e inicia una nueva solicitud al FaaS de Azure (el nuevo upstream) en nombre del cliente, con los detalles de autorización adecuados establecidos por los usuarios, los encabezados de la solicitud, el cuerpo de la solicitud y los parámetros (estos tres componentes se pasan desde la solicitud original). Luego, devuelve el cuerpo de la respuesta, el código de estado y los encabezados al cliente original que invocó la solicitud al agente de Apache APISIX.

El plugin admite la autorización al servicio FaaS de Azure mediante claves de API y Azure Active Directory.

Cómo usar Azure Functions con Apache APISIX

El objetivo principal del plugin es redirigir la ruta de la puerta de enlace especificada en la configuración de la ruta a la URI de Azure Functions. Esta sección te brinda una guía práctica sobre cómo configurar y crear un HTTP Trigger serverless en la nube de Azure.

  1. Primero, regístrate/inicia sesión en Microsoft Azure y configura un plan de prueba. Azure Functions son gratuitos para siempre hasta 1 millón de invocaciones. Para obtener más información sobre los precios, visita aquí.

  2. Visita el Portal de Azure (por cierto, los servicios de Azure se pueden acceder a través del portal web, CLI y VSCode. Para mayor facilidad, estamos usando el portal web).

    1. Primero, crea un grupo de recursos para particionar lógicamente el FaaS que vas a crear. crear un grupo de recursos
    2. Crea una aplicación de funciones con la URL de tu elección (voy a elegir test-apisix). crear una aplicación de funciones
  3. Instala la extensión de Azure Functions en el editor VSCode. Después de la instalación, autentícate a través de la extensión e instala la herramienta principal de Azure Functions para desarrollo local con:

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
    
  4. Implementa el siguiente fragmento en la misma aplicación de funciones que acabamos de crear a través del panel de la extensión de Azure Functions en VSCode:

    module.exports = async function (context, req) {
      context.log("HTTP trigger invoked on Test-APISIX.");
    
      const name = req.query.name || (req.body && req.body.name);
      const responseMessage = name
        ? "Hello, " + name
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response.";
    
      context.res = {
        // status: 200, /* Defaults to 200 */
        body: responseMessage,
      };
    };
    

Este fragmento toma el nombre de los parámetros de consulta (si está presente, de lo contrario, del cuerpo de la solicitud) y saluda al usuario.

Activar el plugin azure-functions

El siguiente es un ejemplo de cómo habilitar el plugin azure-functions para una ruta específica. Suponemos que tu HTTP Trigger está implementado y listo para ser servido.

# habilitar el plugin para una ruta específica
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "azure-functions": {
            "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",
            "authorization": {
                "apikey": "<Clave API generada para acceder a la función de Azure>"
            }
        }
    },
    "uri": "/azure"
}'

Ahora, cualquier solicitud (HTTP/1.1, HTTPS, HTTP2) a la URI /azure en la puerta de enlace de Apache APISIX activará una invocación HTTP a la URI de la función mencionada anteriormente, y el cuerpo de la respuesta junto con los encabezados y el código de respuesta se redirigirán de vuelta al cliente. Por ejemplo (aquí la función en la nube de Azure simplemente toma el parámetro de consulta name y devuelve Hello $name):

curl -i -XGET http://localhost:9080/azure\?name=Bisakh
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:55 GMT
Server: APISIX/2.10.2

Hello, Bisakh

Considerando que Apache APISIX también se ejecuta con enable_http2: true en config-default.yaml para el puerto 9081 (por ejemplo), cualquier comunicación HTTP/2 entre el cliente y el agente de APISIX se redirigirá al FaaS de Azure de manera similar a HTTP/1.1, y las respuestas se redirigirán de vuelta al cliente con los encabezados adecuados. Por ejemplo:

curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
HTTP/2 200
content-type: text/plain; charset=utf-8
request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:56 GMT
server: APISIX/2.10.2

Hello, Bisakh

Desactivar el plugin azure-functions

Ahora, para deshabilitar el plugin, simplemente elimina la configuración JSON correspondiente en la configuración del plugin para deshabilitar el plugin azure-functions y agrega la configuración de upstream adecuada. Los plugins de Apache APISIX se recargan en caliente, por lo que no es necesario reiniciar Apache APISIX.

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/azure",
    "plugins": {},
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    }
}'

Configuración personalizada

En una configuración mínima al crear una nueva ruta con el plugin azure-functions habilitado, function_uri es el atributo obligatorio de la configuración del plugin que apunta a la URL de la función. Hay muchas opciones adicionales que se pueden ajustar con el esquema del plugin y el esquema de metadatos.

Esquema del plugin

NombreTipoRequeridoPredeterminadoVálidoDescripción
function_uristringrequeridon/an/aEl endpoint de la función de Azure que activa el código de la función serverless (por ejemplo, http://test-apisix.azurewebsites.net/api/HttpTrigger).
authorizationobjectopcionaln/an/aCredenciales de autorización para acceder a la función en la nube.
authorization.apikeystringopcionaln/an/aCampo dentro de authorization. La clave API generada para autorizar solicitudes a ese endpoint.
authorization.clientidstringopcionaln/an/aCampo dentro de authorization. El ID de cliente (Azure Active Directory) para autorizar solicitudes a ese endpoint.
timeoutintegeropcional3000[100,...]Tiempo de espera de la solicitud de proxy en milisegundos.
ssl_verifybooleanopcionaltruetrue/falseSi está habilitado, realiza la verificación SSL del servidor.
keepalivebooleanopcionaltruetrue/falsePara reutilizar la misma conexión de proxy en un futuro cercano. Establece en false para deshabilitar keepalives y cerrar la conexión inmediatamente.
keepalive_poolintegeropcional5[1,...]El número máximo de conexiones en el grupo.
keepalive_timeoutintegeropcional60000[1000,...]El tiempo de espera máximo de inactividad (ms).

Esto brinda una gran flexibilidad para ajustar el comportamiento del FaaS de Azure, desde configurar el tiempo de espera hasta el grupo de keepalive y validar el certificado SSL del FaaS serverless. Honestamente, esto significa mucho cuando se trata de serverless, ya que los servicios son impulsados por eventos y los recursos se asignan dinámicamente por el proveedor de la nube.

Esquema de metadatos

De manera similar, hay algunos atributos que se pueden ajustar utilizando los metadatos.

NombreTipoRequeridoPredeterminadoVálidoDescripción
master_apikeystringopcional""n/aLa clave API maestra que se puede usar para acceder a la URI de la función de Azure.
master_clientidstringopcional""n/aEl ID de cliente (Active Directory) que se puede usar para autorizar la URI de la función.

Los metadatos para el plugin azure-functions proporcionan la funcionalidad de respaldo de autorización. Define master_apikey y master_clientid (ID de cliente de Azure Active Directory) donde los usuarios (opcionalmente) pueden definir la clave API maestra o el ID de cliente para implementaciones de aplicaciones críticas. Por lo tanto, si no se encuentran detalles de autorización dentro del atributo del plugin, los detalles de autorización presentes en los metadatos entran en acción.

El orden de prioridad relativo es el siguiente:

  • Primero, el plugin busca las claves x-functions-key o x-functions-clientid dentro del encabezado de la solicitud al agente de Apache APISIX.
  • Si no se encuentran, el plugin azure-functions verifica los detalles de autorización dentro de los atributos del plugin. Si están presentes, agrega el encabezado respectivo a la solicitud enviada a la función en la nube de Azure.
  • Si no se encuentran detalles de autorización dentro de los atributos del plugin, Apache APISIX obtiene la configuración de metadatos para este plugin y usa las claves maestras.

Para agregar una nueva clave API maestra, realiza una solicitud al endpoint /apisix/admin/plugin_metadata con los metadatos actualizados de la siguiente manera:

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "master_apikey" : "<Tu clave de acceso maestra de Azure>"
}'

Resumen

El plugin azure-functions es el segundo plugin de Apache APISIX diseñado para serverless. Estamos desarrollando otros plugins serverless y los presentaremos en las próximas versiones de Apache APISIX. Si estás interesado, no dudes en crear un issue para compartir tus opiniones. También puedes hablar sobre tus propuestas para desarrollar un nuevo plugin en nuestra lista de correo.

Tags: