15

Heroku スケジューラを使用して、1 日の特定の期間に Web dyno を開始および停止する方法はありますか? 営業時間中は 2 つの dyno、夜は 1 つの dyno だけですか?

通常のユーザー/パス資格情報をアプリ自体に入れないようにしたいので、これを行うための安全な方法を探しています(アプリごとに毎日手動で行うことは別として)。「heroku ps:scale web=2」を直接使用するのは当然ですが、私が知る限り、これはサポートされていません。

事前にフィードバックをお寄せいただきありがとうございます...

4

3 に答える 3

14

Heroku APIを使用するスクリプトを作成することで、スケジュールに従ってherokudynoをスケーリングできます。次に、Procfileにエントリを作成し、HerokuSchedulerアドオンを介して呼び出します。方法は次のとおりです。

requirements.txtまず、「heroku」pythonモジュールを:に追加する必要があります。

heroku == 0.1.2

次に、スクリプトがAPIを使用できるように、APIキーを含む構成変数を作成します。

heroku config:add HEROKU_API_KEY = your_api_key_string

APIキーは、herokuアカウントページにあります

これで、dynoをスケーリングするPythonスクリプトを作成できるようになります。これは、コマンドライン引数としてdynoの数を受け入れる非常に基本的なスクリプトです。

import os
import sys

import heroku

"""Scale heroku web processes using the heroku python API."""

# you may want to add better argument processing, use argparse, etc.
dynos = int(sys.argv[1])
cloud = heroku.from_key(os.environ.get('HEROKU_API_KEY'))
app = cloud.apps['your_app_name']

try:
    # you may want to add a maximum dyno check here to prevent costly mistakes ;)
    webproc = app.processes['web']  
    webproc.scale(dynos)

except KeyError:
    # note: scaling to 0 dynos or attempting to scale up if 0 web dynos exist
    # both throw this error. Make sure you have at least one dyno.
    print >> sys.stderr, "Could not scale web processes - are there 0 web dynos running?"

次に、Heroku Scheduler Webページ内でタスク全体を定義するか、Procfile内でタスクを定義して、WebページからProcfileプロセス名を呼び出すことができます。herokuのWebサイトにログインしなくてもプロセスを簡単に更新または変更できるため、後者の方が好きです。

したがって、Procfileにエントリを作成します。

scale_up: python scale.py 2
scale_down: python scale.py 1

そして、それらをスケジュールします。

[画像]

そして出来上がり!これで、dynoは指定された時刻にスケールアップまたはスケールダウンします。

-

スケジューラのWebページでスケジュールされたタスクを作成すると、実行する時刻を編集することはできませんが、新しいタスクを作成する場合は、時刻を設定してから古いタスクを削除できます。

注2: heroku python APIは、0 dynoにスケールダウンしようとした場合、または0 Web dynoが現在存在する場合にスケールアップしようとした場合に、KeyErrorをスローするようです。両方を回避するには、0dynoにスケールダウンしないでください。

于 2012-08-14T22:46:27.093 に答える
1

プラットフォームには組み込まれていませんが、スケジューラーや API トークンを使用して簡単に実装できるはずです。

于 2012-08-14T11:00:57.447 に答える