EC2 : lancer une instance, Security Group et SSM
À la fin de ce tutoriel, vous aurez une instance EC2 Free Tier joignable sans ouvrir SSH sur 0.0.0.0/0, via SSM Session Manager, avec un Security Group minimal et le rôle IAM du tuto précédent.
Niveau : Débutant · Temps estimé : 60–70 min · Versions testées : EC2 Console 2026, Amazon Linux 2023, AWS CLI v2, SSM Agent préinstallé · Dernière vérification : 2026-09-11 · Region lab :
ca-central-1← Précédent : IAM AWS · Hub : Démarrer avec AWS
Publish : HOLD
Prérequis
- Compte lab +
admin-lab+ CLI profillab(Démarrer avec AWS) - Rôle
lab-ec2-role+ instance profilelab-ec2-profile(IAM) - Region de lab fixe :
ca-central-1(Canada — Centre) - Budget d’alerte actif (Billing → Budgets)
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
# PowerShell : $env:AWS_PROFILE='lab'; $env:AWS_DEFAULT_REGION='ca-central-1'
Coût estimé lab (ca-central-1, 2026) :
| Ressource | Ordre de grandeur | Remarque |
|---|---|---|
t3.micro / t2.micro |
~0 € Free Tier (750 h/mois, 12 premiers mois) | Hors Free Tier ≈ 0,01–0,015 USD/h |
| Stockage root 8 Go gp3 | Inclus / cents | Surveillez volumes orphelins |
| Session Manager | Gratuit pour le shell | Logs CloudWatch optionnels = coût |
| Elastic IP non associée | Facturée | Ne pas créer sauf besoin explicite |
Terminez l’instance après le lab. Une IP Elastic oubliée ou une instance laissée running = facture.
Ce que nous allons construire
VPC par défaut (lab rapide) — ca-central-1
├── Security Group sg-lab-web
│ ├── Ingress : aucun SSH public (0.0.0.0/0:22 interdit)
│ └── Egress : HTTPS 443 (SSM endpoints / dnf / yum)
├── Instance EC2 Amazon Linux 2023 (t3.micro)
│ ├── IAM instance profile : lab-ec2-profile
│ └── SSM Session Manager (shell console / CLI)
└── (Option) règle SSH limitée à VOTRE IP /32 seulement
(Schéma Excalidraw — alt : « EC2 + SG sans SSH public + SSM ».)
Pourquoi SSM plutôt que SSH ouvert ? Moins de surface d’attaque, pas de gestion de .pem sur le laptop, audit CloudTrail des sessions — pattern recommandé en 2026 pour les labs et la prod. Piège fréquent : lancer l’EC2 sans instance profile, puis découvrir que Session Manager reste gris. Attachez lab-ec2-profile à la création (ou attachez-le ensuite, puis attendez le refresh agent).
Étape 1 — Vérifier le Free Tier et le type d’instance
Dans ca-central-1 :
- Console EC2 → Instance types : cherchez
t3.micro(out2.microsit3indisponible en Free Tier dans votre compte). - AMI : Amazon Linux 2023 (SSM Agent inclus — pas d’install manuelle).
CLI utile :
aws ec2 describe-instance-types
--filters Name=free-tier-eligible,Values=true
--query 'InstanceTypes[].InstanceType'
--output text
--region ca-central-1
--profile lab
Étape 2 — Security Group minimal
Créer le SG
VPC_ID=$(aws ec2 describe-vpcs
--filters Name=isDefault,Values=true
--query 'Vpcs[0].VpcId' --output text
--region ca-central-1 --profile lab)
SG_ID=$(aws ec2 create-security-group
--group-name sg-lab-web
--description "Lab EC2 SSM - no public SSH"
--vpc-id "$VPC_ID"
--region ca-central-1 --profile lab
--query 'GroupId' --output text)
echo "SG créé : $SG_ID"
Notez le GroupId (sg-…). Si le nom existe déjà : InvalidGroup.Duplicate — réutilisez l’existant ou changez le nom.
Par défaut, egress autorise tout (0.0.0.0/0). Pour un lab simple, laissez l’egress all. Ingress : n’ajoutez pas encore SSH. SSM n’a pas besoin d’une règle ingress 22 : l’agent initie des connexions sortantes HTTPS vers les endpoints Systems Manager.
Vérifier l’absence de SSH public
aws ec2 describe-security-groups
--group-ids "$SG_ID"
--region ca-central-1 --profile lab
--query 'SecurityGroups[0].IpPermissions'
Le résultat doit être [] (ou sans FromPort=22 vers 0.0.0.0/0).
(Option) SSH depuis votre IP uniquement
Si vous tenez au .pem :
MY_IP=$(curl -s https://checkip.amazonaws.com)
# sous PowerShell : (Invoke-RestMethod https://checkip.amazonaws.com)
aws ec2 authorize-security-group-ingress
--group-id "$SG_ID"
--protocol tcp --port 22
--cidr "${MY_IP}/32"
--region ca-central-1 --profile lab
Jamais 0.0.0.0/0 sur le port 22 pour un lab durable. Votre IP change (box/4G) → timeout SSH ; d’où l’intérêt de SSM.
Étape 3 — Lancer l’instance (console)
- EC2 → Instances → Launch instances.
- Name :
lab-ec2-01. - AMI : Amazon Linux 2023.
- Instance type :
t3.micro(Free Tier). - Key pair : Proceed without a key pair si vous utilisez uniquement SSM ; sinon créez/sélectionnez une clé et stockez le
.pemhors Git. - Network : VPC par défaut, subnet public (auto-assign public IP = Enable) — nécessaire pour atteindre les endpoints SSM sans VPC endpoints privés.
- Firewall : Select existing →
sg-lab-web. - Advanced → IAM instance profile :
lab-ec2-profile(critique pour SSM). - Storage : 8 Go gp3 suffisent ; chiffrement root activé si proposé.
- Launch.
Attendez Instance state = Running et Status check = 2/2 (system + instance). Comptez 1–3 minutes avant que l’agent SSM soit Online.
Étape 4 — Même chose en CLI (reproductible)
Récupérez l’AMI Amazon Linux 2023 de ca-central-1 :
AMI_ID=$(aws ssm get-parameters
--names /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
--query 'Parameters[0].Value' --output text
--region ca-central-1 --profile lab)
echo "$AMI_ID"
Lancement :
INSTANCE_ID=$(aws ec2 run-instances
--image-id "$AMI_ID"
--instance-type t3.micro
--security-group-ids "$SG_ID"
--iam-instance-profile Name=lab-ec2-profile
--count 1
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=lab-ec2-01}]'
--region ca-central-1
--profile lab
--query 'Instances[0].InstanceId' --output text)
echo "Instance : $INSTANCE_ID"
(Ajoutez --key-name VOTRE_KEY seulement si SSH optionnel. Ajoutez --associate-public-ip-address si le subnet ne l’assigne pas par défaut.)
Attendre le running + checks :
aws ec2 wait instance-running --instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
aws ec2 wait instance-status-ok --instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
Étape 5 — Droits SSM sur le rôle (si Session Manager refuse)
Le rôle lab-ec2-role avait surtout S3 en démo. Pour SSM, attachez la politique gérée :
aws iam attach-role-policy
--role-name lab-ec2-role
--policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
--profile lab
Vérifiez les politiques attachées :
aws iam list-attached-role-policies
--role-name lab-ec2-role
--profile lab
Attendez 1–2 minutes que l’instance apparaisse comme Managed instance (Systems Manager → Fleet Manager), ou :
aws ssm describe-instance-information
--region ca-central-1 --profile lab
--query 'InstanceInformationList[].{Id:InstanceId,Ping:PingStatus,Agent:AgentVersion}'
PingStatus doit être Online. Si la liste est vide : instance profile manquant, egress bloqué, ou Region incorrecte.
Étape 6 — Ouvrir un shell via Session Manager
Console
EC2 → instance lab-ec2-01 → Connect → onglet Session Manager → Connect.
CLI (plugin Session Manager requis sur le laptop)
aws ssm start-session
--target "$INSTANCE_ID"
--region ca-central-1
--profile lab
Dans la session :
uname -a
# IMDSv2 (Amazon Linux 2023 — n’utilisez plus IMDSv1 en lab propre)
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token"
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -s -H "X-aws-ec2-metadata-token: $TOKEN"
http://169.254.169.254/latest/meta-data/instance-id
Vous êtes bien sur l’instance, sans port 22 public. Optionnel : vérifier le rôle via IMDS (…/meta-data/iam/security-credentials/).
Étape 7 — Vérification
| Check | Commande / lieu | Attendu |
|---|---|---|
| État instance | describe-instances |
State running |
| SG | describe-security-groups |
Pas de 0.0.0.0/0:22 |
| Instance profile | console / IamInstanceProfile |
lab-ec2-profile |
| Agent SSM | describe-instance-information |
Online |
| Shell | start-session |
Prompt interactif |
| Metadata rôle | curl IMDS ci-dessus | Nom du rôle visible |
aws ec2 describe-instances
--instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
--query 'Reservations[0].Instances[0].{State:State.Name,Profile:IamInstanceProfile.Arn,SG:SecurityGroups[0].GroupId,PublicIp:PublicIpAddress}'
Nettoyage (obligatoire)
aws ec2 terminate-instances
--instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
aws ec2 wait instance-terminated
--instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
- Ne créez une Elastic IP que si le prochain lab l’exige ; sinon évitez.
- Le SG
sg-lab-webpeut rester pour le tuto EBS/EFS/ALB, ou être supprimé :
aws ec2 delete-security-group --group-id "$SG_ID"
--region ca-central-1 --profile lab
(Suppression impossible tant qu’une ENI/instance l’utilise — attendez la terminaison.)
Contrôle anti-facture :
aws ec2 describe-instances
--filters Name=instance-state-name,Values=running,pending,stopping
--region ca-central-1 --profile lab
--query 'Reservations[].Instances[].InstanceId'
# doit être vide (ou seulement vos labs volontaires)
Erreurs fréquentes
| Symptôme | Cause probable | Correction |
|---|---|---|
| Session Manager gris / indisponible | Manque AmazonSSMManagedInstanceCore ou pas d’instance profile |
Attacher policy + profile ; reboot soft / attendre 2 min |
TargetNotConnected |
Agent offline ; subnet privé sans endpoints SSM ; pas d’IP publique | Attendre boot ; activer public IP ou VPC endpoints ssm, ssmmessages, ec2messages |
UnauthorizedOperation sur run-instances |
User sans droit EC2 | Revenir sur groupe lab-admins / politiques IAM |
| Facture surprise | Instance laissée on + EIP orpheline | terminate-instances + release-address |
| SSH timeout | SG sans votre /32 ou IP publique changée |
Préférer SSM ; sinon MAJ règle SG avec nouvelle IP |
| Liste SSM vide alors que Running | Mauvaise Region CLI vs console | Forcer --region ca-central-1 partout |
InvalidGroup.Duplicate |
SG sg-lab-web déjà créé |
describe-security-groups et réutiliser l’ID |
Lab bonus (5 min) — tags et stop/start
aws ec2 create-tags --resources "$INSTANCE_ID"
--tags Key=Project,Value=lab Key=Owner,Value=admin-lab
--region ca-central-1 --profile lab
aws ec2 stop-instances --instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
# Horloge EC2 s’arrête ; EBS continue. Puis start + re-vérifier PingStatus Online.
aws ec2 start-instances --instance-ids "$INSTANCE_ID"
--region ca-central-1 --profile lab
Après stop/start, l’IP publique change (sauf EIP). SSM cible toujours l’InstanceId — avantage vs SSH sur IP fixe.
Quiz (5 questions)
1. Quel est l’intérêt principal de Session Manager pour un lab EC2 ?
– A. Remplacer CloudWatch
– B. Administrer l’instance sans exposer SSH à Internet
– C. Augmenter automatiquement la taille du disque
2. Une règle SG TCP 22 depuis 0.0.0.0/0 signifie :
– A. SSH seulement depuis AWS
– B. SSH ouvert à tout Internet
– C. SSH désactivé
3. Pourquoi attacher AmazonSSMManagedInstanceCore au rôle d’instance ?
– A. Pour facturer SSM
– B. Pour autoriser l’agent SSM à parler aux endpoints Systems Manager
– C. Pour ouvrir le port 22
4. En ca-central-1, vous lancez une EC2 sans IP publique, sans VPC endpoints SSM. Que se passe-t-il le plus souvent ?
– A. SSM fonctionne quand même via le DNS public
– B. L’agent ne peut pas joindre SSM → TargetNotConnected
– C. Le Security Group ouvre automatiquement le port 443 ingress
5. Après un stop puis start (sans EIP), quelle affirmation est vraie ?
– A. L’InstanceId change toujours
– B. L’IP publique peut changer ; SSM cible toujours l’InstanceId
– C. Le volume EBS root est effacé
Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B
Pour aller plus loin
Maillage série AWS (P1)
| ← Précédent | IAM |
| → Suivant | EBS volumes & snapshots |
| Aussi | EFS · VPC fondations · ALB |
Retour parcours AWS — hub de la série et leçons sœurs.



