Plugin Serverless d'Apache APISIX pour les Event Hooks
February 15, 2023
Apache APISIX est une passerelle API open-source et haute performance, construite sur Nginx. L'une de ses fonctionnalités puissantes est la capacité à créer des fonctions serverless, qui sont de petits programmes sans état pouvant étendre les fonctionnalités d'Apache APISIX. Dans cet article, nous aborderons les bases du plugin serverless d'Apache APISIX et comment il peut être utilisé pour déclencher des fonctions serverless en réponse à des événements.
Objectifs d'apprentissage
Vous apprendrez les points suivants tout au long de l'article :
- Qu'est-ce que le plugin serverless d'Apache APISIX ?
- Comment fonctionne le plugin serverless et comment l'utiliser ?
- Cas d'utilisation du plugin serverless.
- Comment utiliser le plugin serverless pour intégrer un webhook.
Qu'est-ce que le plugin serverless d'Apache APISIX ?
Le plugin serverless d'Apache APISIX pour les hooks d'événements vous permet d'écrire des fonctions serverless et de les intégrer à la passerelle API. Le plugin offre une manière simple et flexible d'exécuter du code personnalisé en réponse à des événements, sans avoir à gérer l'infrastructure sous-jacente.
Le plugin serverless sépare la logique de gestion des événements en fonctions serverless distinctes, ce qui vous permet de simplifier votre architecture API et de la rendre plus facile à gérer. Apache APISIX prend en charge les frameworks serverless des principaux fournisseurs de cloud tels que Azure Functions et AWS Lambda.
Comment utiliser le plugin serverless ?
Pour utiliser le plugin serverless d'Apache APISIX pour les hooks d'événements, vous devrez écrire un code de fonction serverless en Lua qui implémente la logique que vous souhaitez exécuter en réponse à un événement, puis activer le plugin serverless-pre-function
ou serverless-post-function
en fonction des phases du cycle requête-réponse de votre choix.
Actuellement, APISIX ne prend en charge que Lua pour écrire un code de fonction. Si vous préférez d'autres langages de programmation, vous pouvez toujours utiliser des plugin runners pour créer un nouveau plugin personnalisé à partir de zéro.
Cas d'utilisation du plugin serverless
Voici quelques cas d'utilisation du plugin serverless d'Apache APISIX pour les hooks d'événements :
-
Routage dynamique : Le plugin serverless peut être utilisé pour router dynamiquement les requêtes API entrantes en fonction de critères spécifiques, tels que la méthode de requête, le chemin de l'URL ou les valeurs des en-têtes. Cela vous permet de mettre en œuvre facilement des scénarios de routage complexes sans avoir à modifier la configuration sous-jacente d'Apache APISIX.
-
Authentification et autorisation : Vous pouvez utiliser le plugin serverless pour implémenter des vérifications d'authentification et d'autorisation pour votre API. Par exemple, vous pouvez écrire une fonction serverless qui vérifie la présence d'une clé API valide dans les en-têtes de la requête avant de permettre à la requête de continuer. Ou elle peut être utilisée comme un service d'autorisation externe en combinaison avec le plugin forward-auth.
-
Transformation de requête : Le plugin serverless peut être utilisé pour transformer les requêtes API entrantes avant qu'elles ne soient traitées par le service backend. Par exemple, vous pouvez écrire une fonction serverless qui modifie les en-têtes ou le corps de la requête pour correspondre au format attendu par le service backend.
-
Transformation de réponse : Vous pouvez également utiliser le plugin serverless pour transformer la réponse du service backend avant qu'elle ne soit renvoyée au client. Par exemple, vous pouvez écrire une fonction serverless qui modifie les en-têtes ou le corps de la réponse pour correspondre au format attendu par le client.
-
Journalisation et surveillance : Vous pouvez utiliser le plugin serverless pour implémenter la journalisation et la surveillance de votre API. Par exemple, vous pouvez écrire une fonction serverless qui enregistre des informations détaillées sur chaque requête API, telles que la méthode de requête, l'URL, les en-têtes et le corps, pour une analyse ultérieure.
Intégration d'Apache APISIX avec des webhooks (Démo)
Pour intégrer Apache APISIX avec des webhooks, vous devez créer une fonction serverless qui écoute les requêtes POST entrantes sur l'URL de l'endpoint, vérifie si la méthode de requête est POST, et envoie une notification de webhook au service tiers chaque fois qu'un nouveau message est posté.
La fonction serverless doit également renvoyer la réponse du webhook, afin que vous puissiez voir l'état du webhook et tout message d'erreur si quelque chose ne fonctionne pas. Dans les deux cas, APISIX peut communiquer avec le service cible, en informant la cible qu'un événement a été déclenché en appelant une URL fournie avec des informations sur cet événement.
Prérequis
- Docker installé sur votre machine pour exécuter APISIX.
- Connaissance de base de quelques concepts clés d'APISIX tels que Route, Upstream et Plugin.
Configuration du projet
La première chose à faire est de cloner le projet apisix-docker depuis GitHub :
git clone https://github.com/apache/apisix-docker.git
Ouvrez le dossier du projet dans votre éditeur de code préféré. Ce tutoriel utilise VS Code.
Installation et exécution d'Apache APISIX
Pour exécuter Apache APISIX, vous pouvez suivre ces étapes :
Ouvrez une nouvelle fenêtre de terminal et exécutez la commande docker compose up
depuis le dossier racine du projet :
docker compose up -d
La commande ci-dessus exécutera Apache APISIX et etcd ensemble avec Docker.
Nous avons installé APISIX en utilisant Docker dans cette démo. Cependant, il existe d'autres options pour l'installer dans le guide d'installation.
Configuration de la fonction serverless dans Apache APISIX
Pour configurer la fonction serverless dans Apache APISIX, vous devez créer une nouvelle route pour l'endpoint et configurer le plugin serverless avec notre code de fonction personnalisé en Lua.
Voici un exemple de fonction serverless en Lua qui écoute les requêtes POST entrantes sur l'endpoint et envoie une notification de webhook :
function webhook(conf, ctx)
-- Import des bibliothèques nécessaires
local http = require("resty.http")
local core = require("apisix.core")
-- Envoyer la notification de webhook uniquement si la méthode de requête est POST, sinon ignorer et envoyer à l'upstream comme d'habitude
if core.request.get_method() == "POST" then
-- Envoyer la notification de webhook à l'URL spécifiée
local httpc = http.new()
local res, err = httpc:request_uri("http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d", {
method = "POST",
headers = {
["Content-Type"] = "application/json"
},
body = core.request.get_body(),
})
-- Vérifier la réponse du webhook
if not res then
core.log.error("Échec de l'envoi du webhook : ", err)
return 500, err
end
end
-- Renvoyer la réponse du service upstream
return conf.status, conf.body
end
Comme vous pouvez le voir dans l'exemple de code de fonction webhook ci-dessus, il effectue des requêtes POST JSON à une URL fournie avec le corps de la requête (le corps de la requête du client à la passerelle API) comme payload. Le site de test de webhooks est utilisé pour simuler notre endpoint de webhook : https://webhook.site.
Pour créer et configurer votre endpoint de webhook :
- Générez une URL en naviguant vers https://webhook.site dans votre navigateur web.
- Sélectionnez Copier dans le presse-papiers à côté de Votre URL unique.
- Collez-la dans la méthode request_uri de la requête HTTP dans le code de fonction.
De plus, toutes les autres requêtes, y compris POST, seront transmises au service upstream. Dans l'étape suivante, nous configurons une route et un upstream.
Configuration d'une Route et d'un Upstream
Nous allons maintenant créer une nouvelle route avec le plugin de fonction serverless activé et un upstream qui agit comme notre service backend.
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-H 'Content-Type: application/json' \
-d '{
"uri": "/post",
"plugins": {
"serverless-pre-function": {
"phase": "rewrite",
"functions" : ["
return function(conf, ctx)
-- Import des bibliothèques nécessaires
local http = require(\"resty.http\")
local core = require(\"apisix.core\")
-- Envoyer la notification de webhook uniquement si la méthode de requête est POST, sinon ignorer et envoyer à l'upstream comme d'habitude
if core.request.get_method() == \"POST\" then
-- Envoyer la notification de webhook à l'URL spécifiée
local httpc = http.new()
local res, err = httpc:request_uri(\"http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d\", {
method = \"POST\",
headers = {
[\"Content-Type\"] = \"application/json\"
},
body = core.request.get_body(),
})
-- Vérifier la réponse du webhook
if not res then
core.log.error(\"Échec de l'envoi du webhook : \", err)
return 500, err
end
end
-- Renvoyer la réponse du service upstream
return conf.status, conf.body
end"]
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
Dans l'exemple de configuration de route précédent, nous avons créé notre première route en envoyant une requête curl
à l'API Admin d'APISIX. Dans le corps de la requête de route, nous avons spécifié que toute requête vers le chemin /post
déclenchera le code de fonction serverless et sera transmise plus tard à la cible httpbin.org
. Cela signifie que la requête sera routée vers l'endpoint httpbin.org/post
après avoir vérifié si la méthode de requête est POST et si l'événement doit être envoyé à l'endpoint de webhook du service tiers ou non. Le service backend peut être remplacé par votre propre service backend.
Vous remarquerez également que nous avons ajouté le code de fonction dans les propriétés functions
de serverless-pre-function
dans l'objet Json.
Tester la configuration
Enfin, nous testons en appelant l'endpoint /post
de la passerelle API pour vérifier si tout fonctionne comme prévu et si l'événement POST sera envoyé au site de webhook.
curl -i http://127.0.0.1:9080/post -X POST -d \
'{
"message": "A new webhook message"
}'
Ensuite, naviguez vers l'URL de webhook depuis la page https://webhook.site que vous avez générée dans les étapes précédentes. Vous devriez voir une requête POST, notifiant notre endpoint de webhook de l'événement et envoyant le corps de la requête.
En plus de cela, nous obtenons la réponse du service mock upstream httpbin.org
:
HTTP/1.1 200 OK
Content-Type: application/json
{
...
"form": {
"{\n \"message\": \"A new webhook message\"\n}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "127.0.0.1",
"X-Forwarded-Host": "127.0.0.1"
},
"json": null,
"url": "http://127.0.0.1/post"
}
Évidemment, si vous envoyez d'autres méthodes de requêtes HTTP en dehors de POST, le code de fonction serverless ne déclenchera pas l'endpoint de webhook.
Ceci est un exemple de base de configuration d'une fonction serverless dans Apache APISIX. Vous pouvez étendre cette fonctionnalité en ajoutant une logique plus complexe à votre fonction serverless, comme déclencher une autre fonction en réponse à des webhooks.
Conclusion
Le plugin serverless d'Apache APISIX pour les hooks d'événements offre une manière flexible et évolutive de déclencher des fonctions serverless en réponse à des événements survenant lors du traitement des requêtes API. En utilisant ce plugin, vous pouvez simplifier votre architecture API, améliorer les performances et la fiabilité de vos services, et réduire les coûts de gestion de votre infrastructure d'application.
Ressources connexes
Contenu recommandé
Communauté
🙋 Rejoignez la communauté Apache APISIX 🐦 Suivez-nous sur Twitter 📝 Retrouvez-nous sur Slack