Développer pour le cloud dans le cloud : développement BigData avec Docker dans AWS

Publié: 2022-03-11

Pourquoi en avez-vous besoin ?

Je suis développeur et je travaille quotidiennement dans des Environnements de Développement Intégrés (IDE), comme Intellij IDEA ou Eclipse. Ces IDE sont des applications de bureau. Depuis l'avènement de Google Documents, j'ai vu de plus en plus de personnes déplacer leur travail des versions de bureau de Word ou Excel vers le cloud en utilisant un équivalent en ligne d'un traitement de texte ou d'un tableur.

Il existe des raisons évidentes d'utiliser un cloud pour conserver votre travail. Aujourd'hui, par rapport aux applications métier de bureau traditionnelles, certaines applications Web ne présentent pas de désavantage significatif en termes de fonctionnalités. Le contenu est disponible partout où il y a un navigateur Web, et de nos jours, c'est presque partout. La collaboration et le partage sont plus faciles et la perte de fichiers est moins probable.

Malheureusement, ces avantages du cloud ne sont pas aussi courants dans le monde du développement logiciel que pour les applications métier. Il existe quelques tentatives pour fournir un IDE en ligne, mais elles sont loin d'être proches des IDE traditionnels.

C'est un paradoxe; alors que nous sommes toujours liés à notre bureau pour le codage quotidien, le logiciel est désormais généré sur plusieurs serveurs. Les développeurs doivent travailler avec des éléments qu'ils ne peuvent plus conserver sur leur ordinateur. En effet, les ordinateurs portables n'augmentent plus leur puissance de traitement ; avoir plus de 16 Go de RAM sur un ordinateur portable est rare et cher, et les appareils plus récents, les tablettes par exemple, en ont encore moins.

Cependant, même s'il n'est pas encore possible de remplacer les applications de bureau classiques pour le développement de logiciels, il est possible de déplacer l'ensemble de votre bureau de développement vers le cloud . Le jour où je m'en suis rendu compte qu'il n'était plus nécessaire d'avoir tous mes logiciels sur mon portable, et constatant la disponibilité de version web des terminaux et VNC, j'ai tout migré vers le cloud. Finalement, j'ai développé un kit de construction pour créer cet environnement de manière automatisée.

Développeur dans le cloud

Qu'est-ce que le cloud pour un développeur ? Evoluer là-dedans, bien sûr !
Tweeter

Dans cet article, je présente un ensemble de scripts pour créer un environnement de développement basé sur le cloud pour les applications Scala et Big Data, fonctionnant avec Docker dans Amazon AWS et comprenant un bureau accessible sur le Web avec IntelliJ IDE, Spark, Hadoop et Zeppelin en tant que services. , ainsi que des outils de ligne de commande tels que SSH, SBT et Ammonite basés sur le Web. Le kit est disponible gratuitement sur GitHub, et je décris ici la marche à suivre pour l'utiliser pour construire votre instance. Vous pouvez créer votre environnement et le personnaliser selon vos besoins particuliers. Cela ne devrait pas vous prendre plus de 10 minutes pour le faire fonctionner.

Que contient le « BigDataDevKit » ?

Mon objectif principal en développant le kit était que mon environnement de développement soit quelque chose que je puisse simplement lancer, avec tous les services et serveurs avec lesquels je travaille, puis les détruire lorsqu'ils ne sont plus nécessaires. Ceci est particulièrement important lorsque vous travaillez sur différents projets, dont certains impliquent un grand nombre de serveurs et de services, comme lorsque vous travaillez sur des projets Big Data.

Mon environnement cloud idéal devrait :

  • Incluez tous les outils de développement habituels, surtout un IDE graphique.
  • Avoir les serveurs et les services dont j'ai besoin à portée de main.
  • Soyez facile et rapide à créer à partir de zéro, et extensible pour ajouter plus de services.
  • Être entièrement accessible en utilisant uniquement un navigateur Web.
  • En option, autorisez l'accès avec des clients spécialisés (client VNC et client SSH).

En tirant parti de l'infrastructure et des logiciels cloud modernes, de la puissance des navigateurs modernes, de la disponibilité généralisée du haut débit et du précieux Docker, j'ai créé un environnement de développement pour Scala et le développement de données volumineuses qui, pour le mieux, a remplacé mon ordinateur portable de développement.

Actuellement, je peux travailler à tout moment, que ce soit depuis un MacBook Pro, une Surface Tablet, ou même un iPad (avec un clavier), bien qu'il soit vrai que la dernière option n'est pas idéale. Tous ces appareils ne sont que des clients ; le bureau et tous les serveurs sont dans le cloud.

Docker et AmazonAWS !

Mon environnement actuel est construit à l'aide des services en ligne suivants :

  • Amazon Web Services pour les serveurs.
  • GitHub pour stocker le code.
  • Dropbox pour enregistrer les fichiers.

J'utilise également quelques services gratuits, comme DuckDns pour les adresses IP dynamiques et Let's encrypt pour obtenir un certificat SSL gratuit.

Dans cet environnement, j'ai actuellement :

  • Un bureau graphique avec Intellij idea, accessible via un navigateur web.
  • Outils de ligne de commande accessibles sur le Web comme SBT et Ammonite.
  • Hadoop pour stocker des fichiers et exécuter des tâches MapReduce.
  • Spark Job Server pour les tâches planifiées.
  • Zeppelin pour un ordinateur portable basé sur le Web.

Plus important encore, l'accès Web est entièrement crypté avec HTTPS, à la fois pour VNC et SSH basés sur le Web, et il existe plusieurs protections pour éviter de perdre des données, une préoccupation qui est, bien sûr, importante lorsque vous ne « possédez » pas le contenu sur votre disque dur physique. Notez que l'obtention d'une copie de tout votre travail sur votre ordinateur est automatique et très rapide. Si vous perdez tout parce que quelqu'un a volé votre mot de passe, vous en avez quand même une copie sur votre ordinateur, tant que vous avez tout configuré correctement.

Utilisation d'un environnement de développement basé sur le Web avec AWS et Docker

Commençons maintenant par décrire le fonctionnement de l'environnement. Lorsque je commence à travailler le matin, la première chose à faire est de me connecter à la console Amazon Web Services où je vois toutes mes instances. Habituellement, j'ai de nombreuses instances de développement configurées pour différents projets, et je garde celles qui ne sont pas utilisées désactivées pour économiser la facturation. Après tout, je ne peux travailler que sur un projet à la fois. (Eh bien, parfois je travaille sur deux.)

Écran 1

Alors, je sélectionne l'instance que je veux, je la lance, j'attends un peu ou je vais prendre un café. Ce n'est pas si différent d'allumer votre ordinateur. Il faut généralement quelques secondes pour que l'instance soit opérationnelle. Une fois que je vois l'icône verte, j'ouvre un navigateur, et je vais sur une URL bien connue : https://msciab.duckdns.org/vnc.html . Remarque, ceci est mon URL ; lorsque vous créez un kit, vous créez votre URL unique.

Étant donné qu'AWS attribue une nouvelle adresse IP à chaque machine lorsque vous démarrez, j'ai configuré un service DNS dynamique, afin que vous puissiez toujours utiliser la même URL pour accéder à votre serveur, même si vous l'arrêtez et le redémarrez. Vous pouvez même le mettre en signet dans votre navigateur. De plus, j'utilise HTTPS, avec des clés valides pour obtenir une protection totale de mon travail contre les renifleurs, au cas où j'aurais besoin de gérer des mots de passe et d'autres données sensibles.

Écran 2

Une fois chargé, le système vous accueillera avec un client Web Web VNC, NoVNC. Connectez-vous simplement et un bureau apparaît. J'utilise un bureau minimal, intentionnellement, juste un menu avec des applications, et mon seul luxe est un bureau virtuel (puisque j'ouvre beaucoup de fenêtres quand je développe). Pour le courrier, je compte toujours sur d'autres applications, aujourd'hui principalement sur d'autres onglets de navigateur.

Dans la machine virtuelle, j'ai ce dont j'ai besoin pour développer des applications Big Data. Tout d'abord, il y a un IDE. Dans la construction, j'utilise l'édition communautaire IntelliJ Idea. En outre, il existe l'outil de construction SBT et un Scala REPL, Ammonite.

Écran 3

Cependant, les principales caractéristiques de cet environnement sont les services déployés en tant que conteneurs dans la même machine virtuelle. En particulier, j'ai :

  • Zeppelin, le cahier web pour utiliser du code Scala à la volée et faire de l'analyse de données ( http://zeppelin:8080 )
  • Le Spark Job Server, pour exécuter et déployer des travaux Spark avec une interface Rest ( http://sparkjobserver:8080 ).
  • Une instance de Hadoop pour stocker et récupérer des données du HDFS ( http://hadoop:50070 ).

Notez que ces URL sont fixes mais sont accessibles dans l'environnement virtuel. Vous pouvez voir leurs interfaces Web dans la capture d'écran suivante.

Écran 4

Chaque service s'exécute dans un conteneur Docker distinct. Sans devenir trop technique, vous pouvez considérer cela comme trois serveurs distincts à l'intérieur de votre machine virtuelle. La beauté de l'utilisation de Docker est que vous pouvez ajouter des services, et même ajouter deux ou trois machines virtuelles. À l'aide de conteneurs Amazon, vous pouvez facilement faire évoluer votre environnement.

Enfin, vous disposez d'un terminal Web. Accédez simplement à votre URL en HTTPS et vous serez accueilli avec un terminal dans une page web.

Écran 5

Dans la capture d'écran ci-dessus, vous pouvez voir que je liste les conteneurs, qui sont les trois serveurs plus le bureau. Ce shell de ligne de commande vous donne accès à la machine virtuelle contenant les conteneurs, vous permettant de les gérer. C'est comme si vos serveurs étaient "dans la matrice" (virtualisés dans des conteneurs), mais ce shell vous donne une échappatoire en dehors de la "matrice" pour gérer les serveurs et le bureau. À partir de là, vous pouvez redémarrer les conteneurs, accéder à leurs systèmes de fichiers et effectuer d'autres manipulations autorisées par Docker. Je ne discuterai pas en détail de Docker ici, mais il existe une grande quantité de documentation sur le site Web de Docker.

Comment configurer votre instance

Aimez-vous cela jusqu'à présent, et vous voulez votre instance ? C'est facile et pas cher. Vous pouvez l'obtenir pour seulement le coût de la machine virtuelle sur Amazon Web Services, plus le stockage. Le kit dans la configuration actuelle nécessite 4 Go de RAM pour faire fonctionner tous les services. Si vous faites attention à n'utiliser la machine virtuelle que lorsque vous en avez besoin et que vous travaillez, disons, 160 heures par mois, une machine virtuelle aux tarifs actuels coûtera 160 x 0,052 $, soit 8 $ par mois. Il faut ajouter le coût du stockage. J'utilise environ 30 Go, mais tout peut être conservé à moins de 10 $.

Cependant, ce bot inclut le coût d'un (éventuel) compte Dropbox (Pro), si vous souhaitez sauvegarder plus de 2 Go de code. Cela coûte 15 $ de plus par mois, mais cela offre une sécurité importante pour vos données. De plus, vous aurez besoin d'un référentiel privé, soit un GitHub payant, soit un autre service, tel que Bitbucket, qui propose des référentiels privés gratuits.

Je tiens à souligner que si vous ne l'utilisez que lorsque vous en avez besoin, il est moins cher qu'un serveur dédié. Oui, tout ce qui est mentionné ici peut être configuré sur un serveur physique, mais comme je travaille avec du big data, j'ai besoin de beaucoup d'autres services AWS, donc je pense qu'il est logique d'avoir tout au même endroit.

Voyons comment faire toute la configuration.

Conditions préalables

Avant de commencer à créer une machine virtuelle, vous devez vous inscrire auprès des quatre services suivants :

  • Services Web Amazon.
  • CanardDNS.
  • Boîte de dépôt.
  • Chiffrez.

Le seul pour lequel vous avez besoin de votre carte de crédit est Amazon Web Services. DuckDns est entièrement gratuit, tandis que DropBox vous offre 2 Go de stockage gratuit, ce qui peut suffire pour de nombreuses tâches. Let's Encrypt est également gratuit, et il est utilisé en interne lorsque vous créez l'image pour signer votre certificat. En plus de cela, je recommande également un service d'hébergement de référentiel, comme GitHub ou Bitbucket, si vous souhaitez stocker votre code, cependant, il n'est pas requis pour la configuration.

Pour commencer, accédez au référentiel GitHub BigDataDevKit.

Écran 6

Faites défiler la page et copiez le script affiché dans l'image dans l'éditeur de texte de votre choix :

Écran 7

Ce script est nécessaire pour amorcer l'image. Vous devez le changer et fournir des valeurs aux paramètres. Soigneusement, modifiez le texte entre les guillemets. Notez que vous ne pouvez pas utiliser de caractères tels que le guillemet lui-même, la barre oblique inverse ou le signe dollar dans le mot de passe, sauf si vous les citez. Ce problème ne concerne que le mot de passe. Si vous voulez jouer en toute sécurité, évitez les guillemets, le signe dollar ou les barres obliques inverses.

Le paramètre PASSWORD est un mot de passe que vous choisissez pour accéder à la machine virtuelle via une interface Web. Le paramètre EMAIL est votre e-mail et sera utilisé lorsque vous enregistrez un certificat SSL. Vous devrez fournir votre adresse e-mail, et c'est la seule exigence pour obtenir un certificat SSL gratuit de Let's Encrypt.

Pour obtenir les valeurs de TOKEN et HOST , rendez-vous sur le site DuckDNS et connectez-vous. Vous devrez choisir un nom d'hôte inutilisé.

Écran 8

Regardez l'image pour voir où vous devez copier le jeton et où vous devez ajouter votre nom d'hôte. Vous devez cliquer sur le bouton "ajouter un domaine" pour réserver le nom d'hôte.

Configuration de votre instance

En supposant que vous ayez tous les paramètres et que vous ayez modifié le script, vous êtes prêt à lancer votre instance. Connectez-vous à l'interface de gestion d'Amazon Web Services, accédez au panneau EC2 Instances et cliquez sur « Launch Instance ».

Écran 9

Dans le premier écran, vous choisirez une image. Le script est construit autour d'Amazon Linux et aucune autre option n'est disponible. Sélectionnez Amazon Linux, la première option de la liste QuickStart.

Écran 10

Sur le deuxième écran, choisissez le type d'instance. Compte tenu de la taille du logiciel en cours d'exécution, il existe plusieurs services et vous avez besoin d'au moins 4 Go de mémoire. Je vous recommande donc de sélectionner l'instance t2.medium . Vous pouvez le réduire, en utilisant le t2.small si vous fermez certains services, ou même le micro si vous ne voulez que le bureau.

Écran 11

Sur le troisième écran, cliquez sur "Détails avancés" et collez le script que vous avez configuré à l'étape précédente. Je vous recommande également d'activer la protection contre la résiliation, afin qu'en cas de résiliation accidentelle, vous ne perdiez pas tout votre travail.

Écran 12

L'étape suivante consiste à configurer le stockage. La valeur par défaut pour une instance est de 8 Go, ce qui n'est pas suffisant pour contenir toutes les images que nous allons construire. Je recommande de l'augmenter à 20 Go. De plus, bien qu'il ne soit pas nécessaire, je suggère un autre périphérique de bloc d'au moins 10 Go. Le script montera le deuxième périphérique bloc en tant que dossier de données. Vous pouvez créer un instantané de son contenu, mettre fin à l'instance, puis le recréer à l'aide de l'instantané et récupérer tout le travail. De plus, un périphérique de bloc personnalisé n'est pas perdu lorsque vous résiliez l'instance, vous bénéficiez donc d'une double protection contre la perte accidentelle de vos données. Pour augmenter encore votre sécurité, vous pouvez sauvegarder vos données automatiquement avec Dropbox.

Écran 13

La cinquième étape consiste à nommer l'instance. Faites votre choix. La sixième étape offre un moyen de configurer le pare-feu. Par défaut, seul SSH est disponible mais nous avons également besoin de HTTPS, donc n'oubliez pas d'ajouter également une règle ouvrant HTTPS. Vous pouvez ouvrir HTTPS au monde, mais il est préférable que ce soit uniquement sur votre adresse IP pour empêcher les autres d'accéder à votre bureau et à votre shell, même s'il est toujours protégé par un mot de passe.

Une fois cette dernière configuration effectuée, vous pouvez lancer l'instance. Vous remarquerez que l'initialisation peut prendre quelques minutes la première fois depuis que le script d'initialisation est en cours d'exécution et il effectuera également des tâches longues comme la génération d'un certificat HTTPS avec Let's Encrypt.

Écran 14

Lorsque vous voyez finalement la console de gestion "s'exécuter" avec une confirmation et qu'elle n'est plus "en train de s'initialiser", vous êtes prêt à partir.

En supposant que tous les paramètres sont corrects, vous pouvez accéder à https://YOURHOST.duckdns.org .

Remplacez YOURHOST par le nom d'hôte que vous avez choisi, mais n'oubliez pas qu'il s'agit d'un site HTTPS, et non HTTP, donc votre connexion au serveur est cryptée, vous devez donc écrire https// dans l'URL. Le site présentera également un certificat valide pour Let's Encrypt. S'il y a des problèmes pour obtenir le certificat, le script d'initialisation générera un certificat auto-signé. Vous pourrez toujours vous connecter avec une connexion cryptée, mais le navigateur vous avertira qu'il s'agit d'un site inconnu et que les connexions ne sont pas sécurisées. Cela ne devrait pas arriver, mais on ne sait jamais.

Écran 15

En supposant que tout fonctionne, vous accédez alors au terminal Web, Butterfly. Vous pouvez vous connecter à l'aide de l' app utilisateur et du mot de passe que vous avez saisi dans le script de configuration.

Une fois connecté, vous disposez d'une machine virtuelle amorcée, qui comprend également Docker et d'autres avantages, tels qu'un frontend Nginx, Git et le terminal Web Butterfly. Vous pouvez maintenant terminer la configuration en créant les images Docker pour votre environnement de développement.

Tapez ensuite les commandes suivantes :

 git clone https://github.com/sciabarra/BigDataDevKit cd BigDataDevKit sh build.sh

La dernière commande vous demandera également de saisir un mot de passe pour l'accès au bureau. Une fois cela fait, il commencera à construire les images. Notez que la construction prendra environ 10 minutes, mais vous pouvez voir ce qui se passe car tout est affiché à l'écran.

Une fois la compilation terminée, vous pouvez également installer Dropbox avec la commande suivante :

 /app/.dropbox-dist/dropboxd

Le système affichera un lien sur lequel vous devrez cliquer pour activer Dropbox. Vous devez vous connecter à Dropbox, puis vous avez terminé. Tout ce que vous mettez dans le dossier Dropbox est automatiquement synchronisé entre toutes vos instances Dropbox.

Une fois cela fait, vous pouvez redémarrer la machine virtuelle et accéder à votre environnement à l'URL https://YOURHOST.dyndns.org/vnc.html .

Vous pouvez arrêter votre machine et la redémarrer lorsque vous reprenez le travail. L'URL d'accès reste la même. De cette façon, vous ne paierez que pour le temps d'utilisation, plus un supplément mensuel pour le stockage utilisé.

Préservation de vos données

La discussion suivante nécessite une certaine connaissance du fonctionnement de Docker et d'Amazon. Si vous ne voulez pas comprendre les détails, gardez simplement à l'esprit la règle simple suivante : dans la machine virtuelle, il y a un dossier /app/Dropbox disponible, tout ce que vous placez dans /app/Dropbox est conservé, et tout le reste est jetable et peut s'en aller. Pour améliorer encore la sécurité, stockez également votre précieux code dans un système de contrôle de version.

Maintenant, si vous voulez comprendre cela, lisez la suite. Si vous avez suivi mes instructions lors de la création de la machine virtuelle, la machine virtuelle est protégée contre la résiliation, vous ne pouvez donc pas la détruire accidentellement. Si vous décidez expressément d'y mettre fin, le volume principal sera détruit. Toutes les images Docker seront perdues, y compris toutes les modifications que vous avez apportées.

Cependant, comme le dossier /app/Dropbox est monté en tant que volume Docker pour les conteneurs, il ne fait pas partie des images Docker. Dans la machine virtuelle, le dossier /app est monté dans le volume Amazon que vous avez créé, qui n'est pas non plus détruit même lorsque vous résiliez expressément la machine virtuelle. Pour supprimer le volume, vous devez le supprimer expressément.

Ne confondez pas les volumes Docker, qui sont une entité logique Docker, avec Amazon Volumes, qui est une entité quelque peu physique. Ce qui se passe, c'est que le volume /app/Dropbox Docker est placé à l'intérieur du volume /app Amazon.

Le volume Amazon n'est pas automatiquement détruit lorsque vous arrêtez la machine virtuelle, donc tout ce qui y est placé sera conservé, jusqu'à ce que vous détruisiez également expressément le volume. De plus, tout ce que vous mettez dans le volume Docker est stocké à l'extérieur du conteneur, il n'est donc pas détruit lorsque le conteneur est détruit. Si vous avez activé Dropbox, comme recommandé, tout votre contenu est copié sur les serveurs Dropbox et sur votre disque dur si vous synchronisez Dropbox avec votre ou vos ordinateurs. De plus, il est recommandé que le code source soit stocké dans un système de contrôle de version.

Donc, si vous placez vos éléments dans le système de contrôle de version sous le dossier Dropbox, pour perdre vos données, tout cela doit arriver :

  • Vous résiliez expressément votre machine virtuelle.
  • Vous supprimez expressément le volume de données de la machine virtuelle.
  • Vous supprimez expressément les données de Dropbox, y compris l'historique.
  • Vous supprimez expressément les données du système de contrôle de version.

J'espère que vos données sont suffisamment sécurisées.

Je garde une machine virtuelle pour chaque projet, et lorsque j'ai terminé, je garde les machines virtuelles inutilisées désactivées. Bien sûr, j'ai tout mon code sur GitHub et sauvegardé dans Dropbox. De plus, lorsque j'arrête de travailler sur un projet, je prends un instantané du bloc Amazon Web Services avant de supprimer entièrement la machine virtuelle. De cette façon, chaque fois qu'un projet reprend, par exemple pour la maintenance, tout ce que j'ai à faire est de démarrer une nouvelle machine virtuelle en utilisant le snapshot. Toutes mes données sont remises en place et je peux reprendre le travail.

Optimiser l'accès

Tout d'abord, si vous disposez d'un accès Internet direct, non médiatisé par un proxy, vous pouvez utiliser des clients SSH et VNC natifs. L'accès SSH direct est important si vous devez copier des fichiers dans et hors de la machine virtuelle. Cependant, pour le partage de fichiers, vous devriez considérer Dropbox comme une alternative plus simple.

L'accès Web VNC est inestimable, mais parfois, il peut être plus lent qu'un client natif. Vous avez accès au serveur VNC sur la machine virtuelle en utilisant le port 5900. Vous devez expressément l'ouvrir car il est fermé par défaut. Je vous recommande de ne l'ouvrir qu'à votre adresse IP, car Internet regorge de "robots" qui parcourent Internet à la recherche de services auxquels se connecter, et VNC est une cible fréquente de ces robots.

Conclusion

Cet article explique comment tirer parti de la technologie cloud moderne pour mettre en œuvre un environnement de développement efficace. Bien qu'une machine dans le cloud ne puisse pas remplacer complètement votre ordinateur de travail ou un ordinateur portable, elle est suffisante pour effectuer des travaux de développement lorsqu'il est important d'avoir accès à l'IDE. D'après mon expérience, avec les connexions Internet actuelles, il est assez rapide pour travailler avec.

Étant dans le cloud, l'accès au serveur et la manipulation sont plus rapides que de les avoir localement. Vous pouvez rapidement augmenter (ou diminuer) la mémoire, lancer un autre environnement, créer une image, etc. Vous avez un centre de données à portée de main, et lorsque vous travaillez avec des projets de Big Data, eh bien, vous avez besoin de services robustes et de beaucoup d'espace. C'est ce que le cloud offre.