À la fin de ce tutoriel, vous saurez versionner un .devcontainer/devcontainer.json, Reopen in Container (VS Code / Cursor), distinguer Dev Container local, Remote SSH et Codespaces, et dérouler un lab (local + EC2 t3.micro optionnelle en ca-central-1) sans secrets dans Git.

Niveau : Intermédiaire · Temps estimé : 55–75 min · Versions cibles : Dev Containers spec 2026 · VS Code / Cursor Remote – Containers · Remote – SSH · Docker Engine 27+ · AWS CLI v2 · Dernière vérification : 2026-09-11 · Region : ca-central-1

Slug : wow-devcontainers-remote · Série : WOW (41/50) · Mot-clé SEO : dev containers · Publish : HOLD

← Précédent : Nix flakes et devshells · → Suivant : Homelab k3s · Aussi : Platform Engineering 2026

Prérequis

Coût estimé : 0 € en lab local (image mcr.microsoft.com). Variante EC2 t3.micro Ubuntu ca-central-1 : 0–1 € si Free Tier / quelques heures puis terminate. Pas de NAT, EBS > 8 Go, EIP oubliée.

export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity

Ce que nous allons construire

Dev Containers + Remote SSH (WOW 41/50) — ca-central-1
  ├── Pourquoi : parity local/CI, onboarding, « works on my machine »
  ├── .devcontainer/devcontainer.json (image, features, ports, postCreate)
  ├── Comparatif : local vs Remote SSH vs GitHub Codespaces
  ├── Pattern équipe : repo + SSH bastion/lab EC2 (profil lab)
  ├── Lab : (1) repo + base:ubuntu + features docker/awscli/gh
  │         (2) Reopen in Container
  │         (3) Remote SSH t3.micro Ubuntu + Docker
  │         (4) cleanup terminate
  └── Quiz + FAQ + maillage WOW

(Schéma — alt : « VS Code/Cursor ouvre un Dev Container versionné ; option Remote SSH vers EC2 lab ca-central-1 ».)

Étape 1 — Pourquoi des Dev Containers en 2026 ?

« Works on my machine » : Python 3.11 vs 3.12, AWS CLI v1 vs v2, Compose manquant, droits Docker divergents. La CI (ubuntu-latest) n’est pas votre laptop. L’onboarding SRE devient deux jours de brew install.

Un Dev Container (spec containers.dev ; VS Code, Cursor, Codespaces, DevPod) décrit l’environnement dans le dépôt : image, features, ports, postCreateCommand, extensions. Cloner + Reopen in Container = même shell et mêmes versions.

C’est l’inner loop du golden path plateforme. Les devshells Nix visent la même reproductibilité ; en 2026 beaucoup d’équipes combinent Nix (binaires) et Dev Container (Docker, AWS CLI, IDE).

Pression Réponse
Onboarding devcontainer.json + Reopen
Parité local / CI Même image / features que le job
Drift laptop Ubuntu de base, pas « mon macOS »
Outils AWS / gh / docker Features officielles

Étape 2 — Anatomie de devcontainer.json

Fichier canonique : .devcontainer/devcontainer.json.

Clé Rôle
image Base mcr.microsoft.com/devcontainers/base:ubuntu
features Modules officiels (docker, aws-cli, github-cli)
forwardPorts Ports locaux (ex. 8080)
postCreateCommand Après le premier build (deps, vérifs)
remoteUser Non-root (vscode)
customizations.vscode.extensions Extensions dans le conteneur

Les features évitent un Dockerfile maison. Docker-in-Docker (DiD) va au laptop ; sur t3.micro, préférez docker-outside-of-docker (DooD) — Installer Docker Engine.

Jamais de secrets (AWS_SECRET_ACCESS_KEY, jetons gh, PEM) dans le JSON, un devcontainer.env commité, ou un postCreateCommand. Montez ~/.aws en lecture si besoin, sinon OIDC / SSM. Clés SSH hors repo.

Étape 3 — Local vs Remote SSH vs Codespaces

Trois modes, un contrat (le JSON) :

Mode Workspace Usage Piège
Dev Container local Docker laptop Quotidien RAM ; DiD lourd
Remote SSH VM / bastion / EC2 lab VPC, poste verrouillé SSH 0.0.0.0/0 ; PEM dans Git
Codespaces VM GitHub Zéro Docker local Idle payant ; région ≠ ca-central-1

