Intégration d'Apache APISIX avec Azure Serverless

API7.ai

December 1, 2021

Ecosystem

Intégration d'Apache APISIX avec Azure Serverless

Apache APISIX offre un support pour les frameworks serverless des principaux fournisseurs de cloud (d'autres sont en cours d'ajout). Au lieu de coder en dur l'URL de la fonction dans l'application, Apache APISIX suggère de définir une route avec le plugin serverless activé. Cela offre aux développeurs la flexibilité de mettre à jour à chaud l'URI de la fonction ainsi que de changer complètement le fournisseur de faas pour un autre fournisseur cloud sans aucun problème. De plus, cette approche atténue les préoccupations d'autorisation et d'authentification de la logique de l'application, car Apache APISIX dispose d'un support d'authentification très robuste qui peut être utilisé pour identifier et autoriser les consommateurs clients à accéder à la route spécifique avec le faas. Cet article parle de l'ajout récent d'un nouveau plugin azure-functions, et donne des instructions détaillées sur la manière d'intégrer Azure Functions, une solution serverless largement utilisée, dans la suite serverless d'Apache APISIX.

Fonctionnement du plugin azure-functions

Le plugin azure-functions permet aux utilisateurs de définir un upstream vers la fonction serverless HTTP Trigger d'Azure pour une URI de passerelle. S'il est activé, ce plugin interrompt la requête en cours vers cette URI spécifique et initie une nouvelle requête vers le faas Azure (le nouvel upstream) au nom du client avec les détails d'autorisation appropriés définis par les utilisateurs, les en-têtes de la requête, le corps de la requête, les paramètres (ces trois composants sont transmis depuis la requête originale) et renvoie le corps de la réponse, le code d'état et les en-têtes au client original qui a invoqué la requête vers l'agent Apache APISIX.

Le plugin prend en charge l'autorisation au service faas Azure via des clés API et Azure Active Directory.

Comment utiliser Azure Functions avec Apache APISIX

L'objectif principal du plugin est de rediriger la route de la passerelle spécifiée dans la configuration de la route vers l'URI des fonctions Azure. Cette section vous donne un guide pratique sur la manière de configurer et de créer un déclencheur HTTP serverless sur le cloud Azure.

  1. Tout d'abord, inscrivez-vous/connectez-vous à Microsoft Azure et configurez un plan d'essai. Azure Functions sont gratuits à vie jusqu'à 1 million d'invocations. Pour en savoir plus sur les tarifs, visitez ici.

  2. Visitez le Portail Azure (à noter, les services Azure peuvent être accessibles via le portail web, CLI & VSCode. pour la convivialité, nous utilisons le web).

    1. Tout d'abord, créez un groupe de ressources pour partitionner logiquement votre faas que vous allez créer. créer un groupe de ressources
    2. Créez une application de fonction avec l'URL de votre choix (je vais choisir test-apisix). créer une application de fonction
  3. Installez l'extension Azure Functions dans l'éditeur VSCode. Après l'installation, authentifiez-vous via l'extension et installez l'outil de base des fonctions Azure pour le développement local avec :

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
    
  4. Déployez l'extrait suivant dans la même application de fonction que nous venons de créer via le panneau de l'extension Azure Functions dans 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,
      };
    };
    

Cet extrait prend le nom des paramètres de requête (s'il est présent, sinon du corps de la requête) et salue l'utilisateur.

Activer le plugin azure-functions

Voici un exemple de la manière d'activer le plugin azure-functions pour une route spécifique. Nous supposons que votre déclencheur HTTP est déployé et prêt à être servi.

# activer le plugin pour une route spécifique
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": "<Clé API générée pour accéder à la fonction Azure>"
            }
        }
    },
    "uri": "/azure"
}'

Maintenant, toute requête (HTTP/1.1, HTTPS, HTTP2) vers l'URI /azure sur la passerelle Apache APISIX déclenchera une invocation HTTP vers l'URI de fonction mentionnée ci-dessus et le corps de la réponse ainsi que les en-têtes de réponse et le code de réponse seront redirigés vers le client. Par exemple (ici la fonction cloud Azure prend simplement le paramètre de requête name et renvoie 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

En considérant qu'Apache APISIX fonctionne également avec enable_http2: true sur config-default.yaml pour le port 9081 (par exemple), toute communication HTTP/2 entre le client et l'agent APISIX sera redirigée vers le faas Azure de la même manière que HTTP/1.1 et les réponses seront redirigées vers le client avec les en-têtes appropriés. Par exemple :

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

Désactiver le plugin azure-functions

Maintenant, pour désactiver le plugin, il suffit de supprimer la configuration JSON correspondante dans la configuration du plugin pour désactiver le plugin azure-functions et ajouter la configuration d'upstream appropriée. Les plugins Apache APISIX sont rechargés à chaud, il n'est donc pas nécessaire de redémarrer 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
        }
    }
}'

