基礎から学ぶNode.js

第5回Node.jsアプリケーションをHerokuで動かす

はじめに

前回までで、Node.jsによる簡単なWebアプリケーションが一通り完成しました。今回はこの構築したアプリケーションを、クラウドベースのアプリケーションホスティングサービスであるHeroku上で、動かしてみたいと思います。HerokuはNode.js以外にもJava, Ruby, Pythonなどのアプリケーションをデプロイすることができます。

Herokuのセットアップ

まず、Herokuのサイトから、⁠Sign up」ボタンよりアカウントを登録してください。

図1 Herokuのサイト
図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 サービス(一部)
図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/ | git@heroku.com: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アプリ
図3 Herokuで動作しているfirstappアプリ 図3 Herokuで動作しているfirstappアプリ 図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の連携を試してみたいと思います。

おすすめ記事

記事・ニュース一覧