Celery を利用するブローカーとして Amazon SQS を使用したい。 Celeryが依存する Komb のSQSトランスポート実装があります。ただし、それを使用するための十分なドキュメントがないため、CeleryでSQSを構成する方法が見つかりません。 CeleryでSQSを構成することに成功した人はいますか?
私はこの質問に何度か遭遇しましたが、SQSで動作するようにCeleryを設定する方法はまだ完全にはわかりませんでした。 Kombuと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
これは、URLパーサーでAPIシークレットでのスラッシュを許可しないという問題を回避します。これは、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でSQS URL解析を調べましたが、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を構成しようとしたところ、小さな成功を収めたようです。
これにはKombuにパッチを適用する必要があるため、いくつかのパッチを作成したところ、 my pull request も存在します。 Amazon SQSを設定するには、BROKER_URL
/sqs://
パッチを適用したKombuのCeleryのスキーム。例えば:
BROKER_URL = 'sqs://AWS_ACCESS:AWS_SECRET@:80//'
BROKER_TRANSPORT_OPTIONS = {
'region': 'ap-northeast-1',
'sdb_persistence': False
}
この質問に遭遇した人のために、SQSを使用してCeleryをすぐに動作させることができました(パッチを適用する必要はありません)。 5および1.5.1現在)。上記の設定行を使用すると、動作するはずです(ただし、デフォルトのリージョンを変更したい場合があります)。
注意:上記のURL形式を使用するには、URLパーサーを混乱させるため、AWSシークレットにスラッシュが含まれていないことを確認する必要があります。スラッシュなしで取得するまで、新しいシークレットを生成し続けます。
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)
)
スラッシュなしのキーを取得するまで、IAMコンソールで認証情報を再生成しました(/
)。解析の問題はその文字にのみ存在するため、秘密に秘密がない場合は問題ありません。
最もひどくエレガントなソリューションではありませんが、コードをハックからクリーンに保ちます。