【发布时间】:2011-12-24 07:34:03
【问题描述】:
我想使用Amazon SQS 作为Celery 支持的代理。 Kombu 的 SQS 传输实现是 Celery 所依赖的。但是没有足够的文档来使用它,所以我找不到如何在 Celery 上配置 SQS。有人在 Celery 上成功配置 SQS 吗?
【问题讨论】:
标签: amazon-web-services celery amazon-sqs kombu
我想使用Amazon SQS 作为Celery 支持的代理。 Kombu 的 SQS 传输实现是 Celery 所依赖的。但是没有足够的文档来使用它,所以我找不到如何在 Celery 上配置 SQS。有人在 Celery 上成功配置 SQS 吗?
【问题讨论】:
标签: amazon-web-services celery amazon-sqs kombu
我多次遇到这个问题,但仍然不完全确定如何设置 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=''))
我不确定访问键中是否可以包含正斜杠,但引用它也没有什么坏处。
【讨论】:
The login credentials can also be set using the environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, in that case the broker URL may only be sqs://. 我无法让它工作,但明确构建 BROKER_URL 因为这个答案确实很好用。
对于遇到这个问题的任何人,我都能让 Celery 开箱即用地与 SQS 一起工作(无需修补),但我确实需要更新到最新版本的 Celery 和 Kombu 才能工作(截至目前为 1.4.5 和 1.5.1)。使用上面的配置行,它应该可以工作(尽管您可能想要更改默认区域)。
问题:为了使用上面的 URL 格式,您需要确保您的 AWS 密码不包含斜杠,因为这会混淆 URL 解析器。不断产生新的秘密,直到你得到一个没有斜线的秘密。
【讨论】:
没有人回答这个问题。无论如何,我尝试使用 Amazon SQS 配置 Celery,并且似乎取得了小小的成功。
Kombu 应该为此打补丁,所以我写了一些补丁,还有my pull request。您可以通过在修补过的 Kombu 上的 Celery 中设置 BROKER_URL 的 sqs:// 方案来配置 Amazon SQS。例如:
BROKER_URL = 'sqs://AWS_ACCESS:AWS_SECRET@:80//'
BROKER_TRANSPORT_OPTIONS = {
'region': 'ap-northeast-1',
'sdb_persistence': False
}
【讨论】:
我在 IAM 控制台中重新生成了凭证,直到我得到一个没有斜杠的密钥 (/)。解析问题仅与该字符有关,因此如果您的秘密没有问题,您会没事的。
不是最优雅的解决方案,但绝对可以让代码保持干净。
【讨论】:
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)
)
【讨论】:
我能够使用 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='')
)
【讨论】: