Symfony serverless avec LAMBDA et BREF
La mise en place d’applications (ou de fonctions) sur un mode serverless est une tendance de fond qui se confirme jour après jour. Comment mettre en place de manière opérationnelle une solution serverless avec PHP et Symfony ?

Serverless, c’est quoi ?
Serverless, c’est l’étape d’après du Cloud 🙂
Si vous faites du Web depuis un petit moment, vous pouvez constater l’évolution de la partie hébergement comme ceci. Au fil du temps, nous sommes passés :
- D’un serveur physique
- à un serveur virtuel
- à des serveurs de plus en plus virtuels (cloud & co)
- à des serveurs virtuels dans des serveurs virtuels (Docker / Kubernetes & co)…
Le site serverless-stack.com résume bien les choses :
L’architecture serverless est un modèle dans lequel le fournisseur de services cloud (AWS, Azure ou Google Cloud) est responsable de l’exécution d’un morceau de code en allouant de manière dynamique les ressources.
Et il ne facture que la quantité de ressources utilisées pour exécuter le code. Le code est généralement exécuté dans des conteneurs sans état pouvant être déclenchés par divers événements, notamment des requêtes http, des événements de base de données, des services de file d’attente, des alertes de surveillance, des téléchargements de fichiers, des événements planifiés (tâches cron), etc. Le code envoyé au fournisseur de cloud pour l’exécution est généralement sous la forme d’une fonction.
Par conséquent, serverless est parfois appelé “Functions as a Service” ou “FaaS”.
Déployons Symfony et API Platform en serverless
Bien. Maintenant que nous savons tout cela, cet article va vous présenter comment déployer Symfony et API Platform sur le service Serverless d’Amazon, à savoir AWS Lambda.
Qu’allons nous mettre en place ?

Et pour faire de cet article un projet de la vraie vie, nous n’allons pas déployer un « Hello World ». En cette période de confinement, où tout le monde est en télétravail, le bureau ne nous a jamais autant manqué. Alors, nous allons mettre en place une API qui nous permet de récupérer les meilleures citations de la célèbre série « The Office »
Pour mener à bien ce projet, nous aurons donc besoin :
- D’exécuter du code (AWS Lambda)
- De servir des assets (AWS S3)
- D’une base de données (AWS RDS)
Mise en place du projet Symfony / API Platform
Nous ne nous attarderons pas sur la mise en place du projet avec Symfony / API Platform, car le coeur de cet article ne se situe pas là. Vous pouvez jeter un oeil au code source que nous avons publié sur Github, accessible à la fin de cet article.
$ symfony new the-office-api-quotes
$ cd the-office-api-quotes
$ composer req api debug maker
$ bin/console make:entity Quotes --api-resource
$ symfony serve
Et voilà ! Vous devriez avoir une API prête à servir des citations de The Office à l’URL https://127.0.0.1:8001/api/quotes
Adaptons Symfony au serverless
Symfony est presque prêt à être déployé tel quel. Il est nécessaire d’apporter une modification mineure pour faire en sorte que les fichiers de cache et de log soient générés dans le dossier /tmp, seul répertoire accessible par défaut en écriture.
// src/Kernel.php
public function getLogDir()
{
// When on the lambda only /tmp is writeable
if (getenv('LAMBDA_TASK_ROOT') !== false) {
return '/tmp/log/';
}
return parent::getLogDir();
}
public function getCacheDir()
{
// When on the lambda only /tmp is writeable
if (getenv('LAMBDA_TASK_ROOT') !== false) {
return '/tmp/cache/'.$this->environment;
}
return parent::getCacheDir();
}
Bref. Il faut déployer Symfony en Serverless
Maintenant que notre API tourne en local, nous allons la déployer sur AWS Lambda, afin que celle-ci soit exécutée en tant que fonction.
Nous allons pour cela nous appuyer sur trois outils : bref, serverless et aws.
- serverless est un framework qui permet de déployer son code. Pour nous, il s’agira essentiellent d’un outil en ligne de commande et d’un fichier de configuration en
yaml
. - bref est une solution complète qui rend possible l’exécution de code PHP sur AWS Lambda (via un runtime PHP qui n’existe pas nativement). Bref est également un package installable via composer et qui permet entre autre de disposer un cli qui permet d’invoquer votre application.
- aws est un outil en ligne de commande qui permet d’interragir avec les services d’AWS