Elastic Beanstalk : déployer une app
À la fin de ce tutoriel, vous créerez une application Elastic Beanstalk, déploierez une version Hello World (Flask / Python 3.12 sur Amazon Linux 2023) en environnement single instance, testerez le CNAME HTTP, pousserez une nouvelle version, puis terminerez l’environnement et supprimerez l’application — en
ca-central-1, profillab.Niveau : Intermédiaire · Temps estimé : 60–75 min · Versions testées : Elastic Beanstalk 2026, Python 3.12 AL2023, AWS CLI v2 · Dernière vérification : 2026-09-10 · Region :
ca-central-1Slug draft :
aws-elastic-beanstalk· Slug live :aws-beanstalk-5(WP #1298) · Série : AWS Solutions Architect · Mot-clé SEO : Elastic BeanstalkPublish : HOLD · Absorbe / enrichit : live EN thin
/aws-beanstalk-5/(PHP Sample Application)← Précédent : CloudFormation · → Suivant : ECS Fargate · Hub : Démarrer avec AWS
Prérequis
- Profil AWS CLI
labavec droits Elastic Beanstalk, EC2, S3 (bundles), IAM (rôles de service Beanstalk déjà présents ou créables) - AWS CLI v2,
zip, Python 3 local pour le zip source - Budget d’alerte : Beanstalk facture surtout l’EC2 (+ EBS) ; en single instance pas d’ELB — terminate vite
- Notions EC2 / SG et un premier contact IaC (CloudFormation)
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
Vérifiez l’identité lab — jamais un compte de production.
Ce que nous allons construire
Client ──HTTP──► CNAME *.elasticbeanstalk.com
│
▼
Env Beanstalk (single instance)
├── EC2 t3.micro (AL2023 / Python 3.12)
├── Platform + health checks
└── Application Version (ZIP S3)
│
▼
Flask Hello World (port 8000 via plateforme)
(Schéma — alt : « Client HTTP vers CNAME Beanstalk, environnement single instance EC2 Python 3.12 AL2023 et version ZIP ».)
Beanstalk est un PaaS : vous fournissez le code (ZIP), AWS provisionne et opère EC2, sécurité de base, plateforme et health. Pour le lab on reste en single instance (pas de load balancer) afin de limiter le coût.
Étape 1 — PaaS vs EC2 nu vs Lambda / ECS
| Approche | Quand ça a du sens | Limites |
|---|---|---|
| EC2 nu | Contrôle total AMI, agent, réseau | Ops à votre charge (patch, scaling, deploy) |
| Elastic Beanstalk | App web classique (Flask/Django/Node) vite en prod « gérée » | Moins flexible qu’ECS ; plateformes imposées |
| Lambda | API events, scale à zéro | Timeout, packing, pas de process long |
| ECS Fargate | Conteneurs, microservices, contrôle du runtime | Plus de concepts (task, service, ALB) |
Beanstalk a encore du sens en 2026 pour : POC / PME, équipes qui veulent un pipeline de déploiement sans orchestrer des conteneurs, et pour l’examen SA (connaître Application / Environment / Platform / Version). Dès que vous avez besoin de multi-services, sidecars ou images custom fines → ECS Fargate.
Étape 2 — Concepts Beanstalk
| Concept | Rôle |
|---|---|
| Application | Conteneur logique (nom) qui regroupe versions et environnements |
| Environment | Déploiement concret (EC2, SG, CNAME, health) — ex. lab-eb-env |
| Platform | Stack OS + runtime — ici Python 3.12 running on 64bit Amazon Linux 2023 |
| Version | Label + source bundle (ZIP dans S3) déployable sur un env |
Un environnement pointe vers une version à la fois. Mettre à jour = créer une nouvelle version puis update-environment. Option DX : la EB CLI (eb init, eb create --single, eb deploy) encapsule ces appels ; ce lab privilégie AWS CLI + ZIP pour moins de friction d’install.
Contenu d’origine conservé (live aws-beanstalk-5)
Le live (WP #1298, slug aws-beanstalk-5) proposait un déploiement console PHP Sample Application. On conserve ce parcours ; le lab CLI principal reste Flask / Python 3.12.
Variante console — PHP Sample (origine)
- Console →
ca-central-1→ Elastic Beanstalk → Create application. - Application name :
MyApp(oulab-eb-php). - Platform : PHP (AL2023 si proposé).
- Application code : Sample application (pas de ZIP custom).
- Create → attendre Ready / Health Ok.
- Ouvrir l’Application URL (
*.elasticbeanstalk.com) : la page PHP sample confirme le déploiement.
En lab, gardez single instance (pas d’ALB) même en console. Le CLI Flask (ZIP, versions) reste le chemin principal. Le titre EN « Serverless … Beanstalk » est imprécis : Beanstalk = PaaS (EC2 ± ELB), pas Lambda.
Étape 3 — ZIP Hello World (Flask)
Créez un dossier de lab et deux fichiers (aucun secret) :
mkdir -p ~/lab-eb && cd ~/lab-eb
application.py (entrée attendue par la plateforme Python Beanstalk) :
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello():
return "Hello from Elastic Beanstalk labn"
if __name__ == "__main__":
application.run(host="0.0.0.0", port=8000)
requirements.txt :
Flask==3.0.3
Empaquetez (fichiers à la racine du ZIP) :
zip -q lab-eb-v1.zip application.py requirements.txt
Étape 4 — Application, version S3, environnement single instance
Récupérez un solution stack Python 3.12 AL2023 à jour, créez l’app, uploadez le ZIP, puis l’environnement :
APP=lab-eb-app
ENV=lab-eb-env
BUCKET="lab-eb-${ACCOUNT_ID:=$(aws sts get-caller-identity --query Account --output text)}-ca"
STACK=$(aws elasticbeanstalk list-available-solution-stacks
--query "SolutionStacks[?contains(@, 'Python 3.12') && contains(@, 'Amazon Linux 2023')]|[0]"
--output text)
echo "Platform: $STACK"
aws s3 mb "s3://$BUCKET" --region ca-central-1 2>/dev/null || true
aws s3 cp lab-eb-v1.zip "s3://$BUCKET/lab-eb-v1.zip"
aws elasticbeanstalk create-application
--application-name "$APP"
--description "Lab Beanstalk devopselastichayway"
aws elasticbeanstalk create-application-version
--application-name "$APP"
--version-label v1
--source-bundle S3Bucket="$BUCKET",S3Key=lab-eb-v1.zip
# Single instance = pas d'ELB (économie lab)
aws elasticbeanstalk create-environment
--application-name "$APP"
--environment-name "$ENV"
--solution-stack-name "$STACK"
--version-label v1
--option-settings
Namespace=aws:elasticbeanstalk:environment,OptionName=EnvironmentType,Value=SingleInstance
Namespace=aws:autoscaling:launchconfiguration,OptionName=InstanceType,Value=t3.micro
Namespace=aws:autoscaling:launchconfiguration,OptionName=IamInstanceProfile,Value=aws-elasticbeanstalk-ec2-role
Si le profil d’instance aws-elasticbeanstalk-ec2-role n’existe pas encore, créez-le une fois via la console Beanstalk (« Create service role ») ou IAM (trust ec2.amazonaws.com + politiques managed Beanstalk) — hors détail de ce lab.
Attendez le statut Ready :
aws elasticbeanstalk wait environment-updated --environment-names "$ENV"
# ou boucle :
aws elasticbeanstalk describe-environments --environment-names "$ENV"
--query 'Environments[0].{Status:Status,Health:Health,CNAME:CNAME}'
La création peut prendre 5–15 minutes (EC2 + plateforme + health).
Étape 5 — Health, CNAME et test HTTP
CNAME=$(aws elasticbeanstalk describe-environments --environment-names "$ENV"
--query 'Environments[0].CNAME' --output text)
echo "http://$CNAME/"
curl -sS "http://$CNAME/"
Health Green / Ok = instance joignable et app répond. En single instance le CNAME pointe directement vers l’IP publique de l’EC2 (pas d’ALB). Ouvrez aussi l’onglet Health / Events en console pour lire les messages de déploiement.
Étape 6 — Déployer une nouvelle version
Modifiez le message dans application.py, recréez un ZIP et déployez :
# après édition du return "Hello v2 from Beanstalk labn"
zip -q lab-eb-v2.zip application.py requirements.txt
aws s3 cp lab-eb-v2.zip "s3://$BUCKET/lab-eb-v2.zip"
aws elasticbeanstalk create-application-version
--application-name "$APP"
--version-label v2
--source-bundle S3Bucket="$BUCKET",S3Key=lab-eb-v2.zip
aws elasticbeanstalk update-environment
--environment-name "$ENV"
--version-label v2
aws elasticbeanstalk wait environment-updated --environment-names "$ENV"
curl -sS "http://$CNAME/"
Alternative DX : eb deploy après eb init -p "Python 3.12 running on 64bit Amazon Linux 2023" et eb create --single — utile au quotidien, mais la CLI AWS reste le chemin exam / CI explicite.
Étape 7 — Coûts (single instance)
| Élément | Lab single instance |
|---|---|
EC2 t3.micro |
Facturé à l’heure (Free Tier si éligible / compte) |
| EBS root | Quelques Go gp3 |
| ELB / ALB | Absent grâce à SingleInstance |
| Beanstalk API | Gratuit |
| Bucket S3 des ZIP | Quasi négligeable |
Un env load-balanced ajoute un ALB (~ tarif horaire) : évitez-le pour ce lab. Terminate dès la vérif — une EC2 oubliée le week-end coûte plus que le tutoriel.
Étape 8 — Comparaison courte pour la suite du cours
| Outil | Rôle dans la série |
|---|---|
| CloudFormation | IaC déclaratif des ressources (Beanstalk peut être une ressource CFN) |
| SAM | Spécialisé serverless (Lambda) au-dessus de CFN |
| Beanstalk | PaaS app web ZIP → plateforme gérée |
| ECS Fargate | Conteneurs sans gérer les EC2 — suite naturelle Module H |
Pour l’examen : Beanstalk ≠ serverless ; vous payez l’infra sous-jacente. Choisissez Beanstalk pour simplicité d’app monolithique ; ECS/EKS pour orchestration ; Lambda pour fonctions.
Vérification
aws elasticbeanstalk describe-environments --environment-names "$ENV"
--query 'Environments[0].{Status:Status,Health:Health,Version:VersionLabel,Tier:Tier.Name}'
aws elasticbeanstalk describe-application-versions --application-name "$APP"
--query 'ApplicationVersions[].VersionLabel'
curl -sS -o /dev/null -w "%{http_code}n" "http://$CNAME/"
Checklist : Status Ready · Health Green · v2 déployée · HTTP 200 · plan de nettoyage prêt.
Nettoyage (obligatoire)
aws elasticbeanstalk terminate-environment --environment-name "$ENV"
aws elasticbeanstalk wait environment-terminated --environment-names "$ENV"
aws elasticbeanstalk delete-application
--application-name "$APP"
--terminate-env-by-force
aws s3 rb "s3://$BUCKET" --force
Sans terminate-environment, l’EC2 continue de facturer. Vérifiez ensuite qu’aucune instance aws:elasticbeanstalk:environment-name ne reste dans EC2.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
Env Degraded / Red |
App crash, mauvais entrypoint | Logs Beanstalk / CloudWatch ; fichier application.py + Flask |
IamInstanceProfile invalide |
Rôle EC2 Beanstalk absent | Créer aws-elasticbeanstalk-ec2-role |
| Timeout create | Plateforme / SG / quotas | Events describe-events ; attendre ou recreate |
| 502 / pas de réponse | Health check trop tôt | Attendre Ready ; vérifier SG HTTP 80 |
| Coût surprise | Env load-balanced oublié | Toujours SingleInstance en lab + terminate |
| Sample PHP Red / confusion « serverless » | Health trop tôt ou stub EN | Attendre Ready ; Beanstalk = PaaS ≠ Lambda |
Debug utile : aws elasticbeanstalk describe-events --environment-name "$ENV" --max-items 15.
Quiz (5 questions)
1. En lab Free Tier / budget serré, on crée un environnement Beanstalk :
– A. Load-balanced multi-AZ avec ALB
– B. Single instance (EnvironmentType=SingleInstance)
– C. Toujours avec NAT Gateway dédiée
2. Une application version Beanstalk, c’est surtout :
– A. Une AMI EC2 figée
– B. Un label + source bundle (ZIP) déployable
– C. Un cluster EKS
3. Fin de lab correcte :
– A. Arrêter l’EC2 à la main seulement
– B. terminate-environment puis delete-application
– C. Laisser le CNAME public une semaine
4. Le stub live aws-beanstalk-5 déploie une Sample Application en :
– A. Uniquement Lambda
– B. PHP (Sample Code) via Create Application console
– C. Uniquement Terraform obligatoire
5. Beanstalk pour l’examen Solutions Architect est surtout :
– A. Un service serverless gratuit sans EC2
– B. Un PaaS (Application / Environment / Platform / Version) qui facture l’infra sous-jacente
– C. Un équivalent strict d’EKS
Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B
Pour aller plus loin
- Elastic Beanstalk Developer Guide
- Python platform on AL2023
- EB CLI (option DX)
- create-environment (AWS CLI)
Maillage série AWS (P1)
| ← Précédent | CloudFormation : premier stack |
| → Suivant | ECS Fargate |
| Aussi | Lambda + API Gateway · Démarrer avec AWS |
Retour parcours AWS — hub de la série et leçons sœurs.



