クラウドでのクラウド向けの開発:AWSでのDockerを使用したビッグデータ開発
公開: 2022-03-11なぜあなたはそれを必要とするかもしれませんか?
私は開発者であり、Intellij IDEAやEclipseなどの統合開発環境(IDE)で毎日働いています。 これらのIDEはデスクトップアプリケーションです。 Googleドキュメントの登場以来、ワードプロセッサやスプレッドシートアプリケーションに相当するオンラインを使用して、WordまたはExcelのデスクトップバージョンからクラウドに作業を移行する人が増えています。
仕事を続けるためにクラウドを使用することには明らかな理由があります。 今日、従来のデスクトップビジネスアプリケーションと比較して、一部のWebアプリケーションには機能面で大きな欠点がありません。 コンテンツはWebブラウザがあればどこでも利用でき、最近ではほとんどどこでも利用できます。 コラボレーションと共有が簡単になり、ファイルが失われる可能性が低くなります。
残念ながら、これらのクラウドの利点は、ソフトウェア開発の世界ではビジネスアプリケーションほど一般的ではありません。 オンラインIDEを提供する試みはいくつかありますが、それらは従来のIDEにほど遠いものです。
それはパラドックスです。 毎日のコーディングのためにデスクトップにバインドされている間、ソフトウェアは複数のサーバーで生成されるようになりました。 開発者は、自分のコンピューターにこれ以上保持できないものを処理する必要があります。 実際、ラップトップはもはや処理能力を向上させていません。 ラップトップに16GBを超えるRAMを搭載することはまれで高価であり、新しいデバイス、たとえばタブレットはさらに少なくなります。
ただし、ソフトウェア開発のために従来のデスクトップアプリケーションを置き換えることがまだ不可能な場合でも、開発デスクトップ全体をクラウドに移動することは可能です。 ラップトップにすべてのソフトウェアをインストールする必要がなくなったことに気付いた日、Webバージョンの端末とVNCが利用できることに気づき、すべてをクラウドに移行しました。 最終的に、私はその環境を自動化された方法で作成するためのビルドキットを開発しました。
この記事では、Scalaおよびビッグデータアプリケーション用のクラウドベースの開発環境を構築するための一連のスクリプトを紹介します。AmazonAWSのDockerで実行され、IntelliJ IDE、Spark、Hadoop、Zeppelinをサービスとして使用するWebアクセス可能なデスクトップで構成されます。 、およびWebベースのSSH、SBT、Ammoniteなどのコマンドラインツールもあります。 キットはGitHubから無料で入手できます。ここでは、キットを使用してインスタンスを構築する手順について説明します。 環境を構築し、特定のニーズに合わせてカスタマイズできます。 起動して実行するのに10分以上かかることはありません。
「BigDataDevKit」には何が含まれていますか?
キットを開発する上での私の主な目標は、開発環境を、使用するすべてのサービスとサーバーを使用して簡単に起動し、不要になったときに破棄できるものにすることでした。 これは、ビッグデータプロジェクトで作業する場合のように、さまざまなプロジェクトで作業する場合に特に重要です。その中には、多数のサーバーやサービスが関係するものもあります。
私の理想的なクラウドベースの環境は次のようになります。
- すべての通常の開発ツール、最も重要なのはグラフィカルIDEを含めます。
- 必要なサーバーとサービスをすぐに利用できます。
- ゼロから簡単かつ迅速に作成でき、さらにサービスを追加するために拡張可能です。
- Webブラウザのみを使用して完全にアクセスできるようにします。
- 必要に応じて、専用クライアント(VNCクライアントおよびSSHクライアント)でのアクセスを許可します。
最新のクラウドインフラストラクチャとソフトウェア、最新のブラウザーのパワー、ブロードバンドの広範な可用性、および貴重なDockerを活用して、Scalaとビッグデータ開発用の開発環境を作成しました。
現在、私はMacBook Pro、Surface Tablet、またはiPad(キーボード付き)のいずれかからいつでも作業できますが、最後のオプションは理想的ではありません。 これらのデバイスはすべて単なるクライアントです。 デスクトップとすべてのサーバーはクラウドにあります。
私の現在の環境は、次のオンラインサービスを使用して構築されています。
- サーバー用のアマゾンウェブサービス。
- コードを保存するためのGitHub。
- ファイルを保存するためのDropbox。
また、動的IPアドレス用のDuckDnsや無料のSSL証明書を取得するための暗号化などの無料サービスもいくつか使用しています。
この環境では、私は現在持っています:
- Intellijアイデアを使用したグラフィカルデスクトップ。Webブラウザからアクセスできます。
- SBTやAmmoniteなどのWebアクセス可能なコマンドラインツール。
- ファイルを保存し、MapReduceジョブを実行するためのHadoop。
- スケジュールされたジョブ用のSparkJobServer。
- Webベースのノートブック用のZeppelin。
最も重要なことは、WebアクセスはWebベースのVNCとSSHの両方でHTTPSで完全に暗号化されており、データの損失を防ぐための複数の保護手段があります。もちろん、コンテンツを「所有」していない場合は重要です。物理ハードディスク。 コンピューター上のすべての作業のコピーを自動的に取得し、非常に高速であることに注意してください。 誰かがあなたのパスワードを盗んだためにすべてを失った場合でも、すべてを正しく構成している限り、とにかくコンピュータにコピーがあります。
AWSとDockerでのWebベースの開発環境の使用
それでは、環境がどのように機能するかを説明しましょう。 午前中に仕事を始めるとき、最初に行うことは、すべてのインスタンスが表示されるアマゾンウェブサービスコンソールにログインすることです。 通常、私はさまざまなプロジェクト用に多くの開発インスタンスを構成しており、請求を節約するために未使用のインスタンスはオフのままにしておきます。 結局のところ、私は一度に1つのプロジェクトにしか取り組むことができません。 (まあ、時々私は2つに取り組んでいます。)
だから、私は欲しいインスタンスを選択し、それを開始し、少し待つか、コーヒーを飲みに行きます。 コンピュータの電源を入れるのとそれほど違いはありません。 通常、インスタンスが起動して実行されるまでには数秒かかります。 緑色のアイコンが表示されたら、ブラウザを開いて、よく知られているURL( https://msciab.duckdns.org/vnc.html
にアクセスします。 これが私のURLであることに注意してください。 キットを作成するときに、一意のURLを作成します。
AWSは起動時に各マシンに新しいIPを割り当てるため、ダイナミックDNSサービスを設定しました。これにより、サーバーを停止して再起動した場合でも、常に同じURLを使用してサーバーにアクセスできます。 ブラウザでブックマークすることもできます。 さらに、パスワードやその他の機密データを管理する必要がある場合に備えて、有効なキーを使用してHTTPSを使用し、スニファから作業を完全に保護します。
ロードされると、システムはWebVNCWebクライアントであるNoVNCであなたを歓迎します。 ログインするだけでデスクトップが表示されます。 私は最小限のデスクトップを意図的に使用し、アプリケーションを含むメニューだけを使用しています。私の唯一の贅沢は仮想デスクトップです(開発時に多くのウィンドウを開くため)。 メールについては、私はまだ他のアプリケーション、最近ではほとんど他のブラウザタブに依存しています。
仮想マシンには、ビッグデータアプリケーションを開発するために必要なものがあります。 何よりもまず、IDEがあります。 ビルドでは、IntelliJIdeaコミュニティエディションを使用します。 また、SBTビルドツールとScala REPL、Ammoniteがあります。
ただし、この環境の主な機能は、同じ仮想マシンにコンテナーとしてデプロイされたサービスです。 特に、私は持っています:
- Zeppelin、Scalaコードをその場で使用し、データ分析を行うためのWebノートブック(
http://zeppelin:8080
) - Spark Job Server、Restインターフェース(
http://sparkjobserver:8080
)を使用してsparkジョブを実行およびデプロイします。 - HDFS(
http://hadoop:50070
)からデータを保存および取得するためのHadoopのインスタンス。
これらのURLは固定されていますが、仮想環境内でアクセスできることに注意してください。 次のスクリーンショットで彼らのウェブインターフェースを見ることができます。
各サービスは個別のDockerコンテナで実行されます。 技術的になりすぎることなく、これは仮想マシン内の3つの別個のサーバーと考えることができます。 Dockerを使用する利点は、サービスを追加したり、2つまたは3つの仮想マシンを追加したりできることです。 Amazonコンテナを使用すると、環境を簡単に拡張できます。
最後になりましたが、Web端末を利用できます。 HTTPSを使用してURLにアクセスするだけで、Webページに端末が表示されます。
上のスクリーンショットでは、3台のサーバーとデスクトップであるコンテナーをリストしています。 このコマンドラインシェルを使用すると、コンテナを保持している仮想マシンにアクセスして、コンテナを管理できます。 サーバーが「マトリックス内」(コンテナー内で仮想化)にあるかのようですが、このシェルを使用すると、サーバーとデスクトップを管理するために「マトリックス」の外に逃げることができます。 ここから、コンテナーを再起動し、それらのファイルシステムにアクセスし、Dockerで許可されているその他の操作を実行できます。 ここではDockerの詳細については説明しませんが、DockerのWebサイトには膨大な量のドキュメントがあります。
インスタンスの設定方法
これまでのところこれが好きで、インスタンスが必要ですか? 簡単で安いです。 アマゾンウェブサービスの仮想マシンとストレージのコストだけで入手できます。 現在の構成のキットでは、すべてのサービスを実行するために4GBのRAMが必要です。 必要なときにだけ仮想マシンを使用するように注意し、たとえば月に160時間作業する場合、現在のレートの仮想マシンのコストは160 x $ 0.052、つまり月額$8になります。 ストレージのコストを追加する必要があります。 私は約30GBを使用していますが、すべてを10ドル未満に抑えることができます。
ただし、2 GBを超えるコードをバックアップする場合は、ボットに(最終的な)Dropbox(Pro)アカウントのコストが含まれます。 これにはさらに月額15ドルかかりますが、データに重要な安全性を提供します。 また、有料のGitHubか、無料のプライベートリポジトリを提供するBitbucketなどの別のサービスのいずれかのプライベートリポジトリが必要になります。
必要なときにだけ使うと、専用サーバーよりも安いことを強調したいと思います。 はい、ここで説明するものはすべて物理サーバーでセットアップできますが、ビッグデータを扱うため、他の多くのAWSサービスが必要なので、すべてを同じ場所に配置するのが論理的だと思います。
セットアップ全体を行う方法を見てみましょう。
前提条件
仮想マシンの構築を開始する前に、次の4つのサービスに登録する必要があります。
- アマゾンウェブサービス。
- DuckDNS。
- ドロップボックス。
- 暗号化しましょう。
クレジットカードが必要なのはアマゾンウェブサービスだけです。 DuckDnsは完全に無料ですが、DropBoxは2GBの無料ストレージを提供します。これは多くのタスクに十分です。 Let's Encryptも無料で、証明書に署名するためのイメージを作成するときに内部的に使用されます。 これらに加えて、コードを保存する場合は、GitHubやBitbucketなどのリポジトリホスティングサービスもお勧めしますが、セットアップには必要ありません。
開始するには、GitHubBigDataDevKitリポジトリに移動します。

ページをスクロールして、選択したテキストエディタで画像に表示されているスクリプトをコピーします。
このスクリプトは、イメージをブートストラップするために必要です。 これを変更して、パラメータにいくつかの値を指定する必要があります。 慎重に、引用符内のテキストを変更してください。 引用符自体、バックスラッシュ、ドル記号などの文字は、引用符で囲まない限り、パスワードに使用できないことに注意してください。 この問題は、パスワードにのみ関係します。 安全にプレイしたい場合は、引用符、ドル記号、または円記号を避けてください。
PASSWORD
パラメーターは、Webインターフェースを介して仮想マシンにアクセスするために選択するパスワードです。 EMAIL
パラメータは電子メールであり、SSL証明書を登録するときに使用されます。 電子メールを提供する必要があります。これは、Let'sEncryptから無料のSSL証明書を取得するための唯一の要件です。
TOKEN
とHOST
の値を取得するには、DuckDNSサイトにアクセスしてログインします。未使用のホスト名を選択する必要があります。
画像を見て、トークンをコピーする必要がある場所と、ホスト名を追加する必要がある場所を確認してください。 ホスト名を予約するには、「ドメインの追加」ボタンをクリックする必要があります。
インスタンスの構成
すべてのパラメーターがあり、スクリプトを編集したとすると、インスタンスを起動する準備が整います。 アマゾンウェブサービス管理インターフェースにログインし、EC2インスタンスパネルに移動して「インスタンスの起動」をクリックします。
最初の画面で、画像を選択します。 スクリプトはAmazonLinuxを中心に構築されており、他に利用できるオプションはありません。 クイックスタートリストの最初のオプションであるAmazonLinuxを選択します。
2番目の画面で、インスタンスタイプを選択します。 実行中のソフトウェアのサイズを考えると、複数のサービスがあり、少なくとも4GBのメモリが必要なので、 t2.mediumインスタンスを選択することをお勧めします。 一部のサービスをシャットダウンする場合はt2.smallを使用し、デスクトップのみが必要な場合はmicroを使用して、トリミングすることができます。
3番目の画面で、[詳細]をクリックし、前の手順で構成したスクリプトを貼り付けます。 また、誤って終了してもすべての作業が失われないように、終了に対する保護を有効にすることをお勧めします。
次のステップは、ストレージを構成することです。 インスタンスのデフォルトは8GBですが、これでは、作成するすべてのイメージを含めるには不十分です。 20GBに増やすことをお勧めします。 また、必須ではありませんが、10GB以上の別のブロックデバイスをお勧めします。 スクリプトは、2番目のブロックデバイスをデータフォルダーとしてマウントします。その内容のスナップショットを作成し、インスタンスを終了してから、スナップショットを使用して再作成し、すべての作業を回復できます。 さらに、インスタンスを終了してもカスタムブロックデバイスが失われることはないため、データの偶発的な損失に対する二重の保護があります。 安全性をさらに高めるために、Dropboxを使用してデータを自動的にバックアップできます。
5番目のステップは、インスタンスに名前を付けることです。 あなた自身を選んでください。 6番目のステップは、ファイアウォールを構成する方法を提供します。 デフォルトではSSHのみが使用可能ですが、HTTPSも必要なので、HTTPSを開くルールも追加することを忘れないでください。 HTTPSを世界中に公開することもできますが、パスワードで保護されている場合でも、他のユーザーがデスクトップやシェルにアクセスできないようにするために、IPのみを使用する方がよいでしょう。
この最後の構成が完了したら、インスタンスを起動できます。 初期化スクリプトが実行されているため、初期化にはかなりの数分かかることがあります。また、Let'sEncryptを使用してHTTPS証明書を生成するなどの長いタスクも実行されます。
最終的に管理コンソールが確認付きで「実行中」になり、「初期化中」ではなくなったら、準備は完了です。
すべてのパラメーターが正しいと仮定すると、 https://YOURHOST.duckdns.org
に移動できます。
YOURHOST
を選択したホスト名に置き換えますが、HTTPではなくHTTPSサイトであることを忘れないでください。サーバーへの接続は暗号化されているため、URLにhttps//
を書き込む必要があります。 このサイトでは、Let'sEncryptの有効な証明書も提示されます。 証明書の取得に問題がある場合、初期化スクリプトは自己署名証明書を生成します。 暗号化された接続で接続することはできますが、ブラウザはそれが不明なサイトであると警告し、接続は安全ではありません。 それは起こらないはずですが、あなたは決して知りません。
すべてが機能していると仮定して、WebターミナルのButterflyにアクセスします。 ユーザーapp
とセットアップスクリプトに入力したパスワードを使用してログインできます。
ログインすると、ブートストラップされた仮想マシンが作成されます。この仮想マシンには、Dockerや、Nginxフロントエンド、Git、ButterflyWebターミナルなどの他の機能も含まれています。 これで、開発環境用の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は同じままです。 このように、あなたはそれを使用している時間だけに加えて、使用済みのストレージのために毎月の追加料金を支払います。
データの保存
以下の説明では、DockerとAmazonがどのように機能するかについてある程度の知識が必要です。 詳細を理解したくない場合は、次の簡単なルールに注意してください。仮想マシンには/app/Dropbox
フォルダーがあり、 /app/Dropbox
に配置したものはすべて保持され、その他はすべて使い捨てであり、離れることができます。 セキュリティをさらに向上させるために、貴重なコードもバージョン管理システムに保存してください。
さて、これを理解したいのなら、読み続けてください。 仮想マシンの作成で私の指示に従った場合、仮想マシンは終了から保護されるため、誤って破壊することはできません。 明示的に終了することを決定した場合、プライマリボリュームは破棄されます。 行ったすべての変更を含め、すべてのDockerイメージが失われます。
ただし、フォルダー/app/Dropbox
はコンテナー用のDockerボリュームとしてマウントされるため、Dockerイメージの一部ではありません。 仮想マシンでは、作成したAmazonボリュームに/app
フォルダーがマウントされ、仮想マシンを明示的に終了しても破棄されません。 ボリュームを削除するには、明示的に削除する必要があります。
Docker論理エンティティであるDockerボリュームと、やや物理的なエンティティであるAmazonVolumesを混同しないでください。 何が起こるかというと、 /app
/app/Dropbox
DropboxDockerボリュームは/appAmazonボリューム内に配置されます。
仮想マシンを終了してもAmazonボリュームは自動的に破棄されないため、ボリュームを明示的に破棄するまで、仮想マシンに配置されているものはすべて保持されます。 さらに、Dockerボリュームに入れたものはすべてコンテナーの外部に保存されるため、コンテナーが破棄されても破棄されません。 推奨されているように、Dropboxを有効にした場合、すべてのコンテンツがDropboxサーバーにコピーされ、Dropboxをコンピューターと同期する場合はハードディスクにコピーされます。 また、ソースコードをバージョン管理システムに保存することをお勧めします。
したがって、Dropboxフォルダーの下のバージョン管理システムにデータを配置する場合、データを失うには、次のすべてが発生する必要があります。
- 仮想マシンを明示的に終了します。
- 仮想マシンからデータボリュームを明示的に削除します。
- 履歴を含むデータをDropboxから明示的に削除します。
- バージョン管理システムからデータを明示的に削除します。
あなたのデータが十分に安全であることを願っています。
プロジェクトごとに仮想マシンを保持し、終了したら、未使用の仮想マシンをオフのままにします。 もちろん、すべてのコードはGitHubにあり、Dropboxにバックアップされています。 さらに、プロジェクトでの作業をやめると、仮想マシンを完全に削除する前に、AmazonWebServicesブロックのスナップショットを撮ります。 このように、たとえばメンテナンスのためにプロジェクトが再開するたびに、スナップショットを使用して新しい仮想マシンを起動するだけです。 すべてのデータが元の場所に戻り、作業を再開できます。
アクセスの最適化
まず、プロキシを介さずに直接インターネットにアクセスできる場合は、ネイティブSSHおよびVNCクライアントを使用できます。 仮想マシンにファイルをコピーしたり、仮想マシンからファイルをコピーしたりする必要がある場合は、SSHへの直接アクセスが重要です。 ただし、ファイル共有の場合は、Dropboxをより簡単な代替手段として検討する必要があります。
VNC Webアクセスは非常に貴重ですが、ネイティブクライアントよりも低速になる場合があります。 ポート5900を使用して仮想マシン上のVNCサーバーにアクセスできます。デフォルトでは閉じているため、明示的に開く必要があります。 インターネットは、接続するサービスを探すためにインターネットをスキャンする「ロボット」でいっぱいであり、VNCはそれらのロボットの頻繁なターゲットであるため、IPアドレスでのみ開くことをお勧めします。
結論
この記事では、最新のクラウドテクノロジーを活用して効果的な開発環境を実装する方法について説明します。 クラウド内のマシンは、作業中のコンピューターやラップトップの完全な代替品にはなりませんが、IDEにアクセスすることが重要な場合は、開発作業を行うのに十分です。 私の経験では、現在のインターネット接続では、作業するのに十分な速度です。
クラウド内にあるため、サーバーへのアクセスと操作は、ローカルに配置するよりも高速です。 メモリをすばやく増やしたり減らしたり、別の環境を起動したり、イメージを作成したりすることができます。 あなたはあなたの指先にデータセンターを持っています、そしてあなたがビッグデータプロジェクトで働くとき、まあ、あなたは頑強なサービスとたくさんのスペースを必要とします。 それがクラウドが提供するものです。