目次
最新のCeleryを使ってセットアップしようとしたら、上手く起動出来なかった
CeleryをSQS接続で使用したいなと思い、セットアップしていたのですが、どうにも上手く起動が出来ず困りました。
そこで今回は、出力されたエラーの内容と解決方法を伝えれればと思います。
※Celery自体の使用方法は記述していません。
そもそもCeleryって何?
Pythonで非同期のタスクキュー・ジョブキューを実現するライブラリです。
また、CeleryBeatを使用することで、タスクをスケジューリングすることも出来ちゃいます。
最新のCeleryを入れて起きた問題
broker_urlが効かない
今回試してみたことはまず、現状stableの最新である4.4.7を入れてみました。
そして設定内容は以下の通りで、SQSで接続する為のKEYをbroker_urlに設定し、その他オプションをbroker_transport_optionsに設定しました。
broker_url = 'sqs://%s:%s@' % (safequote(AWS_ACCESS_KEY_ID), safequote(AWS_SECRET_ACCESS_KEY)) broker_transport_options = { 'region': 'ap-northeast-1', 'visibility_timeout': 3600, 'polling_interval': 1, 'queue_name_prefix': 'something-', }
これでCeleryを起動しようとして出たエラーがこちら。
consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
なぜか、broker_urlが効いてない…?
そこで、Celeryのコードを追っていくと、過去のCelery3系で使われていたBROKER_URLも使われている模様。
なので、broker_urlをBROKER_URLに書き換えると、ちゃんとSQSへ接続出来ることが確認出来ました。
修正後のコードはこちら。
BROKER_URL = 'sqs://%s:%s@' % (safequote(AWS_ACCESS_KEY_ID), safequote(AWS_SECRET_ACCESS_KEY)) CELERY_BROKER_TRANSPORT_OPTIONS = { 'region': 'ap-northeast-1', 'visibility_timeout': 3600, 'polling_interval': 1, 'queue_name_prefix': 'something-', }
ドキュメントを見ても、Lowercaseで書くように書かれているので合ってそうはあるのだが、なぜこれで通るのかは詳しくは調べれていません。。
ImportError: The curl client requires the pycurl library.
SQSに接続は出来るようになったもののpycurlのlibraryが必要だというエラーが出るようになりました。
ただ、自分の環境でのインストール済のライブラリを見るとpycurlが入ってる。。
色々調べていた結果、Celery導入時に関連して導入されるのがkombu、pycurl、billiardなのですが、Celeryとkombuの相性が上手く行ってない模様。
kombuのバージョンを落としてみたり色々と試してみたのですが、結局はCelery自体のバージョンを4.3.0まで落としました。
これで、上記2つのエラーが解消され無事にCeleryが動くようになりました。
Lowercaseを使うと動かないとか謎な部分が多く残っていますが、とりあえずは動くようになって良かってです。
最新版を使う時には問題は付き物ですが、情報が役に立てば幸いです。