Remote – SSH pose un serveur d’éditeur sur l’hôte distant. Vous pouvez ensuite Reopen in Container là-bas si Docker est installé : pattern laptop mince + lab EC2.

Codespaces lit le même fichier. Utile sans Docker Desktop ; DEH ancre le lab en ca-central-1 (IAM, VPC, FinOps). Ne mélangez pas un Codespaces us-east-1 et des rôles ca-central-1.

Étape 4 — Pattern équipe : repo + bastion / EC2 lab

  1. Un .devcontainer/ à la racine (ou un JSON par sous-projet).
  2. Image officielle + features pinées (:2, :1).
  3. README : Reopen + versions (docker version, aws --version).
  4. Distant : SSH vers bastion / EC2 lab ca-central-1 (profil lab), SG /32 ou SSM Session Managerpas de 22 public.
  5. AWS hors Git ; CI en OIDC.

Le bastion est un compute éphémère (Owner, Env=lab), pas un coffre à secrets. Suite homelab : wow-homelab-k3s.

Étape 5 — Lab reproductible

Mini-repo (docker + aws + gh) en conteneur, puis Remote SSH sur t3.micro Ubuntu.

5.1 — Scaffold local

mkdir -p wow-devcontainers-lab/.devcontainer
cd wow-devcontainers-lab && git init

.devcontainer/devcontainer.json :

{
  "name": "DEH DevOps lab",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers/features/docker-in-docker:2": { "moby": true },
    "ghcr.io/devcontainers/features/aws-cli:1": {},
    "ghcr.io/devcontainers/features/github-cli:1": {}
  },
  "forwardPorts": [8080],
  "postCreateCommand": "aws --version && gh --version && docker version",
  "remoteUser": "vscode"
}
printf '%sn' '.env' '*.pem' 'id_rsa*' '.aws/' > .gitignore
echo "# lab WOW 41 — pas de secrets" > README.md
git add . && git commit -m "chore: devcontainer lab DEH"

5.2 — Reopen in Container

  1. Ouvrez le dossier dans VS Code ou Cursor.
  2. Palette → Dev Containers: Reopen in Container.
  3. Attendez le pull base:ubuntu et les features.
  4. Terminal :
whoami          # vscode
aws --version   # aws-cli/2.x
gh --version
docker version  # client + engine (DiD)

Si Docker échoue : daemon hôte (installer-docker-engine). Laptop léger : feature docker-outside-of-docker:1 à la place de DiD.

5.3 — Variante Remote SSH (EC2 t3.micro, optionnel)

Pas de SSH 0.0.0.0/0. SG : votre /32 ou SSM only.

export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
# AMI Ubuntu 24.04 : aws ec2 describe-images --owners 099720109477 --filters Name=name,Values=ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*
aws ec2 run-instances --image-id ami-XXXXXXXX --instance-type t3.micro 
  --iam-instance-profile Name=lab-ec2-profile 
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=deh-devcontainer-lab},{Key=Owner,Value=lab},{Key=Env,Value=lab}]' 
  --count 1

Installez Docker sur l’Ubuntu (user-data ou SSM) — installer-docker-engine. Puis :

  • Shell : aws ssm start-session --target i-… (SSM).
  • IDE : Remote – SSH (IP privée / bastion) ou ProxyCommand + document AWS-StartSSHSession. Clonez le repo sur l’instance, Reopen in Container si Docker est prêt.

t3.micro (1 Go) est juste pour DiD : DooD + une session IDE, puis terminate.

5.4 — Cleanup terminate

IID=$(aws ec2 describe-instances --filters Name=tag:Name,Values=deh-devcontainer-lab 
  Name=instance-state-name,Values=running,stopped,pending 
  --query 'Reservations[].Instances[].InstanceId' --output text)
aws ec2 terminate-instances --instance-ids $IID
docker rmi mcr.microsoft.com/devcontainers/base:ubuntu 2>/dev/null || true

Pas d’EBS orphelin ni d’EIP. Local : Reopen Folder Locally.

Étape 6 — Checklist, sécurité, anti-patterns

