Gérer des APIs serverless avec Apache APISIX

Bobur Umurzokov

Bobur Umurzokov

January 18, 2023

Technology

Le calcul sans serveur permet aux développeurs de construire des applications plus rapidement en éliminant la nécessité de gérer l'infrastructure. Avec les API sans serveur dans le cloud, le fournisseur de services cloud provisionne, met à l'échelle et gère automatiquement l'infrastructure nécessaire pour exécuter le code. Dans cet article, vous apprendrez comment intégrer Apache APISIX API Gateway avec Azure Functions pour gérer des API sans serveur basées sur Java.

Objectifs d'apprentissage

Vous apprendrez les éléments suivants tout au long de l'article :

  • Que sont les API sans serveur ?
  • Le rôle de la passerelle API dans la gestion du trafic complexe des API sans serveur.
  • Comment configurer Apache APISIX Gateway.
  • Comment construire des API sans serveur avec Azure Functions.
  • Comment exposer des API sans serveur en tant que services en amont.
  • Comment sécuriser les API sans serveur avec les plugins d'authentification d'APISIX.
  • Comment appliquer des politiques de limitation de débit.

Apache APISIX propose des plugins supplémentaires qui peuvent être utilisés avec d'autres solutions sans serveur comme AWS Lambda.

Avant de commencer la partie pratique du tutoriel, passons en revue quelques concepts.

Que sont les API sans serveur ?

Les API sans serveur sont les mêmes que les API traditionnelles, sauf qu'elles utilisent un backend sans serveur. Pour les entreprises et les développeurs, le calcul sans serveur signifie qu'ils n'ont plus à se soucier de la maintenance des serveurs ou de la mise à l'échelle des ressources serveur pour répondre aux demandes des utilisateurs. De plus, les API sans serveur évitent le problème de la mise à l'échelle car elles créent des ressources serveur à chaque fois qu'une demande est faite. Les API sans serveur réduisent la latence car elles sont hébergées sur un serveur d'origine. Enfin et surtout, le calcul sans serveur est bien plus économique que l'alternative traditionnelle, comme la construction de microservices.

API sans serveur utilisant Azure Functions

Une Azure Function est un moyen simple d'exécuter de petits morceaux de code dans le cloud. Vous n'avez pas à vous soucier de l'infrastructure nécessaire pour héberger ce code. Vous pouvez écrire la fonction en C#, Java, JavaScript, PowerShell, Python, ou dans l'un des langages listés dans les langages supportés.

Avec Azure Functions, vous pouvez rapidement construire des API HTTP pour vos applications web sans les tracas des frameworks web. Azure Functions est sans serveur, donc vous n'êtes facturé que lorsqu'un point de terminaison HTTP est appelé. Lorsque les points de terminaison ne sont pas utilisés, vous n'êtes pas facturé. Ces deux éléments combinés font des plateformes sans serveur comme Azure Functions un choix idéal pour les API où vous rencontrez des pics de trafic inattendus.

Passerelle API pour la gestion du trafic des API sans serveur

Une passerelle API est une partie fondamentale des API sans serveur car elle est responsable de la connexion entre une API définie et la fonction qui gère les demandes à cette API. Il y a de nombreux avantages à utiliser une passerelle API dans l'architecture des API basées sur le sans serveur. En plus des fonctionnalités principales de la passerelle API telles que l'authentification, la limitation de débit, l'observabilité, la mise en cache, etc., elle est capable d'invoquer des API sans serveur, de s'abonner à des événements, puis de les traiter en utilisant des rappels et de transmettre les demandes d'authentification à des services d'autorisation externes avec une logique de fonction sans serveur entièrement personnalisée.

Gérer les API sans serveur avec une démo d'Apache APISIX

Avec suffisamment de connaissances théoriques en tête, nous pouvons maintenant passer à une session pratique. Nous utilisons un exemple de projet apisix-manage-serverless-apis hébergé sur GitHub. Vous pouvez trouver le code source et les exemples de commandes curl que nous utilisons dans ce tutoriel.

Pour notre mini-projet, nous travaillerons avec deux fonctions Azure simples écrites en Java qui simulent nos API sans serveur pour les services Produit et Avis.

Prérequis

Configurer le projet

La première chose à faire est de cloner le projet depuis GitHub :

git clone https://github.com/Boburmirzo/apisix-manage-serverless-apis.git

Ouvrez le dossier du projet dans votre éditeur de code préféré. Le tutoriel utilise VS Code.

Exécuter Apache APISIX

Pour exécuter Apache APISIX et Azure Functions localement, 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. Par exemple, si Docker Desktop est installé sur votre machine, vous pouvez voir les conteneurs en cours d'exécution :

Apisix est en cours d'exécution sur Docker

Nous avons installé APISIX dans notre environnement local dans cette démo, mais vous pouvez également le déployer sur Azure et l'exécuter sur Azure Container Instance. Voir le tutoriel suivant.

Exécuter Azure Functions

Ensuite, naviguez vers le dossier /upstream :

mvn clean install
mvn azure-functions:run

Les deux fonctions démarreront dans une fenêtre de terminal. Vous pouvez demander les deux API sans serveur dans votre navigateur :

Par exemple :

API sans serveur Produits

API sans serveur Avis

Déployer Azure Functions

Ensuite, nous déployons le code des fonctions sur Azure Function App en exécutant la commande suivante :

mvn azure-functions:deploy

Ou vous pouvez simplement suivre ce tutoriel sur comment déployer le projet de fonction sur Azure

Notez que le nom de l'application de fonction est généré aléatoirement en fonction de votre artifactId, suivi d'un nombre généré aléatoirement. Dans les commandes du tutoriel, le nom de l'application de fonction serverless-apis est mentionné.

Juste pour nous assurer que notre fonction fonctionne, nous pouvons tester un appel d'invocation en demandant directement son URL dans le navigateur :

https://serverless-apis.azurewebsites.net/api/products
https://serverless-apis.azurewebsites.net/api/reviews

Exposer les API sans serveur dans APISIX

Une fois la configuration terminée, nous allons maintenant exposer les API sans serveur Azure Functions en tant que services en amont dans APISIX. Pour ce faire, nous devons créer une nouvelle Route avec le plugin azure-function activé pour les API backend sans serveur products et reviews.

Si le plugin azure-function est activé sur une route, APISIX écoute les demandes sur le chemin de cette route, puis il invoque le code de la fonction Azure distante avec les paramètres de cette demande.

Créer une Route pour Produits

Pour créer une route pour la fonction Produits, exécutez la commande suivante :

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "name": "Créer une route avec le plugin Azure function",
    "plugins": {
        "azure-functions": {
            "function_uri": "https://serverless-apis.azurewebsites.net/api/products",
            "ssl_verify": false
        }
    },
    "uri": "/products"
}'

Notez que nous avons défini l'attribut ssl_verify du plugin azure-functions à false pour désactiver la vérification SSL uniquement à des fins de démonstration. Vous pouvez également l'activer pour effectuer des demandes plus sécurisées d'APISIX vers Azure Functions. Apprenez-en plus sur les autres paramètres de configuration.

Tester avec une requête curl

Nous pouvons utiliser curl pour envoyer une demande, en vérifiant si APISIX écoute correctement sur le chemin et transfère la demande au service en amont avec succès :

curl -i -XGET http://127.0.0.1:9080/products
HTTP/1.1 200 OK
[
  {
    "id": 1,
    "name": "Product1",
    "description": "Description1"
  },
  {
    "id": 2,
    "name": "Product2",
    "description": "Description2"
  }
]

Super ! Nous avons obtenu une réponse de l'API sans serveur réelle sur Azure Function.

Ensuite, nous ferons une configuration similaire pour la fonction reviews.

Créer une Route pour Avis et tester

Créez la deuxième route avec le plugin Azure function activé :

curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "azure-functions": {
            "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews",
            "ssl_verify": false
        }
    },
    "uri": "/reviews"
}'

Testez la réponse de l'API sans serveur :

curl -i -XGET http://127.0.0.1:9080/reviews

Dans cette section, nous avons introduit la nouvelle route et ajouté le plugin azure-functions à nos API sans serveur afin qu'APISIX puisse invoquer les fonctions Azure distantes et gérer le trafic. Dans les sections suivantes, nous apprendrons comment authentifier les consommateurs d'API et appliquer des politiques d'exécution comme la limitation de débit.

Sécuriser les API sans serveur avec les plugins d'authentification d'APISIX

Jusqu'à présent, nos API sans serveur sont publiques et accessibles par des utilisateurs non autorisés. Dans cette section, nous activerons la fonctionnalité d'authentification pour interdire les demandes non autorisées aux API sans serveur.

Apache APISIX peut vérifier l'identité associée aux demandes d'API via la validation des informations d'identification et des jetons. De plus, il est capable de déterminer quel trafic est autorisé à passer à travers l'API vers les services backend. Vous pouvez consulter tous les plugins d'authentification disponibles.

Créons un nouveau consommateur pour nos API sans serveur et ajoutons le plugin basic-auth à la route existante afin que seul l'utilisateur autorisé puisse y accéder.

Créer un nouveau consommateur pour les API sans serveur

La commande ci-dessous créera notre nouveau consommateur avec ses informations d'identification telles que le nom d'utilisateur et le mot de passe :

curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "username": "consumer1",
    "plugins": {
        "basic-auth": {
            "username": "username1",
            "password": "password1"
        }
    }
}'

Ajouter le plugin basic auth aux routes existantes Produits et Services

Maintenant, nous configurons le plugin basic-auth pour les routes afin qu'APISIX vérifie l'en-tête de la demande avec les informations d'identification du consommateur d'API chaque fois que les API sont appelées :

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "name": "Créer une route avec le plugin Azure function",
    "plugins": {
        "azure-functions": {
            "function_uri": "https://serverless-apis.azurewebsites.net/api/products",
            "ssl_verify": false
        },
        "basic-auth": {}
    },
    "uri": "/products"
}'
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "azure-functions": {
            "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews",
            "ssl_verify": false
        },
        "basic-auth": {}
    },
    "uri": "/reviews"
}'

Tester le plugin basic auth

Maintenant, si nous demandons les API sans serveur sans les informations d'identification de l'utilisateur dans l'en-tête, nous obtiendrons une erreur non autorisée :

curl -i http://127.0.0.1:9080/products
HTTP/1.1 401 Unauthorized

{"message":"Missing authorization in request"}

Le résultat est celui attendu. Mais si nous fournissons les bonnes informations d'identification de l'utilisateur dans la demande et accédons au même point de terminaison, cela devrait fonctionner correctement :

curl -i -u username1:password1 http://127.0.0.1:9080/products
HTTP/1.1 200 OK

Nous avons validé l'identité du client tentant de demander les API sans serveur en utilisant le plugin d'authentification de base avec l'aide d'Apache APISIX.

Appliquer des politiques de limitation de débit pour les API sans serveur

Dans cette section, nous protégerons les API sans serveur contre les abus en appliquant une politique de limitation. Dans Apache APISIX Gateway, nous pouvons appliquer une limitation de débit pour restreindre le nombre d'appels entrants.

Appliquer et tester la politique de limitation de débit

Avec les configurations de route existantes pour les fonctions Produits et Avis sélectionnées, nous pouvons appliquer une politique de limitation de débit avec le plugin limit-count pour protéger notre API contre une utilisation anormale. Nous limiterons le nombre d'appels d'API à 2 par 60s par consommateur d'API.

Pour activer le plugin limit-count pour la route Produits existante, nous devons ajouter le plugin à l'attribut plugins dans notre configuration de route Json :

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "name": "Créer une route avec le plugin Azure function",
    "plugins": {
        "azure-functions": {
            "function_uri": "https://serverless-apis.azurewebsites.net/api/products",
            "ssl_verify": false
        },
        "basic-auth": {},
        "limit-count": {
            "count": 2,
            "time_window": 60,
            "rejected_code": 403,
            "rejected_msg": "Les demandes sont trop fréquentes, veuillez réessayer plus tard."
        }
    },
    "uri": "/products"
}'

Apache APISIX gérera les deux premières demandes comme d'habitude. Cependant, une troisième demande dans la même période retournera un code 403 HTTP Forbidden avec notre message d'erreur personnalisé :

HTTP/1.1 403 Forbidden

{"error_msg":"Les demandes sont trop fréquentes, veuillez réessayer plus tard."}

Prochaines étapes

Dans cet article, nous avons appris étape par étape comment créer des API sans serveur basées sur Java avec Azure Functions et Apache APISIX Gateway pour gérer vos API tout au long de leur cycle de vie complet, de l'exposition des API sans serveur en tant que services en amont dans APISIX à la sécurisation et à l'application de la limitation de débit pour limiter le nombre de demandes. Cela ouvre la porte à d'autres cas d'utilisation de l'intégration de la passerelle API et des API sans serveur.

Vous pouvez explorer d'autres capacités d'APISIX Gateway en enchaînant divers plugins intégrés pour transformer les demandes, surveiller la disponibilité, les performances et l'utilisation de nos API sans serveur, mettre en cache les réponses des API et les faire évoluer en versionnant les API qui vous aide à réduire le temps de développement, à augmenter l'évolutivité et à réaliser des économies.

Apache APISIX est une solution de passerelle API entièrement open-source. Si vous avez besoin de fonctionnalités de gestion d'API plus avancées pour les API sans serveur, vous pouvez utiliser API7 Enterprise ou API7 Cloud qui sont alimentés par APISIX.

Ressources connexes

Contenu recommandé

Tags: