I want to use Amazon SQS as broker backed of Celery. There’s the SQS transport implementation for Kombu, which Celery depends on. However there is not enough documentation for using it, so I cannot find how to configure SQS on Celery. Is there somebody that had succeeded to configure SQS on Celery?
7 回答
我多次遇到这个问题,但仍然不完全确定如何设置 Celery 以与 SQS 一起使用。事实证明,使用最新版本的 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=''))
我不确定访问键是否可以在其中包含正斜杠,但引用它也没有什么坏处。
对于遇到这个问题的任何人,我都可以让 Celery 开箱即用地与 SQS 一起工作(无需打补丁),但我确实需要更新到最新版本的 Celery 和 Kombu 才能正常工作(1.4.截至目前的 5 和 1.5.1)。使用上面的配置行,它应该可以工作(尽管您可能想要更改默认区域)。
问题:为了使用上面的 URL 格式,您需要确保您的 AWS 密码不包含斜杠,因为这会混淆 URL 解析器。只要不断产生新的秘密,直到你得到一个没有斜线的秘密。
没有人回答这个问题。无论如何,我尝试使用 Amazon SQS 配置 Celery,并且似乎取得了小小的成功。
Kombu 应该为此打补丁,所以我写了一些补丁,还有我的拉取请求。您可以通过在修补过的 Kombu 上设置 Celery 中BROKER_URL
的方案来配置 Amazon SQS 。sqs://
例如:
BROKER_URL = 'sqs://AWS_ACCESS:AWS_SECRET@:80//'
BROKER_TRANSPORT_OPTIONS = {
'region': 'ap-northeast-1',
'sdb_persistence': False
}
Python 3 的更新,从 AWS KEY 中删除反斜杠。
from urllib.parse import quote_plus
BROKER_URL = 'sqs://{}:{}@'.format(
quote_plus(AWS_ACCESS_KEY_ID),
quote_plus(AWS_SECRET_ACCESS_KEY)
)
我在 IAM 控制台中重新生成了凭证,直到我得到一个没有斜杠 ( /
) 的密钥。解析问题仅与该字符有关,因此,如果您的秘密没有一个,您会没事的。
不是最优雅的解决方案,但绝对可以让代码保持干净。
我能够使用kombu在celery 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='')
)