セロリに裏打ちされたブローカーとしてAmazonSQSを使用したい。セロリが依存している昆布のSQSトランスポート実装があります。ただし、それを使用するための十分なドキュメントがないため、CeleryでSQSを設定する方法が見つかりません。CeleryでSQSを設定することに成功した人はいますか?
7 に答える
この質問に何度か遭遇しましたが、SQSで動作するようにCeleryをセットアップする方法がまだ完全にはわかりませんでした。昆布とセロリの最新バージョンではとても簡単です。別の回答で言及されているBROKER_URL構文の代わりに、トランスポート、オプション、ユーザー、およびパスワードを次のように設定するだけです。
BROKER_TRANSPORT = 'sqs'
BROKER_TRANSPORT_OPTIONS = {
'region': 'us-east-1',
}
BROKER_USER = AWS_ACCESS_KEY_ID
BROKER_PASSWORD = AWS_SECRET_ACCESS_KEY
これは、APIシークレットでスラッシュを許可しないURLパーサーの問題を回避します。これは、AWSでかなり一般的に発生しているようです。このトピックに関する豊富な情報はまだないようだったので、このトピックに関する短いブログ投稿もここに書きました。
http://www.caktusgroup.com/blog/2011/12/19/using-django-and-celery-amazon-sqs/
Celery 3.0を使用していますが、BROKER_USER / BROKER_PASSWORD設定でワーカーを起動すると、非推奨の警告が表示されていました。
kombo.utils.url._parse_urlのSQSURL解析を確認しましたが、URLのユーザー名とパスワードの要素でurllib.unquoteを呼び出しています。
したがって、スラッシュ付きの秘密鍵の問題を回避するために、BROKER_URLに次のものを正常に使用することができました。
import urllib
BROKER_URL = 'sqs://%s:%s@' % (urllib.quote(AWS_ACCESS_KEY_ID, safe=''),
urllib.quote(AWS_SECRET_ACCESS_KEY, safe=''))
アクセスキーにスラッシュを含めることができるかどうかはわかりませんが、引用することも問題ありません。
誰もこれについて答えませんでした。とにかく、Amazon SQSでCeleryを設定しようとしましたが、小さな成功を収めたようです。
昆布にはパッチを当てる必要があるので、パッチをいくつか書きましたが、プルリクエストもあります。パッチを適用した昆布のCeleryBROKER_URL
でスキームを設定することにより、AmazonSQSを設定できます。sqs://
例えば:
BROKER_URL = 'sqs://AWS_ACCESS:AWS_SECRET@:80//'
BROKER_TRANSPORT_OPTIONS = {
'region': 'ap-northeast-1',
'sdb_persistence': False
}
この質問に出くわした人のために、SQSを使用してCeleryをすぐに機能させることができました(パッチは必要ありません)が、これを機能させるには、CeleryとKombuの最新バージョンに更新する必要がありました(1.4。 5および1.5.1現在)。上記の設定行を使用すると、機能するはずです(ただし、デフォルトのリージョンを変更することをお勧めします)。
お奨め:上記のURL形式を使用するには、URLパーサーを混乱させるため、AWSシークレットにスラッシュが含まれていないことを確認する必要があります。スラッシュなしでシークレットを取得するまで、新しいシークレットを生成し続けます。
スラッシュ()のないキーを取得するまで、IAMコンソンルでクレデンシャルを再生成しました/
。解析の問題はそのキャラクターにのみあるので、シークレットにシークレットがない場合は問題ありません。
最もエレガントなソリューションではありませんが、コードをハッキングから確実に保護します。
Python 3のアップデートで、AWSKEYからバックスラッシュを削除します。
from urllib.parse import quote_plus
BROKER_URL = 'sqs://{}:{}@'.format(
quote_plus(AWS_ACCESS_KEY_ID),
quote_plus(AWS_SECRET_ACCESS_KEY)
)
昆布を使ってセロリ4.3(python 3.7)でSQSを設定することができました。
from kombu.utils.url import quote
CELERY_BROKER_URL = 'sqs://{AWS_ACCESS_KEY_ID}:{AWS_SECRET_ACCESS_KEY}@'.format(
AWS_ACCESS_KEY_ID=quote(AWS_ACCESS_KEY_ID, safe=''),
AWS_SECRET_ACCESS_KEY=quote(AWS_SECRET_ACCESS_KEY, safe='')
)