状況
- 去年とあるきっかけで Amazon EC2 でインスタンスを立てた
- 放っておくのももったいないしなと思い、半年前に Twitter bot を作った
- RSS フィードやスクレイピングで更新を検知してツイートするだけの機能
- Express などの Web フレームワークは使っていない
- EC2 の無料枠がそろそろ終わるので Heroku へ移行しようと思った
つまづいた
Heroku へのデプロイ、起動までは問題なく進んだのですが、その後ログを見ると
heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
と R10 エラーを吐いて止まっていました。
上の記事にあるように、Heroku ではポート番号を明示的に指定する必要がありますが、自分の作ったアプリで使っている cheerio-httpcli にも feedparser にもポートを指定する機能がありません。
解決法
このような場合は worker プロセスで走らせることで解決できます。
Procfile を作成し、以下の内容を記載。
Procfile
worker: node app.js
コンソールで以下のコマンドを実行。
(Heroku Toolbelt がインスコされていることが前提)
heroku scale web=0 worker=1
自分の場合はこの後何故か「package.json に起動時のコマンドねえぞ」と怒られたので以下の通り修正。
package.json
"scripts": {
"start": "",
"test": "echo \"Error: no test specified\" && exit 1"
}
これで無事に Heroku 上で Twitter bot を動かすことができました。
参考リンク
Process Types and the Procfile | Heroku Dev Center
Heroku:(Application Errorにならないための)Node.jsアプリのデプロイ入門 - Qiita