CeleryをSQS接続でセットアップしようとした際の躓きどころ

celery

最新の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を使うと動かないとか謎な部分が多く残っていますが、とりあえずは動くようになって良かってです。
最新版を使う時には問題は付き物ですが、情報が役に立てば幸いです。

コメントを残す