ずいぶん前から話題になっている 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)聞いてきます。
今回はNode.jsを選択してみます。
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を選ぶと、コマンドラインで以下を実行するよう表示されます。
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)へ続きます。