Vous souhaitez nous soutenir ? Devenez sponsor de l'association sur notre page Github
Tutoriels

Déployer vos applications serverless avec Bref.sh

Antoine Benevaut avatar
Publié le 23 janvier 2025
Couverture de l'article 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-bridge
2php 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.

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: aws
3 runtime: provided.al2
4 region: eu-west-3

Parmi les runtimes disponibles, deux seulement peuvent nous intéresser avec Bref, provided.al2 et provided.al2023

On précise ensuite la liste de nos plugins, ici Bref et le gestionnaires d'extensions PHP.

1plugins:
2 - ./vendor/bref/bref
3 - ./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.php
5 runtime: php-83
6 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 deployment
2package:
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 install
2serverless 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