Django-Celery-Redisのherokuへのデプロイがうまくできたときのメモ


転載元ブログ情報

自分のブログからの転載です
http://k-mawa.hateblo.jp/entry/2018/06/18/235203

コメント

Django+Celeryで非同期処理ができるようにしたDjangoプロジェクトの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で動くか動作確認

$redis-server 
#コマンドうつ場所はどこでもOK。heroku localでredis起動は同じく必要
(仮想環境,herokuのgitコマンドを打つ場所にて僕はやってます)$heroku local

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

ローカルで動かない時用にチェックポイントを自分なりにまとめました。もうちょっとローカル開発部分を詳しく書いています。
http://k-mawa.hateblo.jp/entry/2018/06/18/211445

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

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

公式ドキュメントより。なおhobby-devは無料
https://elements.heroku.com/addons/heroku-redis

手順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']

引用元
https://qiita.com/seizans/items/a40952248ef2004f1d62

↓こう変える

#↓ここから追記↓

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

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

$heroku logs -t

参考資料

公式ドキュメント"Connecting in Django"の箇所
[https://devcenter.heroku.com/articles/heroku-redis#connecting-in-python:embed:cite]

自分の完成形とちょっと違うけど、参考になりました
[https://github.com/celery/django-celery/issues/455:embed:cite]