Déployer une application Laravel Serverless avec stockage des sessions dans DynamoDB

Published in LaravelServerlessBrefDynamoDB on Jul 20, 2020

Pour faire suite à mon post précédent introduisant le déploiement d’une application Laravel Serverless en quelques minutes avec Bref, je vais maintenant poursuivre en vous montrant comment stocker vos sessions dans DynamoDB.

Le code de mon précédent post est visible ici : https://github.com/pmayet/laravel-lambda-5min/tree/master

Configuration

On repart donc du master.

On va d’abord ajouter le AWS SDK PHP, qui contient notamment les class permettant de manipuler des données au sein de DynamoDB.

https://miro.medium.com/max/1344/1*Sw40eoPp44KjKCPlNfIV2g.png

Ensuite, dans la config du cachestore DynamoDB, on va ajouter une ligne de config pour le token qui est hérité par la Lambda.

En effet, le store utilisé pour les sessions dans Laravel, se base sur le cachestore, au même principe que si on utilisait Redis.

https://miro.medium.com/max/1400/1*IzwtP5Hh-W91BqEukFYcVA.png

Et pour finir, la configuration de DynamoDB.

D’abord, on donne les permissions à la Lambda les droits de lecture/écriture à notre table DynamoDB.

https://miro.medium.com/max/1180/1*1Gvu8853n5ToPsbeoA5Bow.png

Et on indique le SESSION_DRIVER, le CACHE_DRIVER, le CACHE_STORE et enfin le nom de la table DynamoDB.

https://miro.medium.com/max/1400/1*j54yxbUPPPuMl6xWi8-3Pg.png

Ensuite, pour les besoins de la démo, on provisionne notre table DynamoDB par le biais du serverless.yml. En environnement de Production, je vous conseille plutôt de faire le provisionning de vos ressources de ce type via Terraform, CloudFormation ou autre.

https://miro.medium.com/max/1400/1*KCh9aBg2yA6kpaWgrqrsAA.png

Enfin, pour montrer le bon fonctionnement, on modifie la vue utilisée par notre route pour indiquer le datetime courant ainsi que le session ID et vérifier ainsi le bon fonctionnement.

https://miro.medium.com/max/1400/1*qJEL5_4fx4_wzzog1QNyWQ.png

Le code est accessible ici : https://github.com/pmayet/laravel-lambda-5min/tree/dynamodb-session

Le résultat est visible ici : https://3c3fygo941.execute-api.eu-west-1.amazonaws.com/

https://miro.medium.com/max/1400/1*QxUFb3CzMFwIr8AM6WiBVw.png

Vous verrez alors un enregistrement par session dans votre table DynamoDB

https://miro.medium.com/max/1400/1*uFZ0_ZoFiF2qgqhW1NhC6A.png

Dans la description de notre ressource DynamoDB, vous verrez la définition d’un TTL, ce qui permet à DynamoDB de supprimer de manière automatique l’enregistrement après l’expiration du timestamp. Dans les faits cela se fait 5 à 10 min après. En activant le stream, cela nous fera un nouveau cas d’usage dans un futur post, comme par exemple déterminer le nombre de users connectés en simultané.

Conclusion

Point d’importance avant de stocker les sessions dans DynamoDB dans un environnement de Production, pensez bien à stresser votre application afin de déterminer comme il faut le provisionning de votre table DynamoDB en configurant le ReadCapacity et le WriteCapacity, bien sûr vous pouvez appliquer de l’autoscaling, mais sur des sessions, le temps de l’autoscale risque d’être problématique.

Je vous propose de poursuivre mes posts sur les sujets suivants :

  • Traitements de queue SQS au sein de la même application
  • Traitements de queue SQS entre applications tierces (micro-services)
  • Gérer des évènements asynchrones avec un délai supérieur à 15min (limite de SQS)
  • Déploiement via Gitlab CI
  • Analyse d’email via SES
  • Gestion des migrations de base de données
  • Connexion à RDS
  • Indexation Elastic en asynchrone via Laravel Scout

N’hésitez pas à m’indiquer quels cas d’architecture vous souhaiteriez que j’aborde.

A vos commentaires et critiques !