cover image
< Accueil
Cloud

Serverless pour les messages de contact

Serverless est un framework permettant de construire et déployer du code sans serveur. Approvisionnement et la mise à l'échelle est automatiquement prise en charge par le fournisseur de cloud computing. Le framework Serverless est une abstraction au-dessus des plus importants fournisseurs de cloud. Ce tutoriel montrera comment écrire une fonction qui vous envoie un courriel avec les coordonnées du client. C'est un cas d'utilisation populaire pour les formulaires de contact sur les sites Web.

Pour les besoins de ce tutoriel, l'API Twilio Sendgrid API sera utilisée pour envoyer un e-mail. Ce tutoriel nécessite une connaissance de base de JavaScript et des appels API.

Serverless Computing

Serverless computing, également connu sous le nom de function as a service (FaaS), a d'abord été mis au point par la société Amazon AWS avec AWS Lambda en 2014. Malgré son nom qui implique une utilisation sans serveur, des serveurs sont tout de même impliqués. Mais le développeur n'a pas besoin de prendre soin de ces serveurs. Elle peut écrire le code du serveur puis exécutez une commande pour déployer automatiquement la fonction. La mise à l'échelle est prise en charge par le fournisseur de cloud. Souvent, le prix est basé sur le nombre d'appel de la fonction et la mémoire ou le temps CPU.

Cela signifie que les coûts de serveur fixes qui étaient traditionnellement calculé en fonction de la durée d'exécution du serveur sont maintenant devenus des coûts variables en fonction du nombre d'appels et de la mémoire ou du CPU.

Les nouveaux cas d'utilisation pour l'informatique sans serveur sont par exemple le redimensionnement d'une image après téléchargement ou envoyer un e-mail au service après-vente lorsque le client saisit ses informations de contact et écrit un message sur un formulaire de contact du site web.

Ce tutoriel décrit ce dernier cas d'utilisation. D'autres cas d'utilisation incluent le streaming d'événements par exemple, ou bien d'autres utilisations qui sont énumérés sur le site Web de Serverless.

Framework Serverless

Le framework Serverless est un framework libre et open source écrite en Node.js. Il prend en charge tous les principaux fournisseurs de cloud comme AWS, Google Cloud, Azure, CloudFlare Workers et Alibaba Cloud. Il existe également une version d'entreprise que l'entreprise à l'origine de l'initiative du framework Serverless, Serverless Inc. supporte. Serverless Inc., est une start-up basée à San Francisco, USA et qui a notamment le soutien de Trinity Ventures, entre autres.

L'installation de Serverless est assez simple. Suivez les instructions de la page Documents Serverless.

Ensuite, clonez l'exemple d'application serverless-message exemple d'application depuis le répertoire GitHub. Exécutez npm install et ceci résout les dépendances du paquet.

Configuration

Toute la configuration majeure se fait dans le fichier serverless.yml. Vous y trouverez des informations sur le fournisseur de cloud à utiliser, quelle durée d'exécution et quelle région.

Sous functions, le nom de la fonction est spécifié, sa méthode http (POST) et que CORS devrait être activés. Aussi, il s'agit d'une fonction privée, ce qui signifie que l'appelant doit inclure la clé API dans l'en-tête de l'appel POST. La valeur de la clé API se trouve dans la section apiKeys.

serverless.yml

service: serverless-message

provider:
  name: aws
  runtime: nodejs8.10
  region: eu-central-1
  apiKeys:
    - name: firstKey
      value: JNJSNKMKDMKSMKMDKMDK
  environment:
    SENDGRID_API_KEY: Your API Key
    MESSAGE_TO: Your email address
    MESSAGE_FROM: The sender email address (your website domain)
  usagePlan:
    quota:
      limit: 5000
      offset: 2
      period: MONTH
    throttle:
      burstLimit: 20
      rateLimit: 10

functions:
  sendMessage:
    handler: handler.sendMessage
    events:
      - http:
          path: send-message
          method: post
          cors: true
          private: true

plugins:
  - serverless-offline

Il y a également trois variables que vous devez définir. La clé SENDGRID_API_KEY est votre clé API Sendgrid. Il peut être créé après l'inscription à Twilio Sendgrid.