Configuration personnalisée

Dans une configuration minimale lors de la création d'une nouvelle route avec le plugin azure-functions activé, function_uri est l'attribut obligatoire de la configuration du plugin qui pointe vers l'URL de la fonction. Il existe de nombreuses options supplémentaires qui peuvent être ajustées avec le schéma du plugin et le schéma de métadonnées.

Schéma du plugin

NomTypeRequisPar défautValideDescription
function_uristringrequisn/an/aL'endpoint de la fonction Azure qui déclenche le code de la fonction serverless (par exemple http://test-apisix.azurewebsites.net/api/HttpTrigger).
authorizationobjectoptionneln/an/aLes informations d'identification d'autorisation pour accéder à la fonction cloud.
authorization.apikeystringoptionneln/an/aChamp à l'intérieur de l'autorisation. La clé API générée pour autoriser les requêtes vers cet endpoint.
authorization.clientidstringoptionneln/an/aChamp à l'intérieur de l'autorisation. L'ID client (Azure Active Directory) pour autoriser les requêtes vers cet endpoint.
timeoutintegeroptionnel3000[100,...]Délai d'expiration de la requête proxy en millisecondes.
ssl_verifybooleanoptionneltruetrue/falseSi activé, effectue la vérification SSL du serveur.
keepalivebooleanoptionneltruetrue/falsePour réutiliser la même connexion proxy dans un avenir proche. Définissez sur false pour désactiver les keepalives et fermer immédiatement la connexion.
keepalive_poolintegeroptionnel5[1,...]Le nombre maximal de connexions dans le pool.
keepalive_timeoutintegeroptionnel60000[1000,...]Le délai d'expiration maximal d'inactivité (ms).

Cela offre une grande flexibilité pour lier étroitement le comportement du faas Azure - de la configuration du délai d'expiration au pool de keepalive et à la validation du certificat SSL du faas serverless. Pour être honnête, cela signifie beaucoup lorsqu'il s'agit de serverless, car les services sont pilotés par des événements et les ressources sont allouées par le fournisseur de cloud à la volée.

Schéma de métadonnées

De même, il existe quelques attributs qui peuvent être ajustés en utilisant les métadonnées.

NomTypeRequisPar défautValideDescription
master_apikeystringoptionnel""n/aLa clé API secrète qui pourrait être utilisée pour accéder à l'URI de la fonction Azure.
master_clientidstringoptionnel""n/aL'ID client (Active Directory) qui pourrait être utilisé pour autoriser l'URI de la fonction.

Les métadonnées pour le plugin azure-functions fournissent la fonctionnalité de secours d'autorisation. Elles définissent master_apikey et master_clientid (ID client Azure Active Directory) où les utilisateurs peuvent (optionnellement) définir la clé API principale ou l'ID client pour le déploiement d'applications critiques. Ainsi, si aucun détail d'autorisation n'est trouvé dans l'attribut du plugin, les détails d'autorisation présents dans les métadonnées prennent le relais.

L'ordre de priorité relatif est le suivant :

  • Tout d'abord, le plugin recherche les clés x-functions-key ou x-functions-clientid dans l'en-tête de la requête vers l'agent Apache APISIX.
  • Si elles ne sont pas trouvées, le plugin azure-functions vérifie les détails d'autorisation dans les attributs du plugin. S'ils sont présents, il ajoute l'en-tête respectif à la requête envoyée à la fonction cloud Azure.
  • Si aucun détail d'autorisation n'est trouvé dans les attributs du plugin, Apache APISIX récupère la configuration des métadonnées pour ce plugin et utilise les clés principales.

Pour ajouter une nouvelle clé API principale, faites une requête au endpoint /apisix/admin/plugin_metadata avec les métadonnées mises à jour comme suit :

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "master_apikey" : "<Votre clé d'accès principale Azure>"
}'

Résumé

Le plugin azure-functions est le deuxième plugin d'Apache APISIX conçu pour le serverless. Nous développons d'autres plugins serverless et les présenterons avec les prochaines versions d'Apache APISIX. Si vous êtes intéressé, n'hésitez pas à créer un problème pour partager vos opinions. Vous pouvez également discuter de vos propositions de développement d'un nouveau plugin dans notre liste de diffusion !

Tags: