Q1:Herokuでバックグラウンド処理は扱える? Webアプリケーションのような様々なユーザーと対話しながら実行されるリアルタイム処理とは異なり、バックグラウンド処理は、メールの一括送信やデータの削除処理といった、定期的に実行した方が効率的とされるプログラムの実行に利用します。 Herok...
Q1:Herokuでバックグラウンド処理は扱える?
Webアプリケーションのような様々なユーザーと対話しながら実行されるリアルタイム処理とは異なり、バックグラウンド処理は、メールの一括送信やデータの削除処理といった、定期的に実行した方が効率的とされるプログラムの実行に利用します。
HerokuにはWebアプリケーションの他にもバックグラウンドで処理する機能がいくつか提供されており、利用用途に応じて使い分けることになります。ここでは以下の2つを紹介します。
Heroku Scheduler
Heroku Schedulerは、Herokuのアドオンとして提供されており、Heroku上にデプロイしたプログラムを指定の期間で繰り返し実行させることができます。
heroku runコマンド
heroku runは、HerokuよりCLI(Command Line Interface)として提供されているHerokuツールに含まれるコマンドです。このコマンドを利用することで、Heroku上のプログラムをコマンドラインから直接実行することができます。
Herokuでのバックグランド実行の単位は、前回の記事で紹介したWebアプリケーションのプロセス数単位であるWeb Dynosと同様にWorker Dynosというプロセス単位で数えられ、1 Worker毎に$0.05/hとなっています。
Q2:ジョブの定期実行はどうやるの?
設定した期間で定期的にジョブを実行させるには、Herokuではアドオンで用意されているHeroku Schedulerを利用します。cronというアドオンも登録されていますが、現在は非推奨となっており、その代わりとしてこのSchedulerを利用することが推奨されています。
Heroku Schedulerは、指定の時間の間隔(10分、1時間、1日おき)で定期的にアプリケーション上のコマンドを実行する機能です。Ruby on RailsアプリケーションであればRakeタスク(RakeはRubyで記述されたタスクをコマンドから呼び出す機能)を作成し、Schedulerに登録して定期的に実行させます。また、スクリプトファイルを直接Schedulerに登録することができるので、直接rubyスクリプトや、bashスクリプトをバックグラウンド処理として実行させることが出来ます。
ここではRakeタスクによるSchedulerの利用を紹介します。まずはプロジェクトがSchedulerを利用できるようにherokuコマンドを利用します。
$ heroku addons:add scheduler:standard
次に、”Hello World”と出力するRakeタスクをRailsアプリケーションのlib/tasksにscheduler.rakeとして保存し、Herokuにデプロイします。
task :output_greeting => :environment do puts "rake task is running..." puts "Hello World." end
次にHeroku上のアプリケーションのHeroku Schdulerページからジョブを登録します。コマンドラインからheroku addons:open schedulerを実行することでブラウザが起動し、Heroku Schedulerページが表示されます。ここでスクリプトが定期的に実行されるジョブとして登録され、それ以降、定期的に実行されます。
後述するheroku logsコマンドを実行すると次のようにRakeタスクが実行されていることが分かります。
2012-04-30T17:33:29+00:00 heroku[run.1]: State changed from created to starting 2012-04-30T17:33:37+00:00 heroku[run.1]: Starting process with command `bundle exec rake output_greeting` 2012-04-30T17:33:38+00:00 heroku[run.1]: State changed from starting to up 2012-04-30T17:33:40+00:00 app[run.1]: rake task is running... 2012-04-30T17:33:40+00:00 app[run.1]: Hello World. 2012-04-30T17:33:41+00:00 heroku[run.1]: Process exited with status 0 2012-04-30T17:33:41+00:00 heroku[run.1]: State changed from up to complete
Q3:ジョブをHerokuの外部から実行するにはどうしたらいい?
Herokuの外部からジョブを実行するには、Q1でも紹介したHerokuツールのrunコマンドを利用します。このコマンドはHerokuの仮想環境下でコマンドを実行することができます。つまり、ローカル環境のPCなどからheroku runコマンドを使用することで、Heroku上にデプロイしたプログラムを実行することができるのです。
この機能を社内システムのバッチ処理の途中に組み込むことで、Herokuを社内のバッチ実行環境の1つとして利用することが可能となります。
以下に、Q2で使用したrakeタスク、rubyスクリプト、bashスクリプトを、ローカル環境でheroku runコマンドを実行した結果を載せます。
$ heroku run rake output_greeting Running rake output_greeting attached to terminal... up, run.1 rake task is running... Hello World.
このように、ローカル環境からHeroku上のプログラムを実行し、その結果を標準出力として受け取りますので、処理結果をローカル環境でハンドリングすることができます。
Q4:ジョブやプロセスの監視はどうやるの?
通常のシステムでは、バッチ処理実行中にプロセスが正常に稼働しているか、エラーが発生していないか、ログやプロセスを確認して監視していると思います。Herokuでもプロセスやログを確認するための機能がherokuコマンドで提供されています。
プロセスの監視
heroku psコマンド※
コンソール(Windowsならばコマンドプロンプト)を開き、対象アプリケーションのローカルgitリポジトリから「heroku ps」を実行すると、対象のアプリケーションのプロセスの実行状況を確認できます。
$ heroku ps Process State Command ------------ ------------------ --------------------------------------------- web.1 up for 8h bundle exec thin start -p $PORT -e production web.2 up for 3m bundle exec thin start -p $PORT -e production worker.1 up for 1m bundle exec stalk worker.rb
コマンドの実行結果から、ジョブごとのプロセスの状態が確認できます。実行した場合の処理のイメージは以下のようになります。
ログの監視
heroku logsコマンド※
「heroku ps」と同じくコンソールから「heroku logs」を実行すると対象のアプリケーションのサーバーログが取得できます。
$ heroku logs 2010-09-16T15:13:46-07:00 app[web.1]: Processing PostController#list (for 208.39.138.12 at 2010-09-16 15:13:46) [GET] 2010-09-16T15:13:46-07:00 app[web.1]: Rendering template within layouts/application 2010-09-16T15:13:46-07:00 app[web.1]: Rendering post/list 2010-09-16T15:13:46-07:00 app[web.1]: Rendered includes/_header (0.1ms)2010-09-16T15:13:46-07:00 app[web.1]: Completed in 74ms (View: 31, DB: 40) | 200 OK [http://myapp.heroku.com/] 2010-09-16T15:13:46-07:00 heroku[router]: GET myapp.heroku.com/posts queue=0 wait=0ms service=1ms bytes=975 2010-09-16T15:13:47-07:00 app[worker.1]: 2 jobs processed at 16.6761 j/s, 0 failed ...
「heroku logs」ではオプションに「–tail」をつけることでUnixコマンドの「tail -f <filename>」と同様に、ログを表示し終わっても終了せずに、その後、ログに追加された内容を表示することができます。
ただし、「heroku logs」はあくまでログの確認しかできないため、直接ログファイルにアクセスできません。しかしアドオンの「Loggly」を利用することで、ログを保存して参照することが可能になります。
Logglyを利用すると、HerokuのAdd onsメニューから状況や中身を参照できるようになります。また、オプションでAWSのストレージサービス(S3)への保存も可能な便利なアドオンです。
※herokuコマンドはセットアップされていることを前提としています
これらの機能を利用することで、社内の他のシステムと同様に監視ツールと組み合わせて障害の検知等を行うことができます。
最新ニュース
はてなブックマーク - 新着エントリー - 総合 新着エントリー
- 激怒?わな?日本渡航自粛 中国の論法、総領事投稿「なかったこと」:朝日新聞on 2025年11月15日 at AM 4:10
台湾問題をめぐる日中関係の緊張は、14日夜に中国側が日本への渡航自粛を国内に呼びかける措置に踏み切った。ビジネスや観光の往来を妨げ、両国関係に実質的な障害が生じる段階へと入った。 直接の引き金となっ…
- 「なみえ焼そば」ロイヤリティ徴収を撤回、謝罪…しかし杉乃家は今後も「なみえ焼そば」名称は使用しないとのこと「ブランド名を傷つけただけで終わったな」on 2025年11月15日 at AM 3:49
なみえ焼そばの名称使用料徴収が撤回され、飲食店での提供物には商標権が及ばないと判断されたため謝罪があった。申請時に第43類「飲食物の提供」が審査で削除されており、メニュー表記としての使用にはロイヤリティ不要と判断された。一方、道の駅などの物販は現行の商標登録で権利が及ぶため支払いを求める可能性が残...
- クマに顔引き裂かれ、神経・筋肉失い手術5回…後遺症に苦しむ男性「駆除しないと」「かわいそうとは思わないよ」 on 2025年11月15日 at AM 3:16
【読売新聞】 2年前、クマに顔を切り裂かれて重傷を負った富山市の農業岡上隆さん(74)は、傷の後遺症に今も苦しんでいる。手術を繰り返し、今月上旬にも退院したばかりだ。左目は使えなくなった。「クマの動きは素早く、とても対抗できなかった
- 中国外交部、国防省が高市首相の「台湾有事」を巡る発言に日本語で異例の警告文を発するが「中国外交部ジェネレーター」を作られXで大喜利のネタにされてしまうon 2025年11月15日 at AM 3:10
リンク FNNプライムオンライン 中国国防省が「武力介入するなら代償を払うことになる」と警告 高市首相「台湾有事」めぐる発言に|FNNプライムオンライン 中国国防省は14日行われた会見で高市総理大臣の「台湾有事」をめぐる発言について「武力介入するなら惨憺たる代償を払うことになる」と警告しました。中国国防省の...
- トランプ氏、食料品220品目超の相互関税撤廃 価格高騰に対処 - 日本経済新聞on 2025年11月15日 at AM 3:09
【ワシントン=八十島綾平】トランプ米大統領は14日、220品目を超す食料品を対象に相互関税を撤廃するための大統領令に署名した。原産国を問わずコーヒーや牛肉、バナナなど多くの食料品に相互関税がかからないようにして、価格高騰に対処する。米東部時間13日午前0時1分(日本時間同日午後2時1分)以降の輸入品に遡って...
- 中国外交部ジェネレーターon 2025年11月15日 at AM 2:56
任意のテキストを入力すると、右側に赤い背景の引用画像としてプレビューされます。 長文でも自動で文字サイズを調整して、枠内に収まるようにしています。 本文 “日本は再び軍国主義の過ちを 繰り返すつもりなのか 再び中国人民とアジア人民を 敵に回すつもりなのか 戦後の国際秩序を 覆そうとしているのか” 改行位置は...
- Building serverless applications with Rust on AWS Lambda | Amazon Web Serviceson 2025年11月15日 at AM 2:46
AWS Compute Blog Building serverless applications with Rust on AWS Lambda Today, AWS Lambda is promoting Rust support from Experimental to Generally Available. This means you can now use Rust to build business-critical serverless applications, backed by AWS Support and the Lambda availability SLA...
- 香川県でさぬきうどんを食べ歩く2泊3日14杯の旅on 2025年11月15日 at AM 2:04
2杯目、谷川米穀店は臨時休業だった 続いては三嶋製麺所よりもさらに山側にある『谷川米穀店』。米穀店という名前なのにとても有名なうどん屋らしく、すごく楽しみにしていた店なのだが、なんと臨時休業だった。 でもこういう休みは個人経営の店ならあって当然。店のブログを確認したら、ちゃんと休業のお知らせが書かれ...