Les deux autres variables d'environnement sont l'adresse de courriel à laquelle le fichier message de contact du client doit être envoyé. C'est normalement votre adresse e-mail professionnelle. Vous y recevrez le message lorsque qu'un client soumet une demande de contact sur votre site Web. La variable MESSAGE_FROM est l'adresse e-mail de votre site web.

L'autre section est le usagePlan qui est un élément de sécurité où vous pouvez définir le nombre maximum d'invocations mensuelles.

Fonction Serverless

C'est le cœur de l'application. La fonction de gestionnaire n'est qu'une fonction JavaScript normale. Vous pouvez importer du code à partir des paquets Node. Dans ce cas, le @sendgrid/mail est nécessaire pour envoyer l'e-mail.

Sinon, la fonction est simple. Elle envoie un e-mail avec les données (nom, courriel, message) qui ont été inclues dans le corps de l'appel POST.

Le front-end devra ensuite enregistrer les données à partir des informations saisies par le client dans le formulaire. Actuellement, le front-end ne fait pas partie de cette application.

handler.js

'use strict'

const sgMail = require('@sendgrid/mail')

function sendEmail(data) {
  sgMail.setApiKey(process.env.SENDGRID_API_KEY)
  const msg = {
    to: process.env.MESSAGE_TO,
    from: process.env.MESSAGE_FROM,
    subject: 'New Message from Website',
    text: `Message from ${data.name} - ${data.email}: ${data.message}`,
    html: `<strong>Message from ${data.name} - ${data.email}: ${
      data.message
    }</strong>`,
  }
  sgMail.send(msg)
}

module.exports.sendMessage = (event, context, callback) => {
  const data = JSON.parse(event.body)
  sendEmail(data)

  const response = {
    statusCode: 201,
    headers: {
      'Access-Control-Allow-Origin': '*', // Required for CORS support to work
    },
    body: JSON.stringify({
      message: 'Message sent successfully.',
      input: event,
    }),
  }

  callback(null, response)
}

La fonction renvoie un code de succès 201 avec un message de confirmation.

Test hors ligne

L'avantage de Serverless est qu'il possède un bon écosystème de plugins. Il y a aussi un plugin très utile pour tester la fonction AWS serverless localement sur votre PC. Ce plugin s'appelle serverless-offline.

Vous pouvez exécuter la fonction localement avec :

sls offline

Cela démarre un serveur local et imprime également la clé API. Vous pouvez par exemple utiliser Postman pour exécuter une commande POST contre le serveur. Vous devez inclure pour cela la clé API dans le header (x-api-key).

Voici un exemple de corps de message POST :

{
  "email": "[email protected]",
  "name": "Superman",
  "message": "Greetings to Nietzsche!"
}

Dans ce cas, un e-mail contenant ces informations vous sera envoyé à l'adresse e-mail que vous avez configurée.

Déployer

Le déploiement est facile, mais peut prendre un peu de temps, car toutes les ressources doivent être téléchargées et fournies.

Exécutez la commande :

sls deploy

Veuillez noter que vous avez besoin d'un CLI AWS fonctionnel installé localement et l'utilisateur AWS doit avoir les droits corrects pour installer les fonctions lambda AWS. Reportez-vous à la documentation sur la CLI et aux tutoriels sur Serverless énumérés ci-dessous.

Conclusion

Serverless simplifie grandement le développement des fonctions sans serveur. De plus, il vous permet de changer relativement facilement de fournisseur de cloud, évitant ainsi le verrouillage du fournisseur. En tant que cadre open source, il dispose d'un vaste écosystème, est populaire et a le soutien d'une société commerciale.

Sources et lectures complémentaires

Publié le

5 nov. 2019


Creative Commons License

Cette œuvre est soumise à une licence Creative Commons Attribution 4.0 International License.
Thomas Derflinger

Écrit par Thomas Derflinger

Je suis un entrepreneur visionnaire et un développeur de logiciels. Dans ce blog, j'écris principalement sur la programmation web et des sujets connexes comme l'IdO.