Règle DEH Détail
Pas de secrets Git Ni PEM, ni .env, ni AWS_SECRET_* dans postCreateCommand
Clés SSH hors repo ~/.ssh/, agent, SSM — jamais id_rsa commité
SSM d’abord Instance profile ; 22 public = anti-pattern
Region ca-central-1 + profil lab
Destruction terminate + docker rmi fin de lab
Features pinées docker-in-docker:2, bump par PR

Anti-patterns : image latest individuelle ; 12 README d’install contradictoires ; Codespaces idle ; bastion root partagé ; ~/.aws monté en écriture ; t3.micro laissé running.

Erreurs fréquentes

Erreur Impact Correction
Daemon Docker down Reopen échoue Démarrer Engine / Desktop
DiD sur t3.micro OOM DooD, puis terminate
Port 22 ouvert au monde Scan SG /32 ou SSM only
Secrets dans le JSON Fuite Git .gitignore + OIDC
Region us-east-1 Drift IAM AWS_DEFAULT_REGION=ca-central-1
Features non pinées Build non repro Maj explicite

Quiz (5 questions)

1. Un Dev Container vise surtout à : – A. Remplacer Kubernetes
– B. Versionner l’environnement de dev (parity, onboarding)
– C. Facturer Codespaces

2. postCreateCommand sert à : – A. Stocker des secrets AWS
– B. Exécuter des commandes après création du conteneur
– C. Ouvrir le port 22

3. Remote SSH vs Dev Container local : – A. SSH : IDE sur l’hôte distant ; local : Docker du laptop
– B. Identique
– C. SSH interdit Docker

4. Region lab DEH : – A. us-east-1
– B. ca-central-1
– C. eu-west-3

5. Accès EC2 lab préféré : – A. SSH 0.0.0.0/0
– B. SSM Session Manager (et/ou SSH restreint / ProxyCommand SSM)
– C. PEM dans le dépôt

Réponses : 1‑B · 2‑B · 3‑A · 4‑B · 5‑B

FAQ

Dev Container = Dockerfile de prod ?

Non. Inner loop (outils, IDE, CLI). La prod reste un Dockerfile durci. Pas de user vscode ni DiD en production.

Faut-il Nix et un Dev Container ?

Complémentaires. Nix devshells : toolchains sans daemon. Dev Container : Docker + AWS CLI + extensions identiques pour l’équipe.

Cursor lit-il devcontainer.json ?

Oui (Dev Containers / Remote – Containers). C’est un contrat d’éditeur, pas un lock-in VS Code. Vérifiez features et customizations.

Pourquoi pas uniquement Codespaces ?

Même JSON, zéro Docker local. DEH lab = ca-central-1. Codespaces idle = facture ; l’EC2 aussi — terminate.

Comment coller la CI au Dev Container ?

Même image / features dans le job (ou devcontainer up). Objectif : aws --version laptop = Actions. Pas de secrets ; OIDC.

SSM remplace-t-il Remote SSH ?

Pour le shell, oui (Session Manager). Pour l’IDE, Remote SSH via SSM (AWS-StartSSHSession) sans 22 public — pattern 2026.

Pour aller plus loin

Maillage série WOW

← Précédent Nix flakes et devshells
→ Suivant Homelab k3s
Aussi Platform Engineering · Docker Engine · Dockerfile · Compose v2

Meta publication (SEO)

  • Title SEO : Dev Containers + Remote SSH : environnements d’équipe 2026 (guide FR)
  • Meta description : Dev Containers VS Code/Cursor + Remote SSH : parity local/CI, onboarding, lab EC2 ca-central-1. FAQ, quiz et check-list DEH.
  • Focus keyword : dev containers
  • Secondary : remote ssh, devcontainer.json, vscode remote containers, codespaces, ca-central-1
  • Image : assets/web/devopelastichayway/cover-wow-devcontainers-remote-1200x630.webp (à générer)
  • Catégorie : WOW / Inner loop · Niveau : Intermédiaire
  • URL cible : https://devopelastichayway.com/tutoriels/wow-devcontainers-remote/
  • Post live : N/A (nouveau) · slug wow-devcontainers-remote · Publish : HOLD (draft only — feu vert Maître requis)

← Catalogue Tutoriels

Pour aller plus loin — hubs live

Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.