芹菜与亚马逊SQS

时间:2011-11-08 09:53:03

标签: amazon-web-services celery amazon-sqs kombu

我想使用Amazon SQS作为Celery支持的代理。有Kombu的SQS传输实现,Celery依赖它。但是没有足够的文档来使用它,所以我找不到如何在Celery上配置SQS。是否有人成功在Celery上配置SQS?

7 个答案:

答案 0 :(得分:60)

我多次遇到这个问题,但仍不完全确定如何设置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/

答案 1 :(得分:30)

我正在使用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=''))

我不确定访问密钥是否可以在其中包含正斜杠,但引用它也没有什么坏处。

答案 2 :(得分:2)

没有人回答这个问题。无论如何,我试图用亚马逊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
}

答案 3 :(得分:2)

对于任何绊倒这个问题的人,我能够让Celery与SQS一起开箱即用(不需要打补丁),但我确实需要更新到Celery和Kombu的最新版本才能使用(截至目前为1.4.5和1.5.1)。使用上面的配置行,它应该工作(虽然你可能想要更改默认区域)。

问题:为了使用上面的URL格式,您需要确保您的AWS密码不包含斜杠,因为这会混淆URL解析器。只要不加斜线就可以产生新的秘密。

答案 4 :(得分:0)

我重新生成了IAM consonle中的凭据,直到我得到一个没有斜杠的键(Error: StaticInjectorError[MatDialogRef]: StaticInjectorError[MatDialogRef]: NullInjectorError: No provider for MatDialogRef! )。解析问题只适用于那个角色,所以如果你的秘密没有,你就可以了。

不是最优雅的解决方案,但绝对能让代码保持干净。

答案 5 :(得分:0)

针对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)
)

答案 6 :(得分:0)

我能够使用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='')
)