DevPod sur AWS

DevPod sur AWS

Sources

Introduction 🚀

Dans cet article, je souhaite prĂ©senter un outil fantastique qui fait partie de la mĂȘme famille que GitPod et Codespaces : DevPod ! Il vous permet de crĂ©er des environnements de dĂ©veloppement sans effort — sans se retrouver bloquĂ© par un fournisseur. 🔒❌

DevPod est basĂ© sur l’architecture DevContainer et utilise les spĂ©cifications contenues dans un fichier devcontainer.json pour lancer votre environnement de dĂ©veloppement. Personnellement, je l’utilise pour dĂ©ployer rapidement des maquette rĂ©seau avec ContainerLab. đŸ’»đŸ§°

Qu’est-ce qu’un DevContainer ? đŸ€”

Un conteneur de dĂ©veloppement (souvent appelĂ© « dev container ») vous permet d’utiliser un conteneur comme un environnement de dĂ©veloppement complet. (Consultez la documentation officielle de containers.dev pour plus de dĂ©tails.)

Décomposons cela :

Avez-vous dĂ©jĂ  entendu l’expression « Ça marche sur ma machine » ? Si vous ĂȘtes dĂ©veloppeur, vous avez sans doute rencontrĂ© ce problĂšme en collaborant avec d’autres. Mais devinez quoi ? Les DevContainers rĂ©solvent le problĂšme de la dĂ©rive des environnements en fournissant des environnements Docker cohĂ©rents et reproductibles. Adieu les maux de tĂȘte liĂ©s Ă  l’installation ! đŸ’†â€â™€ïž

Avec les DevContainers, il vous suffit de :

  1. Un dossier .devcontainer dans votre projet.
  2. Un fichier devcontainer.json qui indique Ă  VS Code comment configurer le conteneur.
  3. Docker installé localement

La pierre angulaire du DevContainer est le fichier devcontainer.json. Par exemple :

{
  "name": "Python DevContainer",
  "image": "mcr.microsoft.com/devcontainers/python:3.10",
  "features": {
    "docker-in-docker": "latest"
  },
  "extensions": [
    "ms-python.python",
    "ms-azuretools.vscode-docker"
  ]
}

Que se passe-t-il ici ? đŸ•”ïžâ€â™€ïž

  • “image” – Cela utilise un environnement Python 3.10 prĂȘt Ă  l’emploi.
  • “features” – Cela ajoute la prise en charge de Docker dans le conteneur.
  • “extensions” – Installe des extensions utiles pour Python et Docker dans VS Code.

Les DevContainers sont formidables pour le dĂ©veloppement local, mais parfois vous avez besoin de plus de puissance — peut-ĂȘtre que vos charges de travail sont Ă©normes, ou que vous souhaitez exĂ©cuter des laboratoires spĂ©cialisĂ©s. C’est lĂ  qu’intervient DevPod. đŸ’Ș
Pour pouvoir déployer facilement des laboratoires sur le Cloud

Qu’est-ce que DevPod ? đŸ€–

DevPod est un outil open-source qui vous permet de lancer des environnements de dĂ©veloppement soit sur votre machine locale, soit dans le cloud de votre choix. Imaginez une version auto-hĂ©bergĂ©e et ultra-personnalisable de GitHub Codespaces. 🎉

Dans mes aventures quotidiennes en rĂ©seau, je dĂ©ploie des configurations basĂ©es sur ContainerLab avec des DevContainers sur AWS. Voyons comment vous pouvez utiliser DevPod pour faire exactement cela (les dĂ©tails sur ContainerLab suivront dans un autre article, promis !). 😜

Fournisseur AWS 🌐

DevPod utilise des Providers (fournisseurs), qui sont des modules de configuration dĂ©finissant oĂč et comment DevPod lance votre environnement. Voici la liste des fournisseurs :

Provider_list

Nous allons nous concentrer sur le Provider AWS — bien qu’il existe de nombreuses options de configuration :

Provider_list

Avant de paniquer devant tous ces rĂ©glages, ne vous inquiĂ©tez pas. Si vous ne faites que quelques expĂ©rimentations, les valeurs par dĂ©faut conviennent gĂ©nĂ©ralement. 🙌

Les avantages de l’open-source 🎁

Le fait que DevPod soit open-source signifie que vous pouvez jeter un Ɠil sous le capot pour voir exactement comment il fonctionne. Consultez le code AWS ici si vous ĂȘtes curieux.

Fonctionnement du code AWS

Examinons ce que fait DevPod sur AWS en regardant le code aws.go. À un niveau global, il gùre :

  1. Initialisation : Lecture de la configuration et mise en place des clients du SDK AWS (avec des identifiants personnalisés si nécessaire).
  2. Réseautage : Recherche ou création du sous-réseau, VPC et groupes de sécurité appropriés.
  3. SĂ©lection de l’AMI : Choix d’une AMI adaptĂ©e (par dĂ©faut, une image Ubuntu 22.04 rĂ©cente) et dĂ©termination du pĂ©riphĂ©rique racine.
  4. Configuration IAM : VĂ©rification qu’un rĂŽle d’instance appropriĂ© et un profil d’instance existent, avec les politiques associĂ©es.
  5. Cycle de vie de l’instance : CrĂ©ation, dĂ©marrage, arrĂȘt, vĂ©rification du statut et suppression des instances.
  6. Injection de donnĂ©es utilisateur : GĂ©nĂ©ration d’un script (encodĂ© en Base64) qui configure l’instance (ajoute des utilisateurs et des clĂ©s SSH) au premier dĂ©marrage.
  7. DNS optionnel : Gestion des enregistrements Route 53 pour l’instance si la configuration l’exige.

De mon point de vue, deux points se distinguent comme étant potentiellement les plus critiques :

  • (#4) Configuration IAM
  • (#6) Injection de donnĂ©es utilisateur

Pourquoi les points #4 et #6 sont-ils « délicats » ?

  • Configuration IAM est principalement gĂ©rĂ©e par la fonction CreateDevpodInstanceProfile. Elle crĂ©e un rĂŽle nommĂ© devpod-ec2-role qui peut effectuer les opĂ©rations suivantes :

    • OpĂ©rations EC2 : Par exemple, il peut dĂ©crire ou arrĂȘter des instances — en particulier l’instance qui lui est associĂ©e.
    • OpĂ©rations SSM : En attachant la politique AmazonSSMManagedInstanceCore, l’instance peut ĂȘtre gĂ©rĂ©e par AWS Systems Manager.
    • OpĂ©rations KMS (optionnel) : Si configurĂ©, il peut exĂ©cuter kms:Decrypt sur une clĂ© KMS spĂ©cifique, ce qui est utile pour gĂ©rer les donnĂ©es de session ou les secrets.
  • Injection de donnĂ©es utilisateur est essentiellement un script de dĂ©marrage insĂ©rĂ© dans l’instance sous forme de Base64. Ce script configure un utilisateur devpod avec des droits sudo, crĂ©e les dossiers SSH et insĂšre votre clĂ© publique dans le fichier appropriĂ©. Dans le code, cela ressemble Ă  :

    useradd devpod -d /home/devpod
    mkdir -p /home/devpod
    if grep -q sudo /etc/groups; then
      usermod -aG sudo devpod
    elif grep -q wheel /etc/groups; then
      usermod -aG wheel devpod
    fi
    
    echo "devpod ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/91-devpod
    mkdir -p /home/devpod/.ssh
    echo " + string(publicKey) + " >> /home/devpod/.ssh/authorized_keys
    chmod 0700 /home/devpod/.ssh
    chmod 0600 /home/devpod/.ssh/authorized_keys
    chown -R devpod:devpod /home/devpod

Comme DevPod est open-source, vous pouvez facilement vĂ©rifier par vous-mĂȘme. C’est un excellent outil d’apprentissage si vous souhaitez comprendre tous les rouages ! đŸ”©

RĂŽles et politiques IAM

Vous devrez créer un utilisateur IAM et lui attacher une politique IAM qui accorde juste assez de permissions pour DevPod. Par exemple :

  • Actions EC2 :
    • Description : ec2:DescribeSubnets, ec2:DescribeVpcs, ec2:DescribeImages, ec2:DescribeInstances, ec2:DescribeSecurityGroups
    • Gestion des instances : ec2:RunInstances, ec2:StartInstances, ec2:StopInstances, ec2:TerminateInstances, ec2:CancelSpotInstanceRequests
    • Groupes de sĂ©curitĂ© & Tags : ec2:CreateSecurityGroup, ec2:AuthorizeSecurityGroupIngress, ec2:CreateTags
  • Actions IAM :
    • iam:GetInstanceProfile, iam:CreateRole, iam:PutRolePolicy, iam:AttachRolePolicy, iam:CreateInstanceProfile, iam:AddRoleToInstanceProfile
  • Route 53 (optionnel) :
    • route53:ListHostedZones, route53:GetHostedZone, route53:ChangeResourceRecordSets

Configuration AWS đŸ—ïž

J’utilise gĂ©nĂ©ralement la console web AWS pour configurer cela, mais vous pouvez tout Ă  fait le faire via la CLI.

Étape 1 : Connectez-vous à la console AWS

  1. Rendez-vous sur AWS Management Console.
  2. Utilisez un compte disposant des droits appropriés pour créer des ressources IAM.

Étape 2 : CrĂ©er une politique IAM personnalisĂ©e

A. Accédez à la console IAM

  • Dans le menu AWS, trouvez IAM.

B. Créer une nouvelle politique

  1. Cliquez sur Policies dans le menu de gauche.
  2. Cliquez sur Create policy.

C. Passez Ă  l’onglet JSON

  • Collez quelque chose comme ceci, en ajustant si nĂ©cessaire :
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EC2Actions",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "ec2:DescribeImages",
        "ec2:DescribeInstances",
        "ec2:DescribeSecurityGroups",
        "ec2:RunInstances",
        "ec2:StartInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances",
        "ec2:CancelSpotInstanceRequests",
        "ec2:CreateSecurityGroup",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:CreateTags",
        "ec2:DeleteTags"
      ],
      "Resource": "*"
    },
    {
      "Sid": "IAMActions",
      "Effect": "Allow",
      "Action": [
        "iam:GetInstanceProfile",
        "iam:CreateRole",
        "iam:PutRolePolicy",
        "iam:AttachRolePolicy",
        "iam:CreateInstanceProfile",
        "iam:AddRoleToInstanceProfile"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Route53Actions",
      "Effect": "Allow",
      "Action": [
        "route53:ListHostedZones",
        "route53:GetHostedZone",
        "route53:ChangeResourceRecordSets"
      ],
      "Resource": "*"
    }
  ]
}
  • Cliquez sur Next (les tags sont optionnels), puis sur Next: Review.

D. Vérifier et créer

  1. Nommez-la DevpodToolPolicy (ou comme vous le souhaitez).
  2. Ajoutez une description facultative.
  3. Cliquez sur Create policy.

Étape 3 : CrĂ©er ou mettre Ă  jour l’utilisateur IAM

A. Créer un nouvel utilisateur (si nécessaire)

  1. Cliquez sur Users dans IAM.
  2. Cliquez sur Add user.
  3. Donnez-lui un nom (par exemple, devpod-tool-user).
  4. Choisissez Programmatic access si vous souhaitez un accĂšs via la CLI. đŸ€–
  5. Cliquez sur Next.

B. Attacher votre nouvelle politique

  1. Sur la page des permissions, choisissez Attach policies directly.
  2. Cochez DevpodToolPolicy.
  3. Cliquez sur Create.
  4. Et voilĂ  !

Étape 4 : VĂ©rifier et c’est fini

Retournez dans Users → devpod-tool-user → Permissions pour confirmer que DevpodToolPolicy est bien attachĂ©e. ✅

Étape 5 : Utilisez ces identifiants

  • Si vous avez créé un utilisateur programmatique, n’oubliez pas de noter l’Access Key ID et le Secret Access Key.

devpod_user_sumup

Bonus : Notez votre ID VPC (dans la section VPC sur AWS). Vous en aurez besoin lors de la configuration de DevPod.

Configurer DevPod đŸ› ïž

1. Configurer le profil AWS

aws configure --profile Devpod

Lorsqu’on vous le demande :

  1. L’Access Key ID
  2. Le Secret Access Key
  3. La région par défaut (par exemple, eu-west-1)
  4. Le format de sortie (je le laisse généralement vide)

2. Ajouter le profil Ă  DevPod

  1. Dans DevPod, créez un nouveau provider et choisissez AWS.
  2. Sélectionnez la région AWS (par exemple, eu-west-1).
  3. Développez les options AWS.
  4. Taille du disque AWS : par exemple, 40 GB pour commencer.
  5. Type d’instance : par exemple, t2.small.
  6. Profil AWS : sélectionnez Devpod (ou le nom que vous avez choisi).
  7. ID VPC AWS : ajoutez votre VPC.
  8. Vous pouvez laisser le reste par défaut.

Cliquez sur Add Provider.

added_new_provider

Tester un dĂ©ploiement đŸ§Ș

Déployer

Nous allons effectuer un test rapide en utilisant l’une des images Docker prĂ©construites :

  1. Rendez-vous dans Workspaces dans DevPod.
  2. Cliquez sur Create Workspace.
  3. Choisissez votre nouveau provider AWS.
  4. Choisissez votre IDE préféré (VS Code, etc.).
  5. À droite, sĂ©lectionnez un exemple de dĂ©marrage rapide (par exemple, Python). 🐍
  6. Cliquez sur Create Workspace.

new_worspace

Attendez quelques instants, et votre environnement basĂ© sur le cloud apparaĂźtra dans VS Code. 🎊

vscode

ArrĂȘter

Lorsque vous n’utilisez pas l’environnement, cliquez sur Stop pour Ă©teindre l’instance EC2. Vous ne paierez que pour le stockage — aucun temps de calcul. IdĂ©al pour votre portefeuille. 💰

Stopped Instance

Supprimer

Supprimer le workspace supprime toutes les ressources AWS associĂ©es Ă  cet environnement, vous ne paierez donc pas un centime. Mais vous devrez redĂ©ployer si vous souhaitez l’utiliser Ă  nouveau. ♻

Delete Instance

Conclusion 💡

En combinant DevContainers et DevPod sur AWS, vous pouvez crĂ©er des environnements de dĂ©veloppement flexibles et autogĂ©rĂ©s qui Ă©voluent avec votre croissance — sans ĂȘtre enfermĂ© dans des plateformes spĂ©cifiques Ă  un fournisseur. Dites adieu aux problĂšmes du « Ça marche sur ma machine ! » et accueillez un codage sans friction. 🚀✹

Amusez-vous bien ! 🎉