heroku+node.jsでHello Worldしてみた(1)

ずいぶん前から話題になっている heroku を試してみました。今回は、herokuとnode.jsを使ってHello Worldしてみましたので、その記録です。
JavaScriptを使うのもほぼ初めて、herokuも初めて、当然Node.jsも初めて、という初めてづくしなのでおかしなところもあるかもしれません。環境はLinuxMint17.1 32bitです。

参考にしたのは「2013-07-07 herokuでNode.jsの動く環境構築してみた!」です。基本的には(2)まではこの記事を辿っただけです。(途中からNode.js + Express環境前提での記載になります)

1.herokuのアカウント作成&準備

herokuのサイトでサインアップします。お決まりのメールアドレスをIDとするタイプです。
メールアドレスをIDとして入力すると、そのアドレスに確認用のリンクアドレス付きのメールが送られてきます。そこにアクセスしてパスワードを設定します。

パスワード設定後、ログインすると、どの言語を使うか(Getting Started with Heroku)聞いてきます。

Screenshot-1000

今回はNode.jsを選択してみます。

Screenshot-1001

Node.jsとnpmがインストールされていることが条件のようですので、ここで一旦herokuから離れます。

2.node.jsとnpmのインストール

すでにnodejsコマンドとnpmコマンドはインストール済みなので割愛。
デフォルトで入っているアマチュアパケット無線用のnodeパッケージを削除(中身はないようだけど)して、node.jsをインストールします。

$ sudo apt-get --purge remove node
$ sudo apt-get --purge remove nodejs
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update
$ sudo apt-get install nodejs
$ nodejs -v
v0.10.37
$ node -v
v0.10.37

無事にインストールできたようです。

3.heroku toolbeltのインストール

「Getting Started with Node.js on Heroku」のSet upのところで、heroku toolbeltのインストールをします。Debian/Ubuntuを選ぶと、コマンドラインで以下を実行するよう表示されます。

Screenshot-1002

Rubyがインストールされている必要があるようですので、以下の通りコンソールから入力します。

$ sudo apt-get install ruby

とした後、

$ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

としてインストールします。

4.herokuにログイン

~/heroku $ heroku login
Enter your Heroku credentials.
Email: xxxxxxxxxx@xxxxxx.xxx
Password (typing will be hidden): 
Authentication successful.
~/heroku $

問題なく成功したので、Set upのところの「I have installed the Toolbelt」をクリックします。すると次の「Prepare the app」に進みます。

5.サンプルアプリを動かす

Getting Started with Node.js on Heroku」の「Prepare the app」「Deploy the app」「View logs」に沿って操作していけばサンプルアプリは容易に動きます。
詳細は省略。その後の説明は、

  • ログは「$ heroku logs –tail」で確認可能
  • Procfileにはアプリを起動するためのコマンドを記述する。プロセスタイプの「web」に続いて、node.jsの場合には「node ファイル名.js」。webはherokuのHTTPルーティングスタックを使うためのもので、デプロイされた時にWebトラフィックを受信する、ということみたい。
  • package.jsonにはアプリケーションの依存関係を記述する。ファイルは「$ npm init」で作成できる。packages.jsonはアプリケーションのherokuで動かす際のNode.jsのバージョンと、アプリケーションの依存関係の両方を決定する。アプリケーションがデプロイされると、herokuはpackages.jsonを読み込んでnpm installコマンドを使って適切なバージョンのnode.jsと依存ファイルをインストールする。
  • アプリケーションをローカルで動かすためには「$ foreman start web」とするが、LinutMint17.1では「node」コマンドはアマチュアパケット無線用のNodeとなっており、node.jsは「nodejs」コマンドで起動することになっているため失敗してしまう。.bashrcに「alias node nodejs」と記述して新しいterminalで起動してもダメ。「$ sudo ln -s nodejs node」としてからだと、
    ~/heroku/node-js-getting-started $ foreman start web
    11:04:52 web.1  | started with pid 10609
    11:04:52 web.1  | 
    11:04:52 web.1  | /home/xxx/heroku/node-js-getting-started/index.js:2
    11:04:52 web.1  | var app = express();
    11:04:52 web.1  |           ^
    11:04:52 web.1  | TypeError: object is not a function
    11:04:52 web.1  |     at Object.<anonymous> (/home/xxx/heroku/node-js-getting-started/index.js:2:11)
    11:04:52 web.1  |     at Module._compile (module.js:456:26)
    11:04:52 web.1  |     at Object.Module._extensions..js (module.js:474:10)
    11:04:52 web.1  |     at Module.load (module.js:356:32)
    11:04:52 web.1  |     at Function.Module._load (module.js:312:12)
    11:04:52 web.1  |     at Function.Module.runMain (module.js:497:10)
    11:04:52 web.1  |     at startup (node.js:119:16)
    11:04:52 web.1  |     at node.js:902:3
    11:04:52 web.1  | exited with code 8
    11:04:52 system | sending SIGTERM to all processes
    ~/heroku/node-js-getting-started $

    となってやはりうまくいかない。
    ぐぐるさんに聞いてみると・・・同じ課題の人がいるようです。前の方の「2.node.jsとnpmのインストール」を修正しました。
    改めて試してみましたが、

    ~/heroku/node-js-getting-started $ foreman start web
    11:24:13 web.1  | started with pid 14932
    11:24:13 web.1  | 
    11:24:13 web.1  | module.js:340
    11:24:13 web.1  |     throw err;
    11:24:13 web.1  |           ^
    11:24:13 web.1  | Error: Cannot find module 'express'
    11:24:13 web.1  |     at Function.Module._resolveFilename (module.js:338:15)
    11:24:13 web.1  |     at Function.Module._load (module.js:280:25)
    11:24:13 web.1  |     at Module.require (module.js:364:17)
    11:24:13 web.1  |     at require (module.js:380:17)
    11:24:13 web.1  |     at Object.<anonymous> (/home/tom/heroku/node-js-getting-started/index.js:1:77)
    11:24:13 web.1  |     at Module._compile (module.js:456:26)
    11:24:13 web.1  |     at Object.Module._extensions..js (module.js:474:10)
    11:24:13 web.1  |     at Module.load (module.js:356:32)
    11:24:13 web.1  |     at Function.Module._load (module.js:312:12)
    11:24:13 web.1  |     at Function.Module.runMain (module.js:497:10)
    11:24:13 web.1  | exited with code 8
    11:24:13 system | sending SIGTERM to all processes
    ~/heroku/node-js-getting-started $

    となってうまくいきません。(気を取り直して再起動すると、Synapticがherokuとheroku-toolbeltのアップデートを要求してきましたが、その後でもやはりダメ・・・)
    「$ npm install」したあと「$ npm init」で package.json を作りなおしたらうまくいった模様。

  • その他、herokuの外のサービスとして長大なログを取るもの、コンソール起動の仕方(ワンライナーを動かすなど)、環境変数の渡し方・取得の方法、データベースの使い方などの記載があります。

(2)へ続きます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)