One-off dyno
最終更新日 2024年12月03日(火)
Table of Contents
One-off dyno を使用すると、アプリの管理タスクやメンテナンスタスクを実行でき、デバッグにも役立ちます。この記事では、One-off dyno に関する概念について説明します。使用方法については、「One-off dyno の使用」を参照してください。
One-off dyno の実行にかかる時間はすべてその使用とみなされ、他の dyno と同様に請求対象となります。
One-off dyno を起動する heroku run
は、Fir 世代のアプリでは使用できません。heroku run
が Fir で利用可能になるまで、heroku run:inside
を使用してください。詳細は、「Heroku 世代」を参照してください。
ユースケース
One-off dyno の用途には、以下のようなものがあります。
- データベースの初期化またはデータベース移行の実行 (
rake db:migrate
、node migrate.js migrate
など) - コンソールまたは REPL シェルの実行による、任意のコードの実行または本番データベースに対するアプリのモデルの調査 (
rails console
、irb
、node
など) - アプリのリポジトリにコミットされたワンタイムスクリプト (
ruby scripts/fix_bad_records.rb
、node tally_results.js
など)
One-off dyno について
アプリケーションを Heroku にプッシュすると、Web サーバー、コンソールアプリケーション、スクリプトなどのさまざまなコンポーネントが含まれる場合があります。Web サーバーは Procfile で定義された Web dyno によって使用されますが、コンソールとスクリプトは One-off dyno によって実行されます。
One-off dyno は必ずしも正確に 1 回だけ実行されるわけではありません。非常にまれなケースでは、ジョブがスキップされたり、2 回実行されたりすることがあります。
One-off dyno は、アプリケーションの Web、Worker、およびその他の Formation dyno と同様、他の dyno と並列して実行されます。One-off dyno には、dyno の分離によるメリットがすべて備わっています。ログに表示される場合は、web
や worker
といったプロセスタイプではなく、One-off dyno が run
として表示されます。
One-off dyno はアプリケーションにデプロイされているすべてのリソースをフルに活用できます。各 dyno には独自の一時ファイルシステムがあり、他の dyno とは共有されません。One-off dyno から切断されると、そのファイルシステムは破棄されます。
さらに、Heroku Scheduler を利用することでタスクを定期的に実行するようにスケジュール設定できます。その実装には One-off dyno が使用されます。
Formation dyno と One-off dyno
Procfile で宣言され、Dyno Manager によって heroku ps:scale
で管理される一連の dyno は、dyno formation と呼ばれます。これらの dyno は、アプリの通常の業務 (Web リクエストの処理やバックグラウンドジョブの処理など) を実行します。
heroku run
で実行される One-off dyno と、heroku ps:scale
で実行される Formation dyno にはいくつかの違いがあります。
- デフォルトでは、One-off dyno はターミナルに接続された状態で実行され、
STDIN
およびSTDOUT
の文字単位の TCP 接続が使用されます。そのため、コンソールなどの対話型プロセスを使用できます。STDOUT
がターミナルに出力されるため、アプリのログでは dyno の起動とシャットダウンのみが記録されます。また、バックグラウンドでタスクを実行するために、分離された dyno を実行することもできます。 - One-off dyno は、Ctrl+C を押すか、ローカルターミナルで接続を切断するとすぐに終了します。プロセスが自然に終了しても、ユーザーが手動で接続を切断しても、One-off dyno が自動で再起動することはありません。
- One-off dyno はプロセスタイプ
run
として表示されます。 - One-off dyno はルーターがトラフィックを dyno にのみルーティングするため、HTTP トラフィックを受信することはありません。
- One-off dyno は、新しいアプリのリリースの後に再起動されません。
これらの違いのほかに、Dyno Manager では One-off dyno と Formation dyno は区別されません。
タイムアウト
SIGHUP
を捕捉することで、接続が終了しても dyno が実行され続ける可能性があります。詳細については、シグナルマニュアルのページを参照してください。
ほとんどの One-off dyno への接続は、入力と出力の両方でアイドル状態が 1 時間続くと終了します。一方、Shield Spaces の One-off dyno は 15 分後にタイムアウトします。接続が終了すると、dyno は SIGHUP
シグナルを受け取ります。このアイドルタイムアウトにより、対話型コンソールセッションを開いて使用しないままにすることによる、意図しない請求の発生が阻止されます。
分離されている dyno には接続がないため、タイムアウトがありません。ただし、すべての dyno と同様、One-off dyno は 24 時間ごとに再起動されます。つまり、One-off dyno の実行時間は最長で 24 時間となります。
One-off dyno のサイズ
使用されるデフォルトの One-off dyno のサイズは、アプリの Dyno formation によって異なります。
- Eco または Basic dyno タイプを使用しているアプリは、One-off dyno で対応する Eco または Basic dyno タイプを使用します。その他の dyno タイプは使用できません。
- Standard または Performance dyno タイプを使用しているアプリは、One-off dyno で Standard-1X dyno タイプを使用します。これらの dyno タイプを使用するアプリでは、
size
引数を使用して、One-off dyno に異なる dyno タイプを指定できます (heroku run --size=standard-2x rake heavy:job
、heroku run --size=performance-l rake heavy:job
など)。 - Private または Shield dyno タイプを使用しているアプリは、デフォルトでは One-off dyno で Private-M または Shield-M を使用します。
制限
並列で実行できる One-off dyno の数の制限については、「デフォルトのスケーリング制限」セクションを参照してください。
トラブルシューティング
「One-off dyno のプロセスタイムアウト問題のトラブルシューティング」を参照してください。