Déployer une application Symfony ❤️ dans une lambda AWS ☁️
(Access to the English version)
💡Avant d’aller plus loin, nous devons savoir ce que signifie une architecture «Serverless» (=sans serveur) et quand utiliser cette architecture.
📚 Une architecture «Serverless» est une architecture sans serveur, elle vous aide à exécuter un morceau de code sans gérer aucun type d’infrastructure, le fournisseur de cloud est responsable de la gestion du serveur Web et de l’infrastructure… Cela permet de vous focaliser uniquement sur le code et de ne pas vous soucier de l’infrastructure et de la gestion du serveur.
AWS Lambda offre une haute disponibilité et vous ne payez que pour le temps d’exécution du code. Cela peut être très utile pour certaines tâches comme par exemple un CRON, envoyer une notification en temps réel, exposer une API, gérer certains événements lorsqu’une opération se produit… Vous pouvez trouver plus de cas d’utilisation sur le web. 🔥
Notre cas d’utilisation 🔧
Exposez une API construite avec Symfony qui publie un message sur LinkedIn.
Une journée de développeur est généralement composée de tâches successives de la production de code au déploiement de celui-ci, nous allons donc en faire de même dans l’article.
Le code 💻
La version 5 de Symfony est livrée avec un tout nouveau composant appelé «Notifier» qui permet d’envoyer des notifications via différents fournisseurs (Slack, Twitter, Twilio…) Symfony ne fournit pas de fournisseur intégré pour LinkedIn il y a donc quelques mois j’ai créé une librairie pour publier du contenu sur LinkedIn en utilisant «le Notifier». Cette librairie sera disponible dans la version Symfony 5.2, en attendant voici le code source, nous l’utiliserons dans notre démonstration.
Codons !
$ symfony new --full aws-lambda-linkedin-notifier
$ cd aws-lambda-linkedin-notifier
$ composer require eniams/linkedin-notifier
Activer la libraire (voir la documentation)
<?php// config/bundles.phpreturn [// others bundles,Eniams\Notifier\LinkedIn\LinkedInNotifierBundle::class => [‘all’ => true]];// .envLINKEDIN_DSN=
Code pour publier la notification
La logique est simple, on expose une API sur la route /content
.
L’API doit recevoir une requête Post
avec une propriété message
dans le body de la requête.
Ligne 11, nous envoyons le message posté sur LinkedIn, Grâce à Symfony et à son bridge c’est très simple !
Comme nous sommes des développeurs professionnel, le code est testé :
Le code est prêt ! C’est le moment de déployer 🚀
Uuuuuuuh ! AWS Lambda ne supporte pas PHP.
En effet, AWS Lambda supporte quelques languages de programmation comme GO, Java, Python, Ruby, NodeJS, DotNet.
Doit-on apprendre un nouveau language et réecrire notre code? Heureusement que non!
Merci à Matthieu Nappoli qui à développé Bref.sh ainsi qu’aux contributeurs qui l’aide à maintenir ce projet open source.
Bref permet de déployer des applications PHP sur AWS et de les lancer AWS Lambda.
Configuration du Déploiement
Modifions le Kernel.php
pour gérer les logs
Préparons le serverless (documentation)
$ npm install -g serverless
$ serverless config credentials --provider aws --key --secret
$ composer require bref/bref
Configurons le serverless.yaml
Deployons !
$ serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service notifier-linkedin-api.zip file to S3 (10.05 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
....................
Serverless: Stack update finished...
Service Information
service: notifier-linkedin-api
stage: dev
region: eu-west-3
stack: notifier-linkedin-api-dev
resources: 15
api keys:
None
endpoints:
POST - https://xxx.execute-api.eu-west-3.amazonaws.com/dev/contents
functions:
website: notifier-linkedin-api-dev-website
layers:
None
Serverless: Removing old service artifacts from S3...
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
Désormais le code est déployé sur AWS Lambda et notre API est disponible sur l’endpoint https://xxx.execute-api.eu-west-3.amazonaws.com/dev/contents
Testons
Resultat (voir la notification sur LinkedIn)
C’est tout !
Vous trouverez le code source (ici), j’espère que celà vous a plus, n’oubliez pas d’applaudir et de partager 👏🏻👏🏼👏🏽👏🏾👏🏿