Déployer vos applications serverless avec Bref.sh
Depuis quelques années, les architectures serverless ont le vent en poupe. Les avantages sont nombreux notamment la scalabilité, la gestion des ressources, la facturation à l'usage, et bien d'autres.
Néanmoins, la mise en place d'une architecture serverless peut être complexe, surtout si vous n'avez pas l'habitude de travailler avec les services cloud ou que vous souhaitiez faire rimer DevOps avec simplicité. C'est là qu'intervient Bref.sh, un framework open-source qui permet de déployer des applications PHP sur AWS Lambda.
Bref est un SDK PHP disponible pour Laravel et Symfony, qui facilite la configuration pour le Framework Serverless, un utilitaire en ligne de commande spécialisé dans le déploiement d'application serverless. Avec ces outils, vous vous simplifierez la vie pour configurer votre environnement serverless, la "machine" si je puis dire et son contexte d'exécution. Mais aussi votre environnement PHP et ses extensions, spécifique au runtime de votre "Lambda function" (votre application).
Avant de rentrer dans le vif du sujet, je vous rappelle de faire attention durant vos tests, un compte AWS est nécessaire, ainsi que d'avoir généré des clés d'accès API pour pouvoir utiliser votre compte via les utilitaires Bref et serverless. Bien que AWS Lambda bénéficie d'un free tiers de 1 million de requêtes mensuel, je vous recommande de surveiller l'évolution de votre facture via la console Cost Explorer pour ne pas avoir de mauvaise surprise.
Vous pourrez également interconnecter vos applications avec d'autres services AWS comme S3, DynamoDB, SQS directement par le biais de Bref.
Ou encore, utiliser votre application Laravel en tant que microservice web ou worker (schedule:run
, ou queue), et même les deux en même temps.
Passons à l'action !
Dans cet article, nous allons voir comment déployer une application PHP et l'utiliser comme une fonction via le SDK AWS. Nous nous appuierons sur un exemple simple, un générateur de QR code (vue précédemment ici : Utilisez Illuminate en dehors de Laravel).
Vous l'aurez compris, nous n'aborderons pas Laravel en tant que tel, dans la mesure du possible les différences seront mentionnées pour vous aider à adapter votre déploiement.
Pour vous faire gagner du temps, vous retrouverez ici le code de l'application QR Code nécessaire pour la suite de cet article. Une fois le code récupéré, nous allons le déployer sur AWS Lambda.
On commence avec l'installation de l'outil serverless
qui permet de simuler l'exécution et de manager les déploiements.
1npm install -g serverless@3
Notez que la version 4 est disponible, mais il vous faudra faire un compte utilisateur (gratuit) pour l'utiliser.
Une fois fait, il faut lier son compte AWS à l'outil serverless
. La commande ci-dessous va créer le profil par défaut.
1serverless config credentials --provider aws --key "<AWS_ACCESS_KEY_ID>" --secret "<AWS_SECRET_ACCESS_KEY>"
Retrouverez la démarche complète du setup, à jour, sur le site officiel
Ceci fait, passons à l'installation de Bref sur notre application de QR Code.
1composer require bref/bref --update-with-dependencies
Si vous êtes sur une application Laravel, vous devrez aussi installer le package Laravel de Bref bref/laravel-bridge
, puis publier la configuration.
1composer require bref/laravel-bridge2php artisan vendor:publish --tag=serverless-config
Le setup Laravel est également disponible sur le site officiel
Si vous avez besoin d'extensions PHP spécifiques, vous devez ajouter le plugin extra-php-extensions
qui permettra leur installation.
Dans notre cas, nous allons utiliser imagick
pour générer les QR Codes, nous l'installerons donc.
1composer require bref/extra-php-extensions
Une fois les packages bref/bref
et bref/extra-php-extensions
installés, nous allons nous lancer dans la configuration de notre déploiement.
Nous suivrons en partie le guide de configuration de base, que vous retrouverez sur le site officiel
Bref dispose d'un utilitaire de ligne de commande qui permet de générer un fichier de configuration pour serverless
et un bootstrap d'application.
1vendor/bin/bref init
L'utilitaire est interactif, et vous posera quelques questions pour configurer votre application. Dans l'ordre voici les réponses pour notre application de QR Code.
- What kind of application do you want to create?: "[1] Event-driven function", dans notre cas, nous appellerons nous même la fonction avec le SDK AWS
-
A file named index.php already exists, do you want to overwrite it?: "N", nous utiliserons le fichier
index.php
existant
Voici à quoi ressemble le fichier index.php
lorsque Bref le génère.
1<?php declare(strict_types=1);2 3require __DIR__ . '/vendor/autoload.php';4 5return function ($event) {6 return 'Hello ' . ($event['name'] ?? 'world');7};
C'est un fichier très simple, qui requière le fichier "autoload" de composer pour charger nos dépendances et qui retourne une fonction de rappel (ou callback).
Dans le code du gist, vous trouverez un fichier
test.php
qui montre un exemple d'utilisation de cette callback.
Bref génère également un fichier de configuration pour l'outil serverless, serverless.yml
, la configuration par défaut étant très proche de celle que l'on va utiliser, je vous passe l'analyse du fichier généré et on poursuit sur notre fichier final.
Dans ce fichier serverless.yml
, on retrouve les informations de déploiement de notre application.
Le nom du service figurera sur vos fonctions Lambda, vos buckets S3 et vos Stacks CloudFormation, il sera complèté par l'environnement de déploiement.
1service: lambda-qr
On indique les paramètres de configuration de lambda fonction. On utilise AWS et on précise la region et le runtime, ce dernier nécessite d'utiliser un runtime personnalisé, car PHP ne dispose pas de support de la part de AWS.
1provider:2 name: aws3 runtime: provided.al24 region: eu-west-3
Parmi les runtimes disponibles, deux seulement peuvent nous intéresser avec Bref,
provided.al2
etprovided.al2023
On précise ensuite la liste de nos plugins, ici Bref et le gestionnaires d'extensions PHP.
1plugins:2 - ./vendor/bref/bref3 - ./vendor/bref/extra-php-extensions
On définit ensuite nos fonctions et leurs contextes d'exécution. Ici une seule fonction "qr" dont le point d'exécution est le fichier index.php
.
L'application nécessite PHP 8.3 et l'extension imagick
pour fonctionner.
1functions:2 qr:3 description: 'QRCode generator'4 handler: index.php5 runtime: php-836 layers:7 - ${bref-extra:imagick-php-83}
Vous trouverez ici la liste complète des runtime disponible et utilisable avec Bref.
Enfin, la liste des fichiers à exclure du déploiement. On pensera par exemple au .env
ou aux fichiers de tests.
1# Exclude files from deployment2package:3 patterns:4 - '!tests/**'5 - '!README.md'6 - '!serverless.yml'
Avant de déployer, il est possible de tester localement notre fonction lambda avec l'outil serverless
.
Si vous voyez s'afficher deux chaînes de caractères base 64, c'est que tout fonctionne !
1serverless bref:local -f qr --data '{"correction": "L", "format": "png", "size": 100, "text": "1234"}'2serverless bref:local -f qr --data '{"correction": "L", "format": "png", "size": 100, "text": "1234", "image": "https://www.abenevaut.dev/images/app-icon.png"}'
Pour me faciliter la vie, j'utilise bats-core pour mes tests fonctionnels. Cet outil permet de valider la bonne exécution d'outils en ligne de commande, comme
serverless
.
Quand tout semble fonctionner, on peut s'essayer à notre premier déploiement.
On s'assure que les dépendances sont installées et on déploie en faisant appel à l'outil serverless
.
1composer install2serverless deploy
Pour déployer en production, on précisera simplement l'option --stage
qui spécifiera l'environnement.
1serverless deploy --stage=production
Que ce soit un déploiement en "dev" ou en "prod", pensez à optimiser la taille de votre repertoire vendor
.
Lambda limite l'espace totale disponible pour l'ensemble de vos "functions" à 75Go. Aujourd'hui, on occupera ~6Mo par environnement, poids qui sera multiplier par le nombre de versions que vous déploierez, car AWS Lambda conserve les versions précédentes des packages.
1composer install --prefer-dist --optimize-autoloader --no-dev
Vous trouverez ici quelques recommendations pour déployer en production.
Si comme moi, vous supprimez une (ou plusieurs) de vos lambda fonction manuellement, pensez à supprimer la stack CloudFormation et le bucket S3 associés. Sinon, vous rencontrerez une erreur lors de vos prochains déploiements.
Bien, notre application est sur le cloud, comment l'interroger pour générer un QR Code via une application Laravel ?
Il faut se munir du SDK AWS.
1composer require aws/aws-sdk-php
On peut alors se connecter à la Lambda function comme suit puis invoquer la fonction.
1$lambda = new \Aws\Lambda\LambdaClient([ 2 'version' => 'latest', 3 'region' => 'eu-west-3', 4 'credentials' => [ 5 'key' => '<AWS_ACCESS_KEY_ID>', 6 'secret' => '<AWS_SECRET_ACCESS_KEY>', 7 ] 8]); 9 10$result = $lambda->invoke([11 'FunctionName' => 'lambda-qr-dev-qr',12 'InvocationType' => 'RequestResponse',13 'LogType' => 'None',14 'Payload' => json_encode([15 'text' => 'https://laravel-france.com',16 'correction' => 'L',17 'format' => 'png',18 'size' => 256,19 ]),20]);21 22$payloadContentAsJson = $result->get('Payload')->getContents();23$image = json_decode($payloadContentAsJson);24 25echo $image;
Même si Bref et AWS Lambda ne se limite pas à la mise en place de Lambda function, car ils permettent respectivement de déployer et héberger des applications web et console. Nous avons pu voir au travers de cet article comment déployer, très simplement avec Bref, un micro service dédié, facile à maintenir (tant le code que l'environnement d'exécution) et à tester, qui pourra "scale" sans effort.
L'image est générée et nous est retourné en base64, l'utilisation de cette image appartient maintenant à notre imaginaire (sauvegarde en base, sur S3, affichage etc...).
A lire
Autres articles de la même catégorie
Découvrez les secrets du verrou pessimiste avec Laravel 🔒
Découvrez comment un simple bug peut ruiner vos transactions !
Laravel Jutsu
Maîtrisez les relations belongs-to-many avec la méthode attach
Attardons nous sur les subtilités de la méthode attach
Mathieu De Gracia
Cast un attribut de modèle en DTO
Utilisons un DTO en tant qu’attribut afin de rendre notre code plus consistant et éviter les surprises !
William Suppo