Ce projet implémente une architecture serverless complète permettant de piloter dynamiquement des ressources d'infrastructure (instances EC2) sans passer par une console graphique, en utilisant uniquement des requêtes HTTP. L'ensemble de l'infrastructure AWS est émulé localement grâce à LocalStack au sein de GitHub Codespaces.
L'architecture repose sur la chaîne de liaison suivante :
- Client (HTTP Request) : Une requête POST contenant l'action souhaitée (
startoustop) et l'ID de la ressource cible est envoyée. - API Gateway : Réceptionne la requête HTTP sur la route
/ec2et la transmet de manière transparente à la fonction Lambda via une intégration de typeAWS_PROXY. - Fonction Lambda (Python 3.10) : Analyse le corps de la requête, utilise la bibliothèque
boto3configurée pour pointer vers l'environnement local, puis exécute l'ordre auprès du service EC2. - Service EC2 (Simulé) : Modifie l'état de l'instance cible et retourne le nouveau statut (
pending,stopping, etc.).
lambda_function.py: Code Python de la fonction Lambda gérant l'interaction avec le service EC2 viaboto3.deploy.sh: Script d'orchestration Bash automatisant la création complète de l'environnement (Nettoyage, Rôle IAM, Instance EC2, Lambda, API Gateway, Permissions et Déploiement).Makefile: Raccourcis pour automatiser les tâches courantes (make deploy,make test,make clean)..env_vars: Fichier généré automatiquement contenant les identifiants dynamiques (API_IDetINSTANCE_ID) pour faciliter les tests.
Dans le terminal de votre Codespace, lancez l'émulateur LocalStack :
localstack auth set-token <VOTRE_TOKEN_AUTH>
localstack start -d
Assurez-vous que l'AWS CLI est présent et configuré avec des identifiants fictifs pour LocalStack :
# Configuration des variables fictives obligatoires
aws configure set aws_access_key_id mock_key
aws configure set aws_secret_access_key mock_secret
aws configure set region us-east-1
aws configure set output json
Pour maximiser l'automatisation et éviter les erreurs de configuration manuelles, l'intégralité du déploiement est pilotée par un Makefile.
Exécutez la commande suivante à la racine du projet :
make deploy
Ce que fait ce script en arrière-plan :
- Supprime les anciennes ressources résiduelles pour éviter les conflits de nommage.
- Crée un rôle IAM fictif pour l'exécution de la Lambda.
- Instancie une image EC2 valide présente dans le catalogue local de LocalStack.
- Package et déploie le code de la fonction Lambda.
- Crée l'API Gateway, expose la ressource
/ec2avec la méthodePOST. - Crucial : Accorde les permissions explicites à l'API Gateway pour invoquer la fonction Lambda (
lambda:InvokeFunction). - Déploie l'API sur l'environnement de production (
prod).
Une fois le déploiement terminé, le script génère un fichier .env_vars. Chargez ces variables dans votre terminal actuel :
source .env_vars
Vous pouvez utiliser le raccourci du Makefile pour envoyer instantanément une requête de test :
make test
Pour arrêter l'instance EC2 :
curl -X POST http://localhost:4566/restapis/$API_ID/prod/_user_request_/ec2 \
-H "Content-Type: application/json" \
-d "{\"action\": \"stop\", \"instance_id\": \"$INSTANCE_ID\"}"
Réponse attendue : {"status": "success", "message": "Instance i-... is shutting down. Current state: stopping"}
Pour démarrer l'instance EC2 :
curl -X POST http://localhost:4566/restapis/$API_ID/prod/_user_request_/ec2 \
-H "Content-Type: application/json" \
-d "{\"action\": \"start\", \"instance_id\": \"$INSTANCE_ID\"}"
Réponse attendue : {"status": "success", "message": "Instance i-... is turning on. Current state: pending"}
Pour valider que l'action a bien impacté l'infrastructure simulée, interrogez directement le composant EC2 :
aws --endpoint-url=http://localhost:4566 ec2 describe-instances --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].State.Name'
Pour réinitialiser les fichiers intermédiaires générés lors des phases de tests :
make cleanlocalstack stopSi vous voulez une réinitialisation complète sans données résiduelles :
localstack rm -fmake cleanCette commande supprime :
lambda.zip(archive de la fonction Lambda).env_vars(fichier contenant API_ID et INSTANCE_ID)
Si vous souhaitez nettoyer complètement les environnements Python locaux :
rm -rf rep_localstack rep_localstack~Pour une réinitialisation entière de l'environnement en une seule commande :
localstack stop && localstack rm -f && make clean && rm -rf rep_localstack rep_localstack~Une fois l'environnement réinitialisé, pour relancer le projet :
# 1. Redémarrer LocalStack
localstack auth set-token <VOTRE_TOKEN_AUTH>
localstack start -d
# 2. Vérifier que LocalStack est prêt
sleep 10
# 3. Redéployer l'infrastructure
make deploy
# 4. Tester
source .env_vars
make test