API serverless avec AWS Lambda et API Gateway

Les architectures Cloud ne cessent d’évoluer afin de répondre aux besoins incessants des entreprises et des particuliers.

La plupart des montages applicatifs d’aujourd’hui reposent massivement sur les APIs, mais faire tourner de telles architectures implique la fourniture de plusieurs briques logicielles (API Gateway, API back-end, base documentaire, serveur de messaging, …), mais ces briques ont toujours besoin d’un socle infrastructure/réseau déjà provisionné, ce qui engendre quelques contraintes face aux enjeux business impliquant l’IT :

  1. Élasticité
  2. Temps de mise à disposition
  3. Respect du Ratio investissement/service rendu

Les offres en Cloud serverless répondent parfaitement à ces enjeux. En effet, il suffit de charger le code et/ou la configuration voulue et le service est déjà rendu sans se soucier des infrastructures matérielles et réseau, ni des différents sizings à mettre en place.

Dans cet article, on verra comment utiliser deux offres serverless d’AWS pour implémenter et exposer facilement et rapidement une API à travers un exemple simple (conversion de devises), sans s’occuper d’aucune plateforme matérielle ou logicielle.
Pour cet exemple il suffit :

  1. de connaitre un langage de programmation : exemple NodeJS
  2. d’avoir des notions sur les APIs REST : Ressources, Verbes HTTP
  3. de savoir où trouver une source de données pour les valeurs des devises selon l’USD : c’est l’offre limitée gratuite de openexchangerates.org

Le premier composant serverless à utiliser est Lambda. Il permet d’exécuter à la demande des fonctions développées en plusieurs langages de programmation.
Ce service est facturée à la consommation de RAM allouée pendant une unité de temps de multiple de 100ms.

Le deuxième service est API Gateway, qui permet de configurer, exposer et sécuriser une API.
Les appels de l’API seront donc orientés selon notre besoin vers d’autres APIs ou bien une fonction Lambda. La facturation de ce service est aussi à la consommation par appel d’API.

Ci-dessous les étapes pour reproduire l’exemple.

 

Implémentation d’une fonction avec AWS Lambda

Sélection du service lambda :

Choix d’une template pour avoir un canevas de code pré-rempli avec ce qu’il faut pour appeler une API externe :

Création de la fonction :

Création d’un événement test d’appel de la fonction avec la devise cible (Euro), ce test correspondra à un appel de l’API qu’on va configurer par la suite :

{
"pathParameters": { "currency": "EUR" }
}

Maintenant on va modifier la fonction pour exécuter les instructions suivantes :

  1. Récupérer la devise cible du paramètre d’entrée
  2. Appeler l’API tierce pour récupérer le taux de change
  3. Préparer la réponse avec le format JSON attendu

Code la fonction :

const https = require('https');
exports.handler = (event, context, callback) => {
    const currency = event.pathParameters.currency;
    console.log('Requested currency', currency);
    const options = { hostname: 'openexchangerates.org', port: 443, path: '/api/latest.json?app_id=9d1617520f8a4f1cb3ae4674fb418956', method: 'GET' };
    const req = https.request(options, (res) => {
        let body = '';
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => {
           if (res.headers['content-type'] === 'application/json; charset=utf-8') {
               body = JSON.parse(body);
               body = {"rate" : body.rates[currency] };
           }
           var response = { "statusCode": 200, "body": JSON.stringify(body), "isBase64Encoded": false };
           callback(null, response);
        });
    });
    req.on('error', callback);
    req.end();
};

Ensuite on peut tester unitairement la fonction :

Pour rendre cette fonction accessible, il faut créer un événement déclencheur, dans notre cas on va l’exposer via une API REST.

 

Création d’un API REST/JSON avec AWS API Gateway

Ci-dessous les étapes pour créer une API ayant comme URI /rates/{currency}, « currency » sera l’élément variable désignant le devise cible du change attendu :

Choix d’API Gateway comme déclencheur :

Implémentation des ressources :

 

 

Enfin, on pourra tester l’API via la console de configuration d’abord :

Déploiement de l’API :

 

Test avec un appel HTTP

Il suffit de coller l’URL affichée après déploiement et ajouter la partie dynamique de l’API /rates/{deviseCible} :

Sur un navigateur :

 

Conclusion

Nous avons vu qu’avec les services Serverless on peut facilement et rapidement implémenter et exécuter une API et une fonction et sans se soucier de plusieurs choses.

Le service rendu cache toutes les contraintes opérationnelles : fourniture, exploitation et maintenance des plateformes.
Et on n’est même pas amené à connaitre quel matériel/OS/logiciel tourne notre code et notre API.

 
Et si vous souhaitez vous former sur Amazon Web Services, découvrez notre offre de formations AWS.