Pourquoi Deployer Laravel sur AWS ?
L'Amazon Web Services (AWS) est la plus grande plateforme cloud mondialement, offrant une variété de services et d'outils puissants pour développer, déployer et gérer des applications web. En tant que développeur Laravel senior avec 10+ ans d'expérience, vous savez qu'un déploiement sur AWS peut offrir plusieurs avantages :
- Elasticité : AWS permet de gérer l'échelle dynamique de votre application en ajoutant ou en retirant des instances de serveurs.
- Haute disponibilité : En utilisant les services AWS comme EC2, RDS et S3, vous pouvez assurer la disponibilité élevée et la tolérance aux pannes.
- Sécurité : AWS offre une série d'outils et de services pour protéger vos applications contre les menaces en ligne.
Un cas concret serait le déploiement d'une application web de gestion de projet, où vous avez besoin d'un système capable de gérer des milliers de projets par jour. Avec AWS, vous pouvez facilement augmenter ou diminuer la capacité de votre serveur en fonction du volume de travail.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
- Connaissances : Laravel, PHP, Nginx, Composer, Git.
- Outils à installer :
- Node.js (pour les outils d'administration)
- AWS CLI
- Composer
- Git
Concepts fondamentaux
1. EC2 Instance
L'Instance EC2 est la base de l'hébergement sur AWS. Vous pouvez choisir une image Linux pour votre serveur et installer tout ce dont vous avez besoin.
## Créer une instance EC2 via AWS CLI
aws ec2 run-instances --image-id ami-0c55b159cbfafe1f0 --count 1 --instance-type t2.micro --key-name mon-key-pair
2. RDS (Relational Database Service)
AWS RDS vous permet de gérer des bases de données relationnelles directement dans le cloud.
## Créer une base de données RDS via AWS CLI
aws rds create-db-instance --db-instance-identifier mon-db-instance --allocated-storage 20 --instance-class db.t2.micro --engine mysql --master-username admin --master-user-password password
3. S3 (Simple Storage Service)
S3 est un service d'objets stockage de masse, idéal pour stocker des fichiers statiques.
## Créer un bucket S3 via AWS CLI
aws s3 mb s3://mon-bucket
Mise en pratique : Projet fil rouge
Nous allons créer une application de gestion de tâches simple. Voici les étapes :
1. Initialisation du projet
## Créer un nouveau projet Laravel
composer create-project --prefer-dist laravel/laravel task-manager
## Naviguer dans le répertoire du projet
cd task-manager
2. Configuration de la base de données
Modifier les paramètres de connexion à la base de données dans .env :
DB_CONNECTION=mysql
DB_HOST=mon-db-instance.c9i3qj8z67xw.us-east-1.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=task_manager
DB_USERNAME=admin
DB_PASSWORD=password
3. Création d'une migration pour la table des tâches
php artisan make:migration create_tasks_table --create=tasks
Editer database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php :
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTasksTable extends Migration
{
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description')->nullable();
$table->boolean('completed')->default(false);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('tasks');
}
}
4. Migration et seeding des données
php artisan migrate
## Créer une fabrique pour les tâches
php artisan make:factory TaskFactory --model=Task
## Remplir la base de données avec du seed
php artisan make:seeder TasksTableSeeder
## Editer `database/seeders/TasksTableSeeder.php`
use App\Models\Task;
use Illuminate\Database\Seeder;
class TasksTableSeeder extends Seeder
{
public function run()
{
Task::factory(50)->create();
}
}
## Exécuter le seeder
php artisan db:seed --class=TasksTableSeeder
5. Création d'un contrôleur pour les tâches
php artisan make:controller TaskController
Editer app/Http/Controllers/TaskController.php :
namespace App\Http\Controllers;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
public function index()
{
$tasks = Task::all();
return view('tasks.index', compact('tasks'));
}
public function create()
{
return view('tasks.create');
}
public function store(Request $request)
{
Task::create($request->all());
return redirect()->route('tasks.index')->with('success', 'Tâche créée avec succès.');
}
public function show(Task $task)
{
return view('tasks.show', compact('task'));
}
}
6. Création des vues
Créer les fichiers de vue dans resources/views/tasks :
index.blade.phpcreate.blade.phpshow.blade.php
7. Configuration du routeur
Editer routes/web.php :
use App\Http\Controllers\TaskController;
Route::resource('tasks', TaskController::class);
8. Déploiement sur AWS
8.1 Configurer la machine EC2
Connectez-vous à votre instance EC2 via SSH et installez les dépendances nécessaires :
## Installer Nginx, PHP, Composer et Git
sudo apt update
sudo apt install nginx php-fpm php-mysql composer git
## Configurer Nginx pour Laravel
sudo nano /etc/nginx/sites-available/task-manager
server {
listen 80;
server_name yourdomain.com;
root /var/www/html/task-manager/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Ajustez la version de PHP si nécessaire
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
## Activer le site et redémarrer Nginx
sudo ln -s /etc/nginx/sites-available/task-manager /etc/nginx/sites-enabled/
sudo systemctl restart nginx
## Installer les dépendances de Composer
cd /var/www/html/task-manager
composer install --no-dev --optimize-autoloader
## Créer un lien symbolique pour le public
ln -s /var/www/html/task-manager/public /var/www/html/task-manager/public_html
8.2 Déploiement via Git
## Sur votre machine locale, ajouter une remote AWS dans votre dépôt Git
git remote add aws ec2-user@your-ec2-ip:/var/www/html/task-manager
## Pusher les modifications sur AWS
git push aws master
Erreurs frequentes et debugging
1. Accès refusé à la base de données
Message d'erreur :
PDOException in Connector.php line 58: SQLSTATE[28000] [1045] Access denied for user 'admin'@'your-ec2-ip' (using password: YES)
Code incorrect :
DB_PASSWORD=password
Code correct :
DB_PASSWORD=your-password
2. Erreur de configuration Nginx
Message d'erreur :
nginx: [emerg] open() "/var/www/html/task-manager/storage/logs/laravel.log" failed (13: Permission denied)
Code incorrect :
sudo chown -R www-data:www-data /var/www/html/task-manager/storage/logs
Code correct :
sudo chown -R ec2-user:ec2-user /var/www/html/task-manager/storage/logs
3. Erreur de connexion à la base de données
Message d'erreur :
SQLSTATE[HY000] [2002] No such file or directory
Code incorrect :
DB_HOST=localhost
Code correct :
DB_HOST=your-db-instance.c9i3qj8z67xw.us-east-1.rds.amazonaws.com
Pour aller plus loin
1. Utilisation d'AWS Elastic Beanstalk
Elastic Beanstalk simplifie le déploiement et l'échelle automatique des applications web.
2. Configuration de CloudFront pour un accès rapide
CloudFront est un service de distribution de contenu en streaming à travers le monde.
3. Sécurité des données avec AWS Secrets Manager
Secrets Manager permet de stocker et gérer les secrets d'application de manière sécurisée.
Défi pratique : Créez une application API RESTful utilisant Laravel qui utilise un service AWS (comme S3 ou RDS) pour stocker et récupérer des données. Assurez-vous que l'application est déployée sur AWS EC2 et accédez à elle via Internet.