はじめに
前回 までで、Node.jsによる簡単なWebアプリケーションが一通り完成しました。今回はこの構築したアプリケーションを、クラウドベースのアプリケーションホスティングサービスであるHeroku上で、動かしてみたいと思います。HerokuはNode.js以外にもJava, Ruby, Pythonなどのアプリケーションをデプロイすることができます。
Herokuのセットアップ
まず、Heroku のサイトから、「 Sign up」ボタンよりアカウントを登録してください。
図1 Herokuのサイト
さらに、heroku toolbelt というHeroku用コマンドラインツールや開発およびデプロイに使うアプリケーション一式が提供されています。こちらを各々の環境に合わせてインストールします。
インストールが終わったら、コマンドラインからherokuに対する認証処理を行っておきましょう。
$ heroku login
Enter your Heroku credentials.
Email: <サインアップ時のメールアドレス>
Password: <サインアップ時のパスワード>
この一連の処理で、herokuにアクセスするためのSSH公開鍵の設定まで行われます。
MongoDB用サービスMongoHQを利用
Herokuは様々PasSサービスをアドオンとして利用できます。Herokuが標準で提供するデータベースはPostgreSQLですが、MongoDBもそのアドオンサービスを利用して使うことができます。執筆時点で提供されているMongoDBのサービスは、MongoHQとMongoLabになります。今回はMongoHQを使ってみます。
図2 HerokuのAdd-on サービス(一部)
アドオンの追加は、コマンドベースでもブラウザからでも行えます。ただ、無料サービスのみの利用であってもクレジットカード情報の登録が必須となっています。ブラウザから「My Account」ページにアクセスして、「 Billing Info」の [Verify] ボタンから情報を入力しておきます。
MongoDBは前回の記事でも触れましたが、データベースやコレクションを必要になった時点で自動作成するため、一般的なDBMSのように予めスキーマ作成などの準備が要りません。そのため非常に簡単に利用することができます。
Heroku+MongoHQ用の修正
前回までに作成したアプリfirstappをHerokuにデプロイするために若干修正を加えます。
まずMongoHQの接続先は、Herokuの実行環境で提供される環境変数MONGOHQ_URLから設定します。そのためmodel.jsの先頭を下記のとおり修正します。
const MONGO_URL = process.env.MONGOHQ_URL;
var mongoose = require('mongoose');
var db = mongoose.connect(MONGO_URL);
…以下省略…
ちなみにMongoLabの場合は接続先URLをprocess.env.MONGOLAB_URIで取得できます。
続いて、Node.jsで起動するHTTPサーバのポートを修正します。3000番で固定していましたが、こちらも環境変数PORTの値を指定する必要があります。app.jsを下記のとおり修正します。
…以上省略…
var port = process.env.PORT || 3000;
app.listen(port, function(){
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
});
さらに使用するNode.jsやnpmのバージョンをpackage.jsonを使って指定します。expressによるcreate時にテンプレートからpackage.jsonは作成されており、依存モジュールの設定は入っています。
{
"name": "firstapp"
, "version": "0.0.1"
, "private": false
, "dependencies": {
"express": "2.5.11"
, "ejs": ">= 0.0.1"
}
, "engines": {
"node": "0.8.x"
, "npm": "1.1.x"
}
}
Herokuではアプリケーションプロセスの管理をForemanによって行います。そのためにアプリケーションの起動に関して、Procfileというファイルに定義します。
web: node app.js
上記の内容で、アプリのルートディレクトリの直下にProcfileを作成します。
Herokuにデプロイ
Herokuへのデプロイは、アプリケーションごとに用意されるGitリポジトリにコミットすることで行います。
まずアプリのルートディレクトリにおいて、Gitのローカルリポジトリを作成します。そしてルートディレクトリ以下のファイルを、全て追加およびコミットします。
$ cd firstapp
$ git init
$ git add .
$ git commit -m "My first commit"
Herokuに新しいアプリケーションを作成します。自動的にそのリポジトリがローカルに登録されます。
$ heroku create
Creating xxxx-xxxx-xxx... done, stack is cedar
http://xxxx-xxxx-xxx.herokuapp.com/ | [email protected] :xxxx-xxxx-xxx.git
Git remote heroku added
さらにMongoHQのFREE版を追加します。ブラウザの「My Apps」から当該アプリの詳細ページに進んでそこから追加することもできます。前述のとおり無料であってもクレジットカード情報の登録が必要です。
$ heroku addons:add mongohq:free
最後にherokuリポジトリにプッシュします。
$ git push heroku master
以上でHerokuのNode.js環境にアプリケーションがデプロイされ、npmによって依存モジュールがインストールされます。これらは、先ほどのpackage.jsonに従ったバージョンが使われます。
Herokuでアプリケーションを起動
Web dyno(dynoとは、Herokuにおけるアプリケーションインスタンスの単位です。)を使って、Webアプリケーションを起動します。
$ heroku ps:scale web=1
Scaling web processes... done, now running 1
1アカウントに付き、1 dynoまでは無料になっています。またWebとは別にバックグランド処理を行うためのWorkerというdynoも存在します。
「heroku create」時に出力されたURL(<アプリケーション名>.herokuapp.com)にブラウザからアクセスすると、動作確認できます。
図3 Herokuで動作しているfirstappアプリ
アプリケーションのプロセスログは
$ heroku logs
で確認することができます。
停止したいときは、下記のように「heroku ps:stop」を実行します。
$ heroku ps:stop web=1
Stopping web=1 processes... done
最後に
今回は、有名なクラウドホスティングサービスのHeroku上に、Node.jsアプリをデプロイしてみました。とてもシンプルで使い勝手の良いPasSだと思います。ただGitなどの最新技術の知識が一通りないと、なかなか目的までに辿り着くのが大変かもしれませんね。次回は、別のクラウドサービスとNode.jsの連携を試してみたいと思います。