本文概述
为什么你可能需要它?
我是一名开发人员, 每天在Intellij IDEA或Eclipse等集成开发环境(IDE)中工作。这些IDE是桌面应用程序。自Google文档问世以来, 我看到越来越多的人使用相当于文字处理程序或电子表格应用程序的在线版本将工作从Word或Excel的桌面版本转移到云中。
使用云来保留你的工作有明显的原因。今天, 与传统的桌面业务应用程序相比, 某些Web应用程序在功能上没有明显的劣势。无论何时何地, 只要有网络浏览器, 都可以使用该内容, 而如今几乎无处不在。协作和共享更加容易, 丢失文件的可能性也较小。
不幸的是, 这些云优势在软件开发领域并不像商业应用程序那样普遍。有一些尝试提供在线IDE, 但与传统的IDE距离还很远。
这是一个悖论;虽然我们仍然绑定到桌面上进行日常编码, 但该软件现在已在多台服务器上产生。开发人员需要处理无法将其保存在计算机上的内容。实际上, 笔记本电脑不再增加其处理能力。在笔记本电脑上拥有超过16GB的RAM的情况很少见, 而且价格昂贵, 而较新的设备(例如平板电脑)拥有的RAM甚至更少。
但是, 即使尚不能替换传统的桌面应用程序进行软件开发, 也可以将整个开发桌面移动到云中。当我意识到不再需要将所有软件都放在笔记本电脑上的那一天, 并且注意到终端和VNC的Web版本的可用性后, 我将所有内容都移到了云中。最终, 我开发了一个构建套件, 用于以自动化方式创建该环境。
对于开发人员而言, 云到底是什么?当然在其中发展!
鸣叫
在本文中, 我介绍了一组脚本, 用于为Scala和大数据应用程序构建基于云的开发环境, 该脚本在Amazon AWS中与Docker一起运行, 并包含一个可访问Web的桌面, 并以IntelliJ IDE, Spark, Hadoop和Zeppelin作为服务以及命令行工具, 例如基于Web的SSH, SBT和Ammonite。该工具包可在GitHub上免费获得, 我在这里描述了使用它构建实例的过程。你可以构建环境并根据特定需求对其进行自定义。它启动并运行所需的时间不会超过10分钟。
” BigDataDevKit”中包含什么?
我开发套件的主要目的是使我的开发环境能够随同我使用的所有服务和服务器一起启动, 然后在不再需要它们时销毁它们。当你在不同的项目上工作时, 这尤其重要, 就像在大数据项目上工作一样, 其中一些项目涉及大量的服务器和服务。
我理想的基于云的环境应:
- 包括所有常用的开发工具, 最重要的是图形IDE。
- 随时获得所需的服务器和服务。
- 从头开始轻松, 快速地创建, 并且可以扩展以添加更多服务。
- 仅使用Web浏览器即可完全访问。
- (可选)允许使用专用客户端(VNC客户端和SSH客户端)进行访问。
利用现代云基础架构和软件, 现代浏览器的功能, 宽带的广泛可用性以及无价的Docker, 我为Scala和大数据开发创建了一个开发环境, 更好地取代了我的开发笔记本电脑。
目前, 我可以在任何时候使用MacBook Pro, Surface Tablet甚至是iPad(带键盘)进行工作, 尽管最后一种选择并不理想。所有这些设备仅是客户端。桌面和所有服务器都在云中。
我当前的环境是使用以下在线服务构建的:
- 服务器的Amazon Web Services。
- GitHub, 用于存储代码。
- Dropbox保存文件。
我还使用了一些免费服务, 例如DuckDns用于动态IP地址, 让我们加密以获得免费的SSL证书。
在这种环境下, 我目前有:
- 具有Intellij想法的图形桌面, 可通过Web浏览器访问。
- 可通过Web访问的命令行工具, 例如SBT和Ammonite。
- Hadoop, 用于存储文件和运行MapReduce作业。
- Spark Job Server用于计划的作业。
- Zeppelin用于基于Web的笔记本。
最重要的是, 对于基于Web的VNC和SSH, Web访问均使用HTTPS进行了完全加密, 并且有多种保护措施来避免丢失数据, 这当然很重要, 当你不”拥有”内容时, 这一点很重要。你的物理硬盘。请注意, 在计算机上自动获取所有工作的副本是非常快速的。如果由于某人窃取了密码而丢失了所有内容, 那么只要你正确配置了所有内容, 你的计算机上仍然会有一个副本。
通过AWS和Docker使用基于Web的开发环境
现在, 让我们开始描述环境的工作原理。早上开始工作时, 第一件事是登录到Amazon Web Services控制台, 在该控制台中可以看到所有实例。通常, 我为不同的项目配置了许多开发实例, 为了节省费用, 我将未使用的实例关闭了。毕竟, 我一次只能从事一个项目。 (好吧, 有时候我工作两个。)
因此, 我选择了所需的实例, 启动它, 我稍等一下或去喝杯咖啡。开启电脑并没有什么不同。实例启动和运行通常需要花费一秒钟的时间。看到绿色图标后, 打开浏览器, 然后转到一个知名的URL:https://msciab.duckdns.org/vnc.html。注意, 这是我的网址;创建工具包时, 将创建唯一的URL。
由于AWS在启动时会为每台机器分配一个新IP, 因此我配置了动态DNS服务, 因此即使停止并重新启动服务器, 你也可以始终使用相同的URL访问服务器。你甚至可以在浏览器中为其添加书签。此外, 在需要管理密码和其他敏感数据的情况下, 我使用带有有效密钥的HTTPS来完全保护我的工作免受嗅探器的侵害。
加载后, 系统将使用Web VNC Web客户端NoVNC来欢迎你。只需登录, 便会出现一个桌面。我故意使用最小的桌面, 只是一个带有应用程序的菜单, 而我唯一的奢侈是虚拟桌面(因为在开发时我打开了很多窗口)。对于邮件, 我仍然依赖于其他应用程序, 如今大部分都是其他浏览器选项卡。
在虚拟机中, 我拥有开发大数据应用程序所需的东西。首先, 最重要的是有一个IDE。在构建中, 我使用IntelliJ Idea社区版。此外, 还有SBT构建工具和Scala REPL Ammonite。
但是, 此环境的关键功能是将服务作为容器部署在同一虚拟机中。特别是, 我有:
- Zeppelin, 用于即时使用Scala代码并进行数据分析的Web笔记本(http:// zeppelin:8080)
- Spark Job Server, 用于通过Rest接口(http:// sparkjobserver:8080)执行和部署spark作业。
- Hadoop的一个实例, 用于从HDFS(http:// hadoop:50070)存储和检索数据。
请注意, 这些URL是固定的, 但可以在虚拟环境中访问。你可以在以下屏幕截图中看到其Web界面。
每个服务都在单独的Docker容器中运行。无需太过技术, 你可以将其视为虚拟机内部的三个独立服务器。使用Docker的好处是你可以添加服务, 甚至可以添加两个或三个虚拟机。使用Amazon容器, 你可以轻松扩展环境。
最后但并非最不重要的是, 你有一个可用的Web终端。只需使用HTTPS访问你的URL, 网页上的终端设备就会为你带来欢迎。
在上面的屏幕截图中, 你可以看到我列出了容器, 它们是三台服务器加上桌面。通过此命令行外壳, 你可以访问保存容器的虚拟机, 从而可以对其进行管理。好像你的服务器”在Matrix中”(在容器中虚拟化)一样, 但是此外壳使你可以逃脱” Matrix”之外的角色来管理服务器和台式机。从这里, 你可以重新启动容器, 访问它们的文件系统, 并执行Docker允许的其他操作。我不会在这里详细讨论Docker, 但是Docker网站上有大量文档。
如何设置你的实例
到目前为止, 你是否喜欢这种方式, 并且想要你的实例?它既简单又便宜。你可以仅通过Amazon Web Services上虚拟机的成本加上存储成本来获得它。当前配置中的工具包需要4GB RAM才能运行所有服务。如果你仅在需要时才小心使用虚拟机, 并且每月工作160个小时, 那么按当前费率计算的虚拟机的价格为160 x 0.052美元或每月8美元。你必须增加存储成本。我大约使用30GB, 但所有费用都可以保持在10美元以下。
但是, 如果你要备份超过2GB的代码, 则此bot确实会包含(最终)Dropbox(Pro)帐户的费用。这每月另需15美元, 但它为你的数据提供了重要的安全性。另外, 你将需要一个私有存储库, 它是付费GitHub或其他服务, 例如Bitbucket, 它提供免费的私有存储库。
我要强调的是, 如果仅在需要时使用它, 则它比专用服务器便宜。是的, 这里提到的所有内容都可以在物理服务器上设置, 但是由于我使用大数据, 因此我还需要许多其他AWS服务, 因此我认为将所有内容都放在同一位置是合乎逻辑的。
让我们来看看如何进行整个设置。
先决条件
在开始构建虚拟机之前, 你需要注册以下四个服务:
- 亚马逊网络服务。
- DuckDNS。
- 投寄箱。
- 让我们加密。
你唯一需要使用信用卡的信用卡是Amazon Web Services。 DuckDns是完全免费的, 而DropBox为你提供2GB的免费存储空间, 足以应付许多任务。 Let’s Encrypt也是免费的, 并且在构建图像以对证书进行签名时在内部使用。除此之外, 如果你想存储代码, 我也建议使用诸如GitHub或Bitbucket之类的存储库托管服务, 但是, 设置不是必需的。
首先, 导航到GitHub BigDataDevKit存储库。
滚动页面, 然后在你选择的文本编辑器中复制图像中显示的脚本:
需要此脚本来引导映像。你必须对其进行更改, 并为参数提供一些值。仔细更改引号内的文本。注意, 除非使用引号, 否则不能在密码中使用引号本身, 反斜杠或美元符号之类的字符。此问题仅与密码有关。如果你想安全起见, 请避免使用引号, 美元符号或反斜杠。
PASSWORD参数是你选择通过Web界面访问虚拟机的密码。 EMAIL参数是你的电子邮件, 将在你注册SSL证书时使用。你需要提供电子邮件, 这是从Let’s Encrypt获得免费SSL证书的唯一要求。
要获取令牌和主机的值, 请转到DuckDNS站点并登录。你将需要选择一个未使用的主机名。
查看该图像, 以查看必须在何处复制令牌以及在何处添加主机名。你必须单击”添加域”按钮以保留主机名。
配置你的实例
假设你具有所有参数并已编辑脚本, 则可以启动实例了。登录到Amazon Web Services管理界面, 转到EC2实例面板, 然后单击”启动实例”。
在第一个屏幕中, 你将选择一个图像。该脚本是围绕Amazon Linux构建的, 没有其他可用选项。选择” Amazon Linux”, 这是”快速入门”列表中的第一个选项。
在第二个屏幕上, 选择实例类型。考虑到所运行软件的大小, 可以使用多种服务, 并且至少需要4GB的内存, 因此建议你选择t2.medium实例。你可以缩小它, 如果关闭某些服务, 则使用t2.small;如果仅希望使用台式机, 则可以使用微型。
在第三个屏幕上, 单击”高级详细信息”, 然后粘贴在上一步中配置的脚本。我还建议你启用防止终止的保护, 以免意外终止不会丢失所有工作。
下一步是配置存储。实例的默认值为8GB, 不足以容纳我们将要构建的所有映像。我建议将其增加到20GB。另外, 虽然不需要, 但我建议另一个至少10GB的块设备。该脚本会将第二个块设备安装为数据文件夹。你可以为其内容制作快照, 终止实例, 然后使用快照重新创建实例并恢复所有工作。此外, 自定义阻止设备不会在你终止实例时丢失, 因此具有防止意外丢失数据的双重保护。为了进一步提高安全性, 你可以使用Dropbox自动备份数据。
第五步是命名实例。选择你自己的。第六步提供了一种配置防火墙的方法。默认情况下, 只有SSH可用, 但我们也需要HTTPS, 因此请不要忘记添加一条打开HTTPS的规则。你可以向世界开放HTTPS, 但最好只对你的IP开放, 以防止其他人访问你的桌面和外壳, 即使它仍受密码保护。
完成最后的配置后, 即可启动实例。你会注意到, 自初始化脚本运行以来, 首次初始化可能要花费几分钟, 它还会执行一些冗长的任务, 例如使用Let’s Encrypt生成HTTPS证书。
当你最终看到带有确认的”正在运行”管理控制台, 而不再是”正在初始化”时, 就可以使用了。
假设所有参数正确, 你可以导航到https://YOURHOST.duckdns.org。
用你选择的主机名替换YOURHOST, 但不要忘记它是HTTPS站点, 而不是HTTP, 因此与服务器的连接已加密, 因此必须在URL中写入https //。该网站还将提供有效的”加密”证书。如果在获取证书时遇到问题, 则初始化脚本将生成一个自签名证书。你仍然可以使用加密连接进行连接, 但是浏览器会警告你这是一个未知站点, 并且连接不安全。它不应该发生, 但你永远不会知道。
假设一切正常, 然后访问Web终端Butterfly。你可以使用用户应用程序和在设置脚本中输入的密码登录。
登录后, 你将拥有一个自举虚拟机, 该虚拟机还包括Docker和其他东西, 例如Nginx Frontend, Git和Butterfly Web Terminal。现在, 你可以通过为你的开发环境构建Docker映像来完成设置。
接下来, 键入以下命令:
git clone https://github.com/sciabarra/BigDataDevKit
cd BigDataDevKit
sh build.sh
最后一个命令还将要求你输入用于桌面访问的密码。完成后, 它将开始构建图像。请注意, 构建大约需要10分钟, 但是你可以看到正在发生的事情, 因为所有内容都显示在屏幕上。
构建完成后, 你还可以使用以下命令安装Dropbox:
/app/.dropbox-dist/dropboxd
系统将显示你必须单击以启用Dropbox的链接。你需要登录Dropbox, 然后完成。无论你放置在Dropbox文件夹中的内容是什么, 都会在所有Dropbox实例之间自动同步。
完成后, 你可以重新启动虚拟机, 并通过https://YOURHOST.dyndns.org/vnc.html URL访问你的环境。
你可以停止机器并在恢复工作时重新启动。访问URL保持不变。这样, 你将只为使用它的时间付费, 加上每月额外的已用存储空间费用。
保存数据
以下讨论需要有关Docker和Amazon如何工作的一些知识。如果你不希望了解详细信息, 只需记住以下简单规则:在虚拟机中, 有一个/ app / Dropbox文件夹可用, 你在/ app / Dropbox中放置的任何内容都将保留, 而其他所有内容都是一次性的, 可以走开。为了进一步提高安全性, 还将你的宝贵代码存储在版本控制系统中。
现在, 如果你确实想了解这一点, 请继续阅读。如果你在虚拟机创建过程中遵循了我的指示, 则会保护虚拟机免于终止, 因此你不会意外销毁它。如果你明确决定终止它, 则主卷将被销毁。所有Docker映像都将丢失, 包括你所做的所有更改。
但是, 由于/ app / Dropbox文件夹是作为容器的Docker卷安装的, 因此它不是Docker映像的一部分。在虚拟机中, 文件夹/ app安装在你创建的Amazon Volume中, 即使你明确终止虚拟机也不会销毁该文件夹。要删除该卷, 必须明确删除它。
请勿将作为Docker逻辑实体的Docker卷与作为某种物理实体的Amazon Volumes混淆。发生的是将/ app / Dropbox Docker卷放置在/ app Amazon卷内。
终止虚拟机时, Amazon Volume不会自动销毁, 因此保留其中的任何内容, 直到你明确销毁该卷为止。此外, 你在Docker卷中放置的任何内容都存储在容器外部, 因此在销毁容器时不会销毁它。如果按照建议启用了Dropbox, 则将所有内容复制到Dropbox服务器, 如果将Dropbox与计算机同步, 则所有内容都将复制到硬盘。另外, 建议将源代码存储在版本控制系统中。
因此, 如果将内容放置在Dropbox文件夹下的版本控制系统中, 则丢失数据必须全部完成:
- 你明确终止虚拟机。
- 你明确从虚拟机中删除数据卷。
- 你明确从Dropbox中删除数据, 包括历史记录。
- 你明确从版本控制系统中删除数据。
我希望你的数据足够安全。
我为每个项目保留一个虚拟机, 完成后, 将未使用的虚拟机关闭。当然, 我所有代码都在GitHub上, 并备份在Dropbox中。此外, 当我停止处理项目时, 会在完全删除虚拟机之前对Amazon Web Services块进行快照。这样, 无论何时恢复项目(例如进行维护), 我所需要做的就是使用快照启动新的虚拟机。我所有的数据都恢复原位, 我可以继续工作。
优化访问
首先, 如果你具有直接的Internet访问权限, 而不是由代理进行中介, 则可以使用本机SSH和VNC客户端。如果需要将文件复制进出虚拟机, 则直接SSH访问非常重要。但是, 对于文件共享, 你应该考虑将Dropbox作为更简单的选择。
VNC Web访问是无价的, 但是有时它比本地客户端要慢。你可以使用端口5900访问虚拟机上的VNC服务器。你必须明确将其打开, 因为默认情况下它是关闭的。我建议你仅将其打开到你的IP地址, 因为互联网上到处都是”机器人”, 它们会扫描互联网以寻找要连接的服务, 而VNC经常成为这些机器人的目标。
总结
本文介绍了如何利用现代云技术来实施有效的开发环境。尽管云中的机器不能完全替代你的工作计算机或笔记本电脑, 但在具有访问IDE的重要性时, 它足以进行开发工作。以我的经验, 使用当前的Internet连接, 它的运行速度足够快。
在云中, 服务器访问和操作要比在本地进行更快。你可以快速增加(或减少)内存, 启动其他环境, 创建映像等等。你触手可及的数据中心, 而当你处理大数据项目时, 就需要强大的服务和大量空间。这就是云所提供的。