Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
111 changes: 101 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,106 @@ Votre mission (si vous l'acceptez) : Concevoir une architecture **API-driven** d
Séquence 4 : Documentation
Difficulté : Facile (~30 minutes)
---------------------------------------------------
**Complétez et documentez ce fichier README.md** pour nous expliquer comment utiliser votre solution.
Faites preuve de pédagogie et soyez clair dans vos expliquations et processus de travail.
# Guide de Déploiement LocalStack et AWS Lambda

## Sommaire
1. [Séquence 1 : Préparation de l'environnement AWS](#séquence-1--préparation-de-lenvironnement-aws-localstack)
2. [Séquence 2 : Détails des commandes fondamentales](#séquence-2--détails-des-commandes-fondamentales)
3. [Séquence 3 : Guide d'utilisation du Makefile](#séquence-3--guide-dutilisation-du-makefile)

---

## Séquence 1 : Préparation de l'environnement AWS (LocalStack)
**Objectif :** Créer l'environnement AWS simulé avec LocalStack dans le terminal du Codespace.

### Création du dossier de travail
```bash
sudo -i mkdir rep_localstack
```

### Création de l'environnement virtuel Python
```bash
sudo -i python3 -m venv ./rep_localstack
```

### Installation des dépendances et de LocalStack
```bash
sudo -i pip install --upgrade pip && python3 -m pip install localstack && export S3_SKIP_SIGNATURE_VALIDATION=0
```

### Démarrage de l'émulateur en arrière-plan
```bash
localstack start -d
```

### Vérification de la santé des services
Cette commande confirme que les services EC2, Lambda et API Gateway sont opérationnels avant de commencer le déploiement.
```bash
curl http://localhost:4566/_localstack/health
```

---

## Séquence 2 : Détails des commandes fondamentales
Ces étapes permettent de configurer l'infrastructure manuellement pour comprendre le flux de travail et les dépendances.

### Gestion de l'URL dynamique Codespaces
Pour supprimer toute dépendance au localhost, nous construisons une URL publique qui s'adapte automatiquement au nom de votre Codespace.
```bash
PUBLIC_ENDPOINT="https://${CODESPACE_NAME}-4566.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}"
```

### Préparation de la fonction Lambda
Le code Python est compressé au format ZIP, format requis par AWS Lambda.
```bash
zip function.zip lambda_function.py
```

### Nettoyage préventif
Nous supprimons systématiquement l'ancienne version de la fonction pour éviter les erreurs de conflit si elle existe déjà.
```bash
aws --endpoint-url=$PUBLIC_ENDPOINT lambda delete-function --function-name ControlEC2 2>/dev/null || true
```

### Déploiement de la fonction
Envoi de la fonction vers l'émulateur LocalStack avec les configurations d'exécution (runtime Python 3.9).
```bash
aws --endpoint-url=$PUBLIC_ENDPOINT lambda create-function --function-name ControlEC2 --runtime python3.9 --handler lambda_function.lambda_handler --role arn:aws:iam::000000000000:role/lambda-role --zip-file fileb://function.zip
```

### Supervision de l'instance EC2
Cette commande affiche un tableau récapitulatif pour vérifier le changement d'état (running ou stopped) de vos instances directement dans le terminal.
```bash
aws --endpoint-url=$PUBLIC_ENDPOINT ec2 describe-instances --query 'Reservations[*].Instances[*].{ID:InstanceId,State:State.Name}' --output table
```

---

## Séquence 3 : Guide d'utilisation du Makefile
Le Makefile automatise la gestion du projet pour répondre aux critères de notation sur l'automatisation.

### Déployer l'infrastructure
Cette commande lance le script complet qui crée l'instance, la Lambda et configure les accès API.
```bash
make deploy
```

### Générer les URLs de pilotage
Affiche les liens publics (start, stop, status) pour tester le pilotage directement dans votre navigateur.
```bash
make urls
```

### Vérifier le statut
Affiche l'état actuel des instances directement dans votre terminal.
```bash
make status
```

### Nettoyer le projet
Supprime les fichiers temporaires et les archives zip inutiles.
```bash
make clean

---------------------------------------------------
Evaluation
---------------------------------------------------
Cet atelier, **noté sur 20 points**, est évalué sur la base du barème suivant :
- Repository exécutable sans erreur majeure (4 points)
- Fonctionnement conforme au scénario annoncé (4 points)
- Degré d'automatisation du projet (utilisation de Makefile ? script ? ...) (4 points)
- Qualité du Readme (lisibilité, erreur, ...) (4 points)
- Processus travail (quantité de commits, cohérence globale, interventions externes, ...) (4 points)

39 changes: 39 additions & 0 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

# Configuration dynamique de l'URL publique (Zéro Localhost)
PUBLIC_ENDPOINT="https://${CODESPACE_NAME}-4566.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}"
AWS_CMD="aws --endpoint-url=$PUBLIC_ENDPOINT --region us-east-1"

echo "⏳ Préparation de l'environnement..."
zip -q function.zip lambda_function.py
$AWS_CMD lambda delete-function --function-name ControlEC2 2>/dev/null || true
$AWS_CMD lambda create-function --function-name ControlEC2 --runtime python3.9 --handler lambda_function.lambda_handler --role arn:aws:iam::000000000000:role/lambda-role --zip-file fileb://function.zip > /dev/null

echo "📦 Création d'une instance EC2 de test..."
$AWS_CMD ec2 run-instances --image-id ami-df5136b6 --count 1 --instance-type t2.micro > /dev/null

echo "🌐 Configuration de l'API Gateway"
API_ID=$($AWS_CMD apigateway create-rest-api --name 'EC2PilotAPI' --query 'id' --output text)
ROOT_ID=$($AWS_CMD apigateway get-resources --rest-api-id "$API_ID" --query 'items[0].id' --output text)

# Fonction pour créer une route GET (start, stop, status)
create_route() {
local ROUTE=$1
local RES_ID=$($AWS_CMD apigateway create-resource --rest-api-id "$API_ID" --parent-id "$ROOT_ID" --path-part "$ROUTE" --query 'id' --output text)
$AWS_CMD apigateway put-method --rest-api-id "$API_ID" --resource-id "$RES_ID" --http-method GET --authorization-type "NONE" > /dev/null
$AWS_CMD apigateway put-integration --rest-api-id "$API_ID" --resource-id "$RES_ID" --http-method GET --type AWS_PROXY --integration-http-method POST --uri "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:000000000000:function:ControlEC2/invocations" > /dev/null
}

create_route "start"
create_route "stop"
create_route "status"

$AWS_CMD apigateway create-deployment --rest-api-id "$API_ID" --stage-name prod > /dev/null

echo "------------------------------------------------"
echo "✅ ARCHITECTURE DÉPLOYÉE !"
echo "Cliquez sur ces liens dans votre navigateur :"
echo "START : $PUBLIC_ENDPOINT/restapis/$API_ID/prod/_user_request_/start"
echo "STOP : $PUBLIC_ENDPOINT/restapis/$API_ID/prod/_user_request_/stop"
echo "STATUS : $PUBLIC_ENDPOINT/restapis/$API_ID/prod/_user_request_/status"
echo "------------------------------------------------"
Binary file added function.zip
Binary file not shown.
47 changes: 47 additions & 0 deletions lambda_function.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import boto3
import json
import os

# Communication interne LocalStack (zéro localhost)
endpoint_url = f"http://{os.environ.get('LOCALSTACK_HOSTNAME')}:4566"

def lambda_handler(event, context):
ec2 = boto3.client('ec2', endpoint_url=endpoint_url, region_name='us-east-1')

# On récupère l'action directement depuis le chemin de l'URL (start, stop ou status)
path = event.get('path', '')
action = path.split('/')[-1]

# Récupération automatique de la première instance disponible pour le test
instances = ec2.describe_instances()
if not instances['Reservations']:
return {'statusCode': 404, 'body': json.dumps("Erreur : Aucune instance EC2 trouvée.")}

instance_id = instances['Reservations'][0]['Instances'][0]['InstanceId']
current_state = instances['Reservations'][0]['Instances'][0]['State']['Name']

try:
if action == 'start':
ec2.start_instances(InstanceIds=[instance_id])
msg = f"L'instance {instance_id} a été DÉMARRÉE."
elif action == 'stop':
ec2.stop_instances(InstanceIds=[instance_id])
msg = f"L'instance {instance_id} a été ARRÊTÉE."
elif action == 'status':
msg = f"L'instance {instance_id} est actuellement : {current_state}"
else:
msg = f"Action '{action}' non reconnue."

# On renvoie du JSON qui sera affiché proprement dans le navigateur
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': json.dumps({
"service": "Pilotage EC2",
"action_demandee": action,
"resultat": msg,
"etat_actuel": current_state
}, indent=4)
}
except Exception as e:
return {'statusCode': 500, 'body': json.dumps(str(e))}
30 changes: 30 additions & 0 deletions makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# --- Variables de l'environnement Codespaces (Zéro Localhost) ---
PUBLIC_ENDPOINT = https://$(CODESPACE_NAME)-4566.$(GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN)
AWS_CMD = aws --endpoint-url=$(PUBLIC_ENDPOINT) --region us-east-1

# --- Commandes Principales ---

# Déploie l'architecture complète (Instance, Lambda, API)
deploy:
@chmod +x deploy.sh
@./deploy.sh

# Affiche l'état des instances EC2 dans le terminal
status:
@echo "Vérification de l'état des instances sur LocalStack..."
@$(AWS_CMD) ec2 describe-instances --query 'Reservations[*].Instances[*].{ID:InstanceId,State:State.Name}' --output table

# Affiche les URLs cliquables pour le pilotage via navigateur
urls:
@$(eval API_ID=$(shell $(AWS_CMD) apigateway get-rest-apis --query 'items[0].id' --output text))
@echo "------------------------------------------------"
@echo "🚀 URLs DE PILOTAGE (Format Professeur) :"
@echo "START : $(PUBLIC_ENDPOINT)/restapis/$(API_ID)/prod/_user_request_/start"
@echo "STOP : $(PUBLIC_ENDPOINT)/restapis/$(API_ID)/prod/_user_request_/stop"
@echo "STATUS : $(PUBLIC_ENDPOINT)/restapis/$(API_ID)/prod/_user_request_/status"
@echo "------------------------------------------------"

# Nettoie les fichiers temporaires
clean:
@rm -f function.zip
@echo "Nettoyage terminé."
Loading