API REST sans serveur "sur le genou en 5 minutes"

Bonjour, Habr! Aujourd'hui, nous continuons la discussion sur les opportunités qu'Amazon Web Services nous offre et comment utiliser ces opportunités pour résoudre les problèmes d'application.

Dans un exemple simple, nous envisagerons de créer en quelques minutes notre propre API REST auto-évolutive sans serveur avec analyse de cas - obtenir une liste pour une ressource.

Intéressant? Alors passez sous la coupe!


(Source)

Au lieu de rejoindre


Nous n'utiliserons aucune base de données pour analyser l'exemple; à la place, notre source d'informations sera un fichier texte en clair sur AWS S3.

  • Supposons donc que sur AWS S3, nous ayons un fichier texte avec des en-têtes et que certains processus y écrivent des informations.
  • Nous allons créer une API cloud qui renverra une réponse JSON en tant que demande GET avec le paramètre passé.
  • En même temps, selon la complexité des tâches et, par conséquent, les exigences accrues pour la puissance de traitement des ressources, vous n'avez pas à vous en préoccuper, car le service est entièrement évolutif. Et cela signifie que vous n'avez besoin d'aucune administration, allocation et gestion de serveur, téléchargez simplement votre code et exécutez-le.

Architecture du système en cours de développement




Composants d'Amazon Web Services utilisés:

  • Amazon S3 - stockage d'objets, qui vous permet de stocker des quantités presque illimitées d'informations;
  • AWS Identity and Access Management (IAM) - Un service qui permet de contrôler en toute sécurité l'accès aux services et ressources AWS. À l'aide d'IAM, vous pouvez créer, gérer, gérer des utilisateurs et des groupes AWS et utiliser des autorisations pour accorder ou refuser l'accès aux ressources AWS;
  • AWS Lambda est un service qui vous permet d'exécuter du code sans sauvegarder ni configurer de serveurs. Toute la puissance de calcul est automatiquement mise à l'échelle pour chaque appel. Les frais sont facturés en fonction du nombre de demandes de fonctionnalités et de leur durée, c'est-à-dire temps pendant lequel le code est exécuté.
    Le niveau d'accès gratuit (niveau gratuit) implique 1 million de demandes par mois gratuites et 400K Go. Langages pris en charge: Node.js, Java, C #, Go, Python, Ruby, PowerShell
    . Nous utiliserons Python:

    • La bibliothèque boto3 est un SDK AWS pour Python qui vous permet d'interagir avec divers services Amazon;
  • Amazon API Gateway est un service de développeur entièrement géré conçu pour créer, publier, maintenir, surveiller et sécuriser des API à n'importe quelle échelle. Outre la possibilité d'utiliser plusieurs versions de la même API (étapes) pour le débogage, le raffinement et les tests, le service vous permet de créer des API REST sans serveur à l'aide d'AWS Lambda. Lambda exécute le code dans une infrastructure informatique hautement accessible, éliminant ainsi le besoin de distribution, de mise à l'échelle et de gestion des serveurs.
    Le niveau gratuit pour l'API HTTP / REST comprend un million d'appels d'API par mois pendant 12 mois

Préparation des données


Un fichier texte avec un onglet sera utilisé comme délimiteur de champ comme source d'informations pour générer des réponses à une demande GET REST. Les informations n'ont plus vraiment d'importance pour cet exemple, mais pour une utilisation ultérieure de l'API, j'ai téléchargé à partir du terminal de négociation Quik une table de négociation actuelle des obligations libellées en roubles russes, je l'ai enregistrée dans bonds.txt et j'ai placé ce fichier dans un compartiment AWS S3 spécialement créé.

Un exemple des informations reçues est illustré dans la figure ci-dessous:



Ensuite, vous devez écrire une fonction qui lira les informations du fichier bonds.txt, les analysera et les émettra sur demande. AWS Lambda s'en sortira très bien. Mais d'abord, vous devrez créer un nouveau rôle qui permettra à la fonction Lambda créée de lire les informations à partir du compartiment situé dans AWS S3.

Créer des rôles pour AWS Lambda


  1. Dans la console de gestion AWS, accédez au service AWS IAM puis à l'onglet "Rôles", cliquez sur le bouton "Créer un rôle";

    Ajout d'un nouveau rôle

  2. Le rôle que nous créons maintenant sera utilisé par AWS Lambda pour lire les informations d'AWS S3. Par conséquent, à l'étape suivante, sélectionnez "Sélectionner le type de confiance" -> "Service Aws" et "Choisissez le service qui utilisera ce rôle" -> "Lambda" et cliquez sur le bouton "Suivant: Autorisations"

    Rôle du service Lambda

  3. Vous devez maintenant définir les stratégies d'accès pour les ressources AWS qui seront utilisées dans le rôle nouvellement créé. Parce que la liste des politiques est assez impressionnante, en utilisant le filtre des politiques, nous lui indiquons «S3». En conséquence, nous obtenons une liste filtrée pour le service S3. Notez la case à cocher en face de la politique «AmazonS3ReadOnlyAccess» et cliquez sur le bouton «Suivant: Tags».

    Stratégies pour les rôles

  4. L'étape (Ajouter des balises (facultatif)) est facultative, mais vous pouvez spécifier des balises pour les rôles si vous le souhaitez. Nous ne le ferons pas et passons à l'étape suivante - Aperçu. Ici, vous devez définir le nom du rôle - "ForLambdaS3-ReadOnly", ajouter une description et cliquer sur le bouton "Créer un rôle".

    Rôles de titre


Tout, le rôle a été créé et nous pouvons l'utiliser dans d'autres travaux.

Créer une nouvelle fonctionnalité dans AWS Lambda


  1. Accédez au service AWS Lambda et cliquez sur le bouton "Créer une fonction":

    Création de fonction


    Remplissez tous les champs comme indiqué dans la capture d'écran ci-dessous:

    • Nom - "getAllBondsList";
    • Runtime - "Python 3.6"
    • Rôle - «Choisissez un rôle existant»
    • Rôle existant - ici, nous sélectionnons le rôle que nous avons créé ci-dessus - ForLambdaS3-ReadOnly

    Nom et choix du rôle

  2. Il ne reste plus qu'à écrire le code de la fonction et à vérifier ses performances sur différents tests. Il convient de noter que le composant principal de toute fonction Lambda (si vous utilisez Python) est la bibliothèque boto3:

    import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('your-s3-bucket') obj = bucket.Object(key = 'bonds.txt') response = obj.get() 

    L'idée de base de notre fonction Python est la suivante:

    • Ouvrez le fichier bonds.txt;
    • Lire les en-têtes de colonne;
    • Battez des records par page (10 collections dans notre cas);
    • Sélectionnez la page souhaitée;
    • Mappez le nom des colonnes et des enregistrements;
    • Donnez le résultat sous forme de collections.

    Nous ne consacrerons pas beaucoup de temps au code de fonction lui-même et à l'implémentation technique, tout est assez simple et le code complet est disponible dans mon GitHub .

      for i in range(0, len(lines_proc)): d = dict((u''.join(key), u''.join(value)) for (key, value) in zip(headers, lines_proc[i].split("\t"))) response_body.append(d) return { 'statusCode': 200, 'page' : num_page, 'body': response_body } 

    Insérez le code (ou écrivez le vôtre :)) dans le bloc «Code de fonction» et cliquez sur le bouton «Enregistrer» dans le coin supérieur droit de l'écran.

    Insertion de code

  3. Créez des événements de test. Après avoir inséré le code, la fonction est disponible pour le lancement et le test. Cliquez sur le bouton «Test» et créez des événements de test: lancement de la fonction lambda_handler avec différents paramètres. À savoir:

    • Démarrage d'une fonction avec le paramètre 'page': '100';
    • Lancement d'une fonction avec le paramètre 'page': '1000000';
    • Démarrage d'une fonction avec le paramètre 'page': 'bla-bla-bla';
    • Exécution d'une fonction sans le paramètre 'page'.

    Événement de test Page100


    Démarrage de la fonction créée avec l'envoi de la page d'événement de test == 100. Comme le montre la capture d'écran ci-dessous, la fonction a fonctionné avec succès, a renvoyé le statut 200 (OK), ainsi qu'une collection de collections qui correspondent à la centième page de données divisées en utilisant la pagination.

    Déclenchement d'un événement de test Page100


    Pour la pureté de l'expérience, nous lancerons un autre événement test - «PageBlaBlaBla». Dans ce cas, la fonction renvoie le résultat avec le code 415 et un commentaire qu'il faut vérifier l'exactitude des paramètres passés:

    Événement de test PageBlaBlaBla


    Déclenchement d'un événement PageBlaBlaBla



Création d'API


Une fois que tous les autres cas ont été testés et qu'il est entendu que la fonction Lambda fonctionne comme prévu, nous procédons à la création de l'API. Créons un point d'accès à la fonction Lambda créée ci-dessus et configurons en outre une protection contre les démarrages indésirables à l'aide de la clé API.

  • Accédez au service AWS API Gateway. Cliquez sur le bouton Créer une API, définissez le nom de l'API - getAllBondsList

    Créer une nouvelle API

  • Ajoutez la méthode GET à l'API nouvellement créée. Pour ce faire, sélectionnez Actions -> Créer une méthode, sélectionnez la méthode GET dans la liste déroulante et cliquez sur la coche

    Nouvelle méthode GET


    Ensuite, nous indiquons que la méthode GET utilisera notre fonction Lambda getAllBondsList. Sélectionnez-le et cliquez sur le bouton Enregistrer.

    Reliure de fonction lambda

  • Déployons notre API, obtenant ainsi l'URL pour appeler l'API.
    Cliquez sur Actions -> Deploy API, puis sur Deployment stage -> New Stage
    Il est possible de déployer l'API à différentes étapes et vous pouvez appeler ces étapes comme vous le souhaitez (par exemple, DEV / QA / PROD). Nous déploierons immédiatement sur PROD.
    Déployer l'API


    Après le déploiement, un lien pour lancer l'API nouvellement créée sera disponible. Nous allons accéder à cette URL dans la barre d'adresse du navigateur (ou exécuter la commande curl dans le terminal) - nous recevrons un appel API et, par conséquent, lancerons la fonction Lambda:

    URL de l'API


    J'utiliserai l'application Postman pour illustrer la passerelle API AWS. Dans ce document, vous pouvez déboguer et tester le fonctionnement de l'API de manière très confortable.

    Premier test d'API
    Copiez l'URL de l'étape PROD vers Postman et envoyez une demande GET à notre API:



    Quelque chose semble avoir mal tourné ... la demande GET a renvoyé une réponse JSON avec le code 400 et une indication que le paramètre Page n'a pas été défini dans la demande d'appel API. Ajoutez la prise en charge des paramètres de demande à l'API.
  • Prise en charge des paramètres passés dans la demande.
    Nous revenons aux paramètres de la demande GET et passons à l'étape de demande de méthode.

    Demande de méthode


    Dans les paramètres détaillés de la demande de méthode, vous devez développer le bloc Paramètres de chaîne de requête d'URL et ajouter un nouveau «page» de paramètre et le rendre obligatoire:

    Ajout d'un paramètre


    Nous revenons à la page Exécution de méthode et passons à la demande d'intégration. Nous descendons au bas de la page et ouvrons le bloc «Mapping Templates». Sélectionnez "Quand aucun modèle n'est défini (recommandé)", dans le champ Content-Type, spécifiez application / json et cliquez sur la coche. Faites défiler la page ci-dessous et entrez le code dans la zone de texte, comme indiqué dans l'image ci-dessous. Après cela, cliquez sur le bouton Enregistrer.

    Demande de méthode


    Après avoir fait le déploiement de l'API, nous vérifions à nouveau, mais avec le paramètre "page" passé:



    C'est un succès! Maintenant, la demande a fonctionné avec succès et nous a renvoyé les collections contenues sur la dixième page! Hourra!
  • Il ne reste plus qu'à protéger notre API contre les attaques indésirables de l'extérieur.

    Pour ce faire, vous devez configurer l'API de telle manière que lors de l'accès, elle nécessite une clé secrète, qui est transmise à l'en-tête.

    Accédez aux clés API et créez un nouveau groupe de clés API - KeyForBondsList.

    Clés API


    Une fois la clé d'API créée avec succès, vous devez spécifier que l'API getAllBondsList doit exiger que la clé d'API soit transmise dans l'en-tête de la demande. Et liez un KeyForBondsList spécifique à l'API getAllBondsList.

    Revenons aux paramètres de la demande GET dans la demande de méthode et modifions le paramètre API Key Required de false à true. Maintenant, l'API nécessitera le transfert de la clé API.

    Clé API requise


    Accédez à Plan d'utilisation et créez un nouveau plan d'utilisation de l'API.

    Premièrement, nous lui donnons un nom et une description, et deuxièmement, ici, vous pouvez définir des limites au lancement de l'API, par exemple, pas plus d'un lancement par seconde, etc.

    Création d'un plan d'utilisation


    Cliquez sur Suivant et passez à la page suivante où vous devez connecter les étapes de l'API avec le plan d'utilisation:

    Liaison d'une étape à un plan d'utilisation


    Sur la page suivante, nous lions les clés API au plan d'utilisation de l'API. Cliquez sur le bouton Ajouter des clés API au plan d'utilisation et recherchez les clés API créées dans les étapes précédentes par nom:

    Liaison des clés d'API au plan d'utilisation


    Après avoir effectué le déploiement et exécuté à nouveau l'appel GET de notre API, nous obtenons la réponse: «Interdit», car l'en-tête de demande ne contient pas la clé API:



    Essayons de l'ajouter en copiant à partir des clés API -> KeyForBondsList -> clé API -> Afficher et coller dans la section correspondante de la demande avec la clé "x-api-key":



    Tout a fonctionné! Cette fois, la demande renvoie des données sans aucun problème, l'appel API est sûr et protégé contre les intrus par la clé API secrète.

Conclusions et résumé


Dans cet article, nous avons examiné la création d'une API REST auto-évolutive sans serveur à l'aide des services cloud d'Amazon. L'article n'était pas le plus petit en volume, mais j'ai essayé d'expliquer autant que possible l'ensemble du processus de création de l'API et de composer la séquence complète des actions.

Je suis sûr qu'après une ou deux répétitions des étapes décrites dans l'article, vous pouvez augmenter vos API cloud en 5 minutes ou même plus rapidement.

En raison de sa relative simplicité, de son faible coût et de sa puissance, le service AWS API Gateway offre de nombreuses opportunités aux développeurs à utiliser dans le cadre de projets professionnels et commerciaux. Pour consolider le matériel théorique de cet article, essayez de vous inscrire à un abonnement annuel gratuit à Amazon Web Services et effectuez vous-même les étapes ci-dessus pour créer une API REST.

Pour toutes questions et suggestions, je suis prêt à parler avec plaisir. J'attends avec impatience vos commentaires sur l'article et vous souhaite beaucoup de succès!

Source: https://habr.com/ru/post/fr435180/


All Articles