One-off dyno の使用
最終更新日 2025年04月11日(金)
Table of Contents
One-off dyno を使用すると、アプリの管理タスクやメンテナンスタスクを実行でき、デバッグにも役立ちます。この記事では、それらの操作方法について説明します。それぞれの概念についての詳細は、「One-Off-dynos」を参照してください。
インタラクティブな One-off dyno を実行する heroku run
は、Fir では使用できません。Fir 世代のアプリは heroku run:detached
を使用してバックグラウンドで One-off dyno のタスクを実行するか、heroku run:inside
を使用して既存の実行中の dyno 内でタスクを実行します。Changelog に登録して、Fir に heroku run
が追加されるタイミングを確認してください。
One-off dyno の実行にかかる時間はすべてその使用とみなされ、他の dyno と同様に請求対象となります。
One-off dyno を実行する
Heroku Dashboard、CLI、または API を使用して、One-off dyno を起動できます。
Heroku Dashboard を使用する場合
ダッシュボードで One-off dyno を実行するアプリをクリックします。
アプリの概要ページの右上にある More
(詳細) ボタンをクリックします。
Run console
(コンソールを実行) をクリックします。
dyno で実行するコマンドを入力します。詳しくは、「実行構文」を参照してください。
CLI を使用する場合
heroku run <command>
を実行します。詳しくは、「実行構文」を参照してください。
API を使用する場合
dyno の作成 API 呼び出しを使用します。プロセス type
パラメータには run
を渡し、dyno で実行するコマンドは command
パラメータに渡します。詳しくは、「実行構文」を参照してください。
実行構文
heroku run
には 2 種類のパラメータがあります。実行するコマンドを入力することも、アプリケーションの Procfile にあるプロセスタイプを入力することもできます。
スクリプトコマンドまたはアプリケーションで利用可能なその他の実行可能コマンドを入力すると、そのコマンドは追加の引数と共に One-off dyno として実行されます。たとえば、Python インタープリターを引数として入力されたファイル dowork.py
で実行してから、heroku run python dowork.py
を実行します。
代わりに Procfile
で宣言されたとおりにプロセスタイプを入力すると、定義が代替され、追加の引数と共に実行されます。たとえば、以下の Procfile
があるとします。
myworker: python dowork.py
heroku run myworker 42
を実行すると、python dowork.py 42
が One-off dyno として実行されます。
フラグの処理
dyno で実行する必要があるコマンドまたはフラグは、heroku
コマンドとフラグから --
で分離します。
たとえば、dyno で ls -a
を実行するには、次のようにします。
$ heroku run --app example-app -- ls -a
Running ls -a on ⬢ forker... up, run.4520 (Eco)
. .. Procfile server.js
Shield Private Space
Shield Private Space でアプリに One-off dyno を使用するには、最初に SSH キーをユーザーアカウントに追加する必要があります。詳細は、「SSH キーの管理」を参照してください。
バックグラウンドでタスクを実行する
Common Runtime では、監査の目的で出力をログに送信する前に、スクリプトで参照される環境設定の値を拡張します。機密性の高い環境変数への直接参照は使用しないでください。
Fir 世代のアプリでは、分離された One-off dyno を起動するために、Procfile に少なくとも 1 つのデプロイと 1 つのプロセスタイプが定義されている必要があります。
heroku run:detached
を使用して、dyno をバックグラウンドで実行できます。heroku run
とは異なり、これらの dyno では出力がコンソールウィンドウではなくログに送信されます。heroku logs
を使用して、これらのコマンドからの出力を表示できます。
$ heroku run:detached rake db:migrate
Running rake db:migrate... up, run.2
Use 'heroku logs --dyno run.2' to view the log output.
One-off dyno を停止する
heroku ps
を使用して現在実行中の dyno の名前を次のように確認します。
$ heroku ps
=== run: one-off processes
run.4520: starting 2013/03/13 15:38:08 (~ 1s ago): `bash`
=== web: `bundle exec unicorn -p $PORT -c ./config/unicorn.rb`
web.1: up 2013/03/13 15:08:07 (~ 30m ago)
web.2: up 2013/03/12 17:06:09 (~ 22h ago)
実行中の One-off dyno を停止するには、その dyno の名前で heroku ps:stop
を使用します。
$ heroku ps:stop run.4520
Stopping run.4520 process... done
アプリケーションで heroku ps:restart
を発行すると、One-off dyno は停止しません。また、One-off dyno は新しいアプリのリリースの後に再起動されません。
既存の dyno 内でタスクを実行する
Cedar 世代のアプリ
One-off dyno は管理タスクに最適である反面、本番 dyno でサービスのデバッグを時々行う必要があります。One-off dyno とは異なり、Heroku Exec では SSH 接続が既存の dyno (web.2 など) に対して直接行われます。Exec では、dyno からのファイルのコピー、ローカルポートのトラフィックの dyno への転送、一般的な Java デバッグツールの利用も可能です。Heroku Exec は Cedar 世代のアプリでのみ使用できます。
Fir 世代のアプリ
Fir 世代のアプリ内で既存の dyno内のタスクを実行するには、heroku run:inside
を使用します。詳細は、「既存の dyno でタスクを実行する」を参照してください。
例
Bash
One-off dyno の動作を確認するには、Heroku にデプロイされているすべてのアプリケーションで利用可能な bash
コマンドを実行します。
$ heroku run bash
Running bash attached to terminal... up, run.1
~ $
この時点で、ファイルシステムおよびプロセス環境を探索するためのシェル環境を提供する bash
コマンドを実行している One-off dyno があります。
シェルと対話し、デプロイしたファイルをすべて一覧表示します。
~ $ ls
Procfile project.clj src bin ...
bin
ディレクトリにバッチファイルがある場合、その他多くの Unix コマンドのようにこれを実行します。
~ $ echo "Hi there"
Hi there
~ $ pwd
/app
~ $ bin/do-work
ファイルをいくつか削除してから終了します。
~ $ rm Procfile project.clj
~ $ exit
各 dyno には独自の一時的なファイルシステムがあるため、削除されたファイルによって実行中のアプリケーションが変更されることはありません。
データベースの移行
データベースの移行例を次に示します。
$ heroku run rake db:migrate
(in /app)
Migrating to CreateWidgets (20110204210157)
== CreateWidgets: migrating ==================================================
-- create_table(:widgets)
-> 0.0497s
== CreateWidgets: migrated (0.0498s) =========================================
コンソールを実行する
Rails コンソールの実行例を次に示します。
$ heroku run rails console
Running rails console attached to terminal... up, run.2
Loading production environment (Rails 3.0.3)
irb(main):001:0> Widget.create :name => 'Test'
=> #<Widget id: 1, name: "Test", size: nil, created_at: "2011-05-31 02:37:51", updated_at: "2011-05-31 02:37:51">