Desenvolvendo para a Nuvem na Nuvem: Desenvolvimento de BigData com Docker na AWS
Publicados: 2022-03-11Por que você pode precisar dele?
Sou desenvolvedor e trabalho diariamente em Ambientes de Desenvolvimento Integrado (IDE), como Intellij IDEA ou Eclipse. Esses IDEs são aplicativos de desktop. Desde o advento do Google Documents, tenho visto mais e mais pessoas migrando seu trabalho de versões desktop do Word ou Excel para a nuvem usando um equivalente online de um processador de texto ou um aplicativo de planilha.
Existem razões óbvias para usar uma nuvem para manter seu trabalho. Hoje, em comparação com os aplicativos de negócios tradicionais de desktop, alguns aplicativos da Web não apresentam uma desvantagem significativa nas funcionalidades. O conteúdo está disponível onde quer que haja um navegador da Web e, atualmente, isso está em quase todos os lugares. A colaboração e o compartilhamento são mais fáceis e a perda de arquivos é menos provável.
Infelizmente, essas vantagens da nuvem não são tão comuns no mundo do desenvolvimento de software quanto nos aplicativos de negócios. Existem algumas tentativas de fornecer um IDE online, mas elas não chegam nem perto dos IDEs tradicionais.
Isso é um paradoxo; enquanto ainda estamos vinculados ao nosso desktop para codificação diária, o software agora é gerado em vários servidores. Os desenvolvedores precisam trabalhar com coisas que não podem mais manter em seus computadores. De fato, os laptops não estão mais aumentando seu poder de processamento; ter mais de 16 GB de RAM em um laptop é raro e caro, e dispositivos mais novos, tablets, por exemplo, têm ainda menos.
No entanto, mesmo que ainda não seja possível substituir os aplicativos de desktop clássicos para desenvolvimento de software, é possível migrar todo o desktop de desenvolvimento para a nuvem . No dia em que percebi que não era mais necessário ter todos os meus softwares no meu laptop, e percebendo a disponibilidade da versão web dos terminais e VNC, mudei tudo para a nuvem. Eventualmente, desenvolvi um kit de construção para criar esse ambiente de forma automatizada.
Neste artigo apresento um conjunto de scripts para construir um ambiente de desenvolvimento baseado em nuvem para aplicativos Scala e big data, rodando com Docker na Amazon AWS, e composto por um desktop acessível pela web com IntelliJ IDE, Spark, Hadoop e Zeppelin como serviços , e também ferramentas de linha de comando como SSH, SBT e Amonite baseados na web. O kit está disponível gratuitamente no GitHub e descrevo aqui o procedimento para usá-lo para construir sua instância. Você pode construir seu ambiente e personalizá-lo de acordo com suas necessidades específicas. Não deve demorar mais de 10 minutos para colocá-lo em funcionamento.
O que está no “BigDataDevKit”?
Meu objetivo principal ao desenvolver o kit era que meu ambiente de desenvolvimento fosse algo que eu pudesse simplesmente ativar, com todos os serviços e servidores com os quais trabalho, e então destruí-los quando não fossem mais necessários. Isso é especialmente importante quando você trabalha em projetos diferentes, alguns deles envolvendo um grande número de servidores e serviços, como quando você trabalha em projetos de big data.
Meu ambiente ideal baseado em nuvem deve:
- Inclua todas as ferramentas de desenvolvimento usuais, principalmente um IDE gráfico.
- Tenha os servidores e serviços de que preciso ao meu alcance.
- Seja fácil e rápido de criar do zero e expansível para adicionar mais serviços.
- Seja totalmente acessível usando apenas um navegador da web.
- Opcionalmente, permita o acesso com clientes especializados (cliente VNC e cliente SSH).
Aproveitando a infraestrutura e o software em nuvem modernos, o poder dos navegadores modernos, uma ampla disponibilidade de banda larga e o inestimável Docker, criei um ambiente de desenvolvimento para Scala e desenvolvimento de big data que, para melhor, substituiu meu laptop de desenvolvimento.
Atualmente, posso trabalhar a qualquer momento, seja a partir de um MacBook Pro, de um Surface Tablet ou até de um iPad (com teclado), embora reconhecidamente a última opção não seja a ideal. Todos esses dispositivos são meros clientes; o desktop e todos os servidores estão na nuvem.
Meu ambiente atual é construído usando os seguintes serviços online:
- Amazon Web Services para os servidores.
- GitHub para armazenar o código.
- Dropbox para salvar arquivos.
Eu também uso alguns serviços gratuitos, como DuckDns para endereços IP dinâmicos e Let's encrypt para obter um certificado SSL gratuito.
Neste ambiente, atualmente tenho:
- Uma área de trabalho gráfica com a ideia Intellij, acessível através de um navegador da web.
- Ferramentas de linha de comando acessíveis pela Web, como SBT e Amonite.
- Hadoop para armazenar arquivos e executar trabalhos MapReduce.
- Spark Job Server para trabalhos agendados.
- Zeppelin para um notebook baseado na web.
Mais importante ainda, o acesso à web é totalmente criptografado com HTTPS, tanto para VNC quanto SSH baseados na web, e há várias proteções para evitar a perda de dados, uma preocupação que é importante quando você não “possui” o conteúdo em seu disco rígido físico. Observe que obter uma cópia de todo o seu trabalho em seu computador é automático e muito rápido. Se você perder tudo porque alguém roubou sua senha, você terá uma cópia em seu computador de qualquer maneira, desde que tenha configurado tudo corretamente.
Usando um ambiente de desenvolvimento baseado na Web com AWS e Docker
Agora, vamos começar a descrever como o ambiente funciona. Quando começo a trabalhar pela manhã, a primeira coisa é fazer login no console da Amazon Web Services, onde vejo todas as minhas instâncias. Normalmente, tenho muitas instâncias de desenvolvimento configuradas para projetos diferentes e mantenho as não utilizadas desativadas para economizar no faturamento. Afinal, só posso trabalhar em um projeto de cada vez. (Bem, às vezes eu trabalho em dois.)
Então, seleciono a instância que quero, começo, espero um pouco ou vou tomar um café. Não é tão diferente de ligar o computador. Geralmente, leva alguns segundos para que a instância esteja funcionando. Assim que vejo o ícone verde, abro um navegador e vou para um URL conhecido: https://msciab.duckdns.org/vnc.html . Observe que esta é minha URL; ao criar um kit, você criará seu URL exclusivo.
Como a AWS atribui um novo IP a cada máquina quando você inicia, configurei um serviço de DNS dinâmico, para que você sempre possa usar a mesma URL para acessar seu servidor, mesmo que o interrompa e reinicie. Você pode até marcar no seu navegador. Além disso, uso HTTPS, com chaves válidas para obter proteção total do meu trabalho contra sniffers, caso precise gerenciar senhas e outros dados confidenciais.
Uma vez carregado, o sistema irá recebê-lo com um cliente web Web VNC, NoVNC. Basta fazer login e uma área de trabalho é exibida. Uso um desktop mínimo, intencionalmente, apenas um menu com aplicativos, e meu único luxo é um desktop virtual (já que abro muitas janelas quando desenvolvo). Para correio, ainda confio em outros aplicativos, hoje em dia principalmente outras guias do navegador.
Na máquina virtual, tenho o que preciso para desenvolver aplicativos de big data. Em primeiro lugar, há um IDE. Na compilação, eu uso a edição da comunidade IntelliJ Idea. Além disso, há a ferramenta de construção SBT e um Scala REPL, Ammonite.
Os principais recursos desse ambiente, no entanto, são serviços implantados como contêineres na mesma máquina virtual. Em particular, tenho:
- Zeppelin, o notebook da web para usar código Scala em tempo real e fazer análise de dados (
http://zeppelin:8080) - O Spark Job Server, para executar e implantar trabalhos spark com uma interface Rest (
http://sparkjobserver:8080). - Uma instância do Hadoop para armazenar e recuperar dados do HDFS (
http://hadoop:50070).
Observe que esses URLs são fixos, mas podem ser acessados no ambiente virtual. Você pode ver suas interfaces da web na captura de tela a seguir.
Cada serviço é executado em um contêiner separado do Docker. Sem se tornar muito técnico, você pode pensar nisso como três servidores separados dentro de sua máquina virtual. A beleza de usar o Docker é que você pode adicionar serviços e até adicionar duas ou três máquinas virtuais. Usando contêineres da Amazon, você pode dimensionar seu ambiente facilmente.
Por último, mas não menos importante, você tem um terminal web disponível. Basta acessar sua URL com HTTPS e você será recebido com um terminal em uma página web.
Na imagem acima você pode ver que listo os containers, que são os três servidores mais o desktop. Esse shell de linha de comando fornece acesso à máquina virtual que contém os contêineres, permitindo que você os gerencie. É como se seus servidores estivessem “na Matrix” (virtualizados dentro de containers), mas este shell lhe dá uma saída fora da “Matrix” para gerenciar servidores e desktops. A partir daqui, você pode reiniciar os contêineres, acessar seus sistemas de arquivos e realizar outras manipulações permitidas pelo Docker. Não discutirei em detalhes o Docker aqui, mas há uma grande quantidade de documentação no site do Docker.
Como configurar sua instância
Você gostou disso até agora e quer sua instância? É fácil e barato. Você pode obtê-lo apenas pelo custo da máquina virtual na Amazon Web Services, mais o armazenamento. O kit na configuração atual requer 4 GB de RAM para executar todos os serviços. Se você tiver o cuidado de usar a máquina virtual apenas quando precisar e trabalhar, digamos, 160 horas por mês, uma máquina virtual com as taxas atuais custará 160 x US$ 0,052, ou US$ 8 por mês. Você tem que adicionar o custo de armazenamento. Eu uso cerca de 30 GB, mas tudo pode ser mantido abaixo de US $ 10.
No entanto, isso inclui o custo de uma (eventual) conta Dropbox (Pro), caso você queira fazer backup de mais de 2 GB de código. Isso custa mais US$ 15 por mês, mas fornece segurança importante para seus dados. Além disso, você precisará de um repositório privado, seja um GitHub pago ou outro serviço, como o Bitbucket, que oferece repositórios privados gratuitos.
Quero enfatizar que se você usá-lo apenas quando precisar, é mais barato que um servidor dedicado. Sim, tudo aqui mencionado pode ser configurado em um servidor físico, mas como trabalho com big data preciso de muitos outros serviços da AWS, então acho lógico ter tudo no mesmo lugar.
Vamos ver como fazer toda a configuração.
Pré-requisitos
Antes de começar a construir uma máquina virtual, você precisa se registrar nos quatro serviços a seguir:
- Amazon Web Services.
- Pato DNS.
- Dropbox.
- Vamos criptografar.
O único para o qual você precisa do seu cartão de crédito é o Amazon Web Services. O DuckDns é totalmente gratuito, enquanto o DropBox oferece 2 GB de armazenamento gratuito, o que pode ser suficiente para muitas tarefas. O Let's Encrypt também é gratuito e é usado internamente quando você cria a imagem para assinar seu certificado. Além destes, recomendo também um serviço de hospedagem de repositório, como GitHub ou Bitbucket, caso você queira armazenar seu código, porém, não é necessário para a configuração.

Para começar, navegue até o repositório GitHub BigDataDevKit.
Role a página e copie o script mostrado na imagem em seu editor de texto de sua escolha:
Este script é necessário para inicializar a imagem. Você precisa alterá-lo e fornecer alguns valores aos parâmetros. Com cuidado, altere o texto entre aspas. Observe que você não pode usar caracteres como a própria cotação, a barra invertida ou o cifrão na senha, a menos que você os cite. Este problema é relevante apenas para a senha. Se você quiser jogar pelo seguro, evite uma cotação, cifrão ou barras invertidas.
O parâmetro PASSWORD é uma senha que você escolhe para acessar a máquina virtual por meio de uma interface web. O parâmetro EMAIL é seu e-mail e será usado quando você registrar um certificado SSL. Você será solicitado a fornecer seu e-mail, e é o único requisito para obter um certificado SSL gratuito da Let's Encrypt.
Para obter os valores de TOKEN e HOST , acesse o site DuckDNS e faça login. Você precisará escolher um nome de host não utilizado.
Observe a imagem para ver onde você deve copiar o token e onde deve adicionar seu nome de host. Você deve clicar no botão “adicionar domínio” para reservar o nome do host.
Configurando sua instância
Supondo que você tenha todos os parâmetros e tenha editado o script, você está pronto para executar sua instância. Faça login na interface de gerenciamento do Amazon Web Services, vá para o painel EC2 Instances e clique em “Launch Instance”.
Na primeira tela, você escolherá uma imagem. O script é construído em torno do Amazon Linux e não há outras opções disponíveis. Selecione Amazon Linux, a primeira opção na lista QuickStart.
Na segunda tela, escolha o tipo de instância. Dado o tamanho do software em execução, existem vários serviços e você precisa de pelo menos 4 GB de memória, portanto, recomendo que você selecione a instância t2.medium . Você pode reduzi-lo, usando o t2.small se você desligar alguns serviços, ou até mesmo o micro se você quiser apenas o desktop.
Na terceira tela, clique em “Detalhes Avançados” e cole o script que você configurou na etapa anterior. Também recomendo que você ative a proteção contra rescisão, para que, com uma rescisão acidental, você não perca todo o seu trabalho.
O próximo passo é configurar o armazenamento. O padrão para uma instância é 8GB, o que não é suficiente para conter todas as imagens que vamos construir. Eu recomendo aumentar para 20 GB. Além disso, embora não seja necessário, sugiro outro dispositivo de bloco de pelo menos 10 GB. O script montará o segundo dispositivo de bloco como uma pasta de dados. Você pode fazer um instantâneo de seu conteúdo, encerrar a instância e recriá-lo usando o instantâneo e recuperando todo o trabalho. Além disso, um dispositivo de bloco personalizado não é perdido quando você encerra a instância, portanto, tenha proteção dupla contra perda acidental de seus dados. Para aumentar ainda mais sua segurança, você pode fazer backup de seus dados automaticamente com o Dropbox.
A quinta etapa é nomear a instância. Escolha o seu. A sexta etapa oferece uma maneira de configurar o firewall. Por padrão, apenas SSH está disponível, mas também precisamos de HTTPS, portanto, não se esqueça de adicionar também uma regra de abertura de HTTPS. Você pode abrir HTTPS para o mundo, mas é melhor se for apenas para o seu IP para impedir que outras pessoas acessem sua área de trabalho e shell, mesmo que ainda esteja protegido por uma senha.
Uma vez feito com esta última configuração, você pode iniciar a instância. Você notará que a inicialização pode demorar alguns minutos na primeira vez desde que o script de inicialização está em execução e também executará algumas tarefas demoradas, como gerar um certificado HTTPS com Let's Encrypt.
Quando você finalmente vir o console de gerenciamento “executando” com uma confirmação e ele não estiver mais “inicializando”, você estará pronto para começar.
Supondo que todos os parâmetros estejam corretos, você pode navegar para https://YOURHOST.duckdns.org .
Substitua YOURHOST pelo hostname que você escolheu, mas não esqueça que é um site HTTPS, não HTTP, então sua conexão com o servidor é criptografada, então você deve escrever https// na URL. O site também apresentará um certificado válido para Let's Encrypt. Se houver problemas para obter o certificado, o script de inicialização gerará um certificado autoassinado. Você ainda poderá se conectar com uma conexão criptografada, mas o navegador avisará que é um site desconhecido e as conexões não são seguras. Isso não deveria acontecer, mas nunca se sabe.
Supondo que tudo esteja funcionando, você acessa o terminal da web, Butterfly. Você pode fazer login usando o app do usuário e a senha que você colocou no script de configuração.
Uma vez logado, você tem uma máquina virtual inicializada, que também inclui o Docker e outros recursos, como um Nginx Frontend, Git e o Butterfly Web Terminal. Agora, você pode concluir a configuração criando as imagens do Docker para seu ambiente de desenvolvimento.
Em seguida, digite os seguintes comandos:
git clone https://github.com/sciabarra/BigDataDevKit cd BigDataDevKit sh build.shO último comando também solicitará que você digite uma senha para o acesso à área de trabalho. Uma vez feito, ele começará a construir as imagens. Observe que a compilação levará cerca de 10 minutos, mas você pode ver o que está acontecendo porque tudo é mostrado na tela.
Quando a compilação estiver concluída, você também poderá instalar o Dropbox com o seguinte comando:
/app/.dropbox-dist/dropboxdO sistema mostrará um link no qual você deve clicar para ativar o Dropbox. Você precisa fazer login no Dropbox e pronto. Tudo o que você colocar na pasta do Dropbox é sincronizado automaticamente entre todas as suas instâncias do Dropbox.
Uma vez feito isso, você pode reiniciar a máquina virtual e acessar seu ambiente na URL https://YOURHOST.dyndns.org/vnc.html .
Você pode parar sua máquina e reiniciá-la quando retomar o trabalho. A URL de acesso permanece a mesma. Dessa forma, você pagará apenas pelo tempo que estiver usando, mais um extra mensal pelo armazenamento usado.
Preservando seus dados
A discussão a seguir requer algum conhecimento de como o Docker e o Amazon funcionam. Se você não quiser entender os detalhes, lembre-se da seguinte regra simples: na máquina virtual, há uma pasta /app/Dropbox disponível, o que você colocar em /app/Dropbox é preservado, e todo o resto é descartável e pode ir embora. Para melhorar ainda mais a segurança, armazene também seu precioso código em um sistema de controle de versão.
Agora, se você quer entender isso, continue lendo. Se você seguiu minhas instruções na criação da máquina virtual, a máquina virtual está protegida contra rescisão, então você não pode destruí-la acidentalmente. Se você decidir expressamente encerrá-lo, o volume primário será destruído. Todas as imagens do Docker serão perdidas, incluindo todas as alterações feitas.
No entanto, como a pasta /app/Dropbox é montada como um volume do Docker para contêineres, ela não faz parte das imagens do Docker. Na máquina virtual, a pasta /app é montada no Amazon Volume que você criou, que também não é destruído mesmo quando você encerra expressamente a máquina virtual. Para remover o volume, você deve removê-lo expressamente.
Não confunda os volumes do Docker, que são uma entidade lógica do Docker, com o Amazon Volumes, que é uma entidade um tanto física. O que acontece é que o volume /app/Dropbox Docker é colocado dentro do volume /app Amazon.
O Amazon Volume não é destruído automaticamente quando você encerra a máquina virtual, portanto, o que for colocado nela será preservado, até que você também destrua expressamente o volume. Além disso, tudo o que você coloca no volume do Docker é armazenado fora do contêiner, portanto, não é destruído quando o contêiner é destruído. Se você ativou o Dropbox, conforme recomendado, todo o seu conteúdo é copiado para os servidores do Dropbox e para o seu disco rígido se você sincronizar o Dropbox com seu(s) computador(es). Além disso, é recomendável que o código-fonte seja armazenado em um sistema de controle de versão.
Então, se você colocar suas coisas no sistema de controle de versão na pasta do Dropbox, para perder seus dados tudo isso deve acontecer:
- Você encerra expressamente sua máquina virtual.
- Você remove expressamente o volume de dados da máquina virtual.
- Você remove expressamente os dados do Dropbox, incluindo o histórico.
- Você remove expressamente os dados do sistema de controle de versão.
Espero que seus dados estejam seguros o suficiente.
Eu mantenho uma máquina virtual para cada projeto e, quando termino, mantenho as máquinas virtuais não utilizadas desligadas. Claro, eu tenho todo o meu código no GitHub e backup no Dropbox. Além disso, quando paro de trabalhar em um projeto, tiro um instantâneo do bloco Amazon Web Services antes de remover completamente a máquina virtual. Dessa forma, sempre que um projeto for retomado, por exemplo, para manutenção, tudo o que preciso fazer é iniciar uma nova máquina virtual usando o snapshot. Todos os meus dados voltam ao lugar e posso retomar o trabalho.
Otimizando o acesso
Primeiro, se você tiver acesso direto à Internet, não mediado por um proxy, poderá usar clientes SSH e VNC nativos. O acesso SSH direto é importante se você precisar copiar arquivos dentro e fora da máquina virtual. No entanto, para compartilhamento de arquivos, você deve considerar o Dropbox como uma alternativa mais simples.
O acesso à web VNC é inestimável, mas às vezes pode ser mais lento que um cliente nativo. Você tem acesso ao servidor VNC na máquina virtual usando a porta 5900. Você deve abri-lo expressamente porque está fechado por padrão. Eu recomendo que você abra apenas para o seu endereço IP, porque a internet está cheia de “robôs” que vasculham a internet procurando serviços para se conectar, e o VNC é um alvo frequente desses robôs.
Conclusão
Este artigo explica como você pode aproveitar a tecnologia de nuvem moderna para implementar um ambiente de desenvolvimento eficaz. Embora uma máquina na nuvem não possa ser um substituto completo para seu computador ou laptop em funcionamento, ela é boa o suficiente para fazer o trabalho de desenvolvimento quando é importante ter acesso ao IDE. Na minha experiência, com conexões de internet atuais, é rápido o suficiente para trabalhar.
Estar na nuvem, o acesso e manipulação do servidor é mais rápido do que tê-los localmente. Você pode aumentar (ou diminuir) a memória rapidamente, iniciar outro ambiente, criar uma imagem e assim por diante. Você tem um datacenter ao seu alcance e, quando trabalha com projetos de big data, precisa de serviços robustos e muito espaço. É isso que a nuvem oferece.
