MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

Django-Celery-Redisのherokuへのデプロイメモ。

Heroku: Up and Running: Effortless Application Deployment and Scaling

Heroku: Up and Running: Effortless Application Deployment and Scaling

コメント

Django+Celeryで非同期処理ができるようになり、最終関門はherokuデプロイです。情報が少ないし公式ドキュメントだけだと(たぶん)エラーになり・・・ついにできました!その時のメモ。

手順1 Procfileに追加→Redis動かすワーカー起動を指示

Procfile

web: gunicorn [プロジェクト名].wsgi:application -b 0.0.0.0:$PORT
worker: celery worker -A [プロジェクト名].celery -l INFO
#↑この行が追加された
#ローカルで必要だった、$celery -A [プロジェクト名] worker -l infoをherokuが勝手にやってくれるイメージです

手順2 heroku localで動くか動作確認

(どこでもOK)$redis-server #redis起動は同じく必要
(仮想環境)$heroku local

ここまではローカルのsettings.pyで動かしました。これでデプロイ下準備は完了。

手順3 heroku-redisアドオンを追加

$heroku addons:create heroku-redis:hobby-dev

elements.heroku.com

手順4 アドオンが追加されたか確認

$ heroku redis:info
=== redis-xxxx-123456 (REDIS_URL) #仮の名前に変更してます
Plan:               Hobby Dev
Status:             available
Created:            2018-06-15 13:19 UTC
Version:            3.2.11
Timeout:            300
Maxmemory:          noeviction
Maintenance:        not required
Maintenance window: Thursdays 17:30 to 21:30 UTC
Persistence:        None
HA Status:          Unavailable

これはwebのherokuコンソールでも確認可能です。

手順5 Django用のheroku-redis接続パッケージをインストール

django-redis-cacheというモジュールが必要。公式ページに記載されてました。

pip install django-redis-cache

pip freeze > requirements.txt

手順6 settings.pyのCelery設定をデプロイ先のheroku-redisに接続されるようにする

#settings.pyローカルで動いた参考例(引用です)

BROKER_URL = 'redis://localhost'
CELERY_RESULT_BACKEND = 'redis'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']

引用元

Celery 3.1 を Django で使う

↓こう変える

#↓ここから追記↓

import os

CACHES = {
    "default": {
         "BACKEND": "redis_cache.RedisCache",
         "LOCATION": os.environ.get('REDIS_URL'),
    }
}

BROKER_URL = os.environ.get("REDIS_URL")
CELERY_RESULT_BACKEND = os.environ.get("REDIS_URL")

#↑ここまでが変更点↑

#BROKER_URL = 'redis://localhost' #localのときだけ
#CELERY_RESULT_BACKEND = 'redis' #localのときだけ
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']

REDIS_URLという環境変数はheroku:redisを導入しときに勝手に設定されるのです。

手順7 いつものようにherokuにデプロイ

$git add.
$git commit -m "celery"
$git push heroku master
$heroku ps:scale worker=1
#↑workerプロセスを起動するためにこれがいる!

手順8 logをとってうまく行ってるかチェック

$heroku logs -t

参考資料

"Connecting in Django"の箇所 devcenter.heroku.com

自分の完成形とちょっと違うけど、参考になりました github.com