エンジニアブログ

エンジニアブログ
ノウハウ

シンプルにec2の起動、停止ができるWEBアプリを作ってみました

YT 2014年05月30日

にわかエンジニアのYTです。

前回の投稿からずいぶん空いてしまいました。
不甲斐ない結果を見せた前回の内容ですが、実は AWS SDK for JavaScript in the browser はEC2には未対応だったんですね!
ロクにドキュメントも読まずに記事を書いた事が露呈しましたね。

さて今回は、NodeとAngularJSの勉強を兼ねて業務の合間に作ってみたアプリを紹介したいと思います。

 

cm1.png

こんな画面。デザインはbootstrap使っとけばセンス無いエンジニアでも大丈夫と聞いたのでその方向でほぼCSS書いてません。

何ができるの?

EC2インスタンスの起動と停止、指定時間での起動、停止予約ができます。

え?AWS Management Console + IAM でいいじゃん。むしろ機能低下が甚だしくて使う気が起きないんですけど。

正論すぎてぐうの音も出ません。
が、「Management Consoleは英語だし・・・。ネットワークの知識とか無いと触っちゃいけない所がドコなのかもよくわからないし・・。」というアレルギー持ちの人がきっといるはず!という信念の下で開発しました。嘘です。勉強がてらいじってたら出来上がってました。

使ってるの?

バリバリです!
実際、サーバ構築したりネットワークいじったりする人は社内でも1割か2割ぐらいで、それ以外の人達はサーバを「使う」人です。
これまでオンプレのサーバは「トラブルがない限りずっと起動しててくれるもの」でしたが、クラウド時代になり「使う時だけ起動するもの」に変わりました。
ですが「サーバを使いたい」だけの人にはAWSのManagement Consoleはオーバースペックすぎて何をしたらいいのか、何をしてはいけないのかわからない。

そんな風に感じ、IaaSのメリットである「使った分だけ課金」を最大限に活かす為「使う人が自分で起動/停止ができるようにする」という目的で利用しています。

裏側の話

冒頭でも少し書きましたが、今回はサーバサイドをNodeで作っています。
Node の express フレームワークとAWS SDK for JavaScript を組み合わせて、サーバサイドはAWSのAPIに対してリクエストを投げてクライアントにJSONでレスポンスを返すだけです。

クライアントサイドにはAngularJSを使ってみました。

経験の無いところを手探りでやっていたので時間もかかるしソースは汚いしなんのドキュメントも書いてないし所々バグってるしで散々ですが、上司に公開しろと言われたのでとりあえず公開しておきます。pull req / issue どんと来い!

インストール

Node のインストール

Nodeのバージョンですが、僕は0.10.24を今のところ利用しています。
それ以外のバージョンでは多分動かないと思われます。

Nodeのインストールはコチラからバイナリをダウンロードしてインストーラを起動するだけです。

ソースのダウンロード

gitが入っている方はターミナルまたはコマンドプロンプトで下記コマンドを実行すればOKです。

# git clone https://github.com/stsap/ec2console.git

git使わない場合はコチラからZIPダウンロードして展開でOKです。

依存モジュールのインストール

ソースを展開したディレクトリで下記のコマンドを実行します

# npm install

これで自動的に依存しているモジュールを取得してくれます。便利!

アクセスキー、シークレットアクセスキーの設定

ソースの中に config/aws.json というファイルがあります。
このファイル内の accessKeyId と secretAccessKey に、お持ちのAWSアカウントのアクセスキー、シークレットアクセスキーを入力します。

{
    "accessKeyId": "AKIA****************",
    "secretAccessKey": "DM**********************",
    "region": "ap-northeast-1"
}

起動

ソース内に app/ というディレクトリがありますので、ここに移動して下記コマンドを実行すると起動します。

# node app.js

あとはブラウザで http://localhost:3000 にアクセスするとアプリが動作します。

今後の話

これまでも社内からの要望を取り入れたりしながら牛歩で開発してきていますので、今後もそんな感じで緩くメンテナンスしていこうかなぁと思っています。

現時点での構想としては

  • こんな感じでインスタンス毎にRoute53をDDNSのように使うように仕込んでいるのが煩雑なので、このアプリ経由で起動した場合には自動でRoute53のレコード変更もするように機能追加する。ManagementConsoleから起動した人は自分でRoute53もいじれ。
  • インスタンスに付いてるタグを見て、定期的にスナップショットを取ったりスナップショットの世代管理をしたりする。
    これは上司がいつのまにかそれっぽいタグをインスタンスに付けて無言の圧力をかけてきているのでそのうちに実装します。
  • アプリに認証機能を設けて、IAMアカウントと対応付ける事でインスタンスの表示/非表示をIAMで管理。
    なんでも表示されてると間違って停止したりしたら一大事なので実装しないといけないんだろうなぁと。素直にIAM作ってManagementConsole使ったほうがマシですね!
  • WebSocket化

といったところですが、そんな事よりドキュメント書いたりテスト書いたりリファクタリングしたりしないといけないので機能追加は後回しになりそうな感じです。
そもそもフレームワークの選定をミスった感があるので近いうちに作り直しそうです。