Сельдерей с Amazon SQS

Я хочу использовать Amazon SQS в качестве брокера, поддерживаемого Celery. Существует реализация транспорта SQS для Kombu, от которой зависит Celery. Однако документации для его использования недостаточно, поэтому я не могу найти, как настроить SQS на Celery. Есть кто-то, кому удалось настроить SQS на Celery?

5 ответов

Решение

Я сталкивался с этим вопросом несколько раз, но все еще не был полностью уверен, как настроить 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.

Я посмотрел на разбор URL SQS в kombo.utils.url._parse_url, и он вызывает urllib.unquote для элементов имени пользователя и пароля в URL.

Итак, чтобы обойти проблему секретных ключей с косой чертой, я смог успешно использовать следующее для 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. Просто продолжайте генерировать новые секреты, пока не получите один без слеша.

Никто не ответил об этом. В любом случае я пытался настроить Celery с Amazon SQS, и, похоже, я добился небольшого успеха.

Kombu должен быть исправлен для этого, так что я написал несколько исправлений, и есть также мой запрос на извлечение. Вы можете настроить Amazon SQS, установив BROKER_URL из sqs:// схема в сельдерее на залатанную комбу. Например:

BROKER_URL = 'sqs://AWS_ACCESS:AWS_SECRET@:80//'
BROKER_TRANSPORT_OPTIONS = {
    'region': 'ap-northeast-1',
    'sdb_persistence': False
}

Мне удалось настроить SQS на сельдерее 4.3 (python 3.7) с помощью комбу.

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='')
)

Обновление для Python 3, удаление обратной косой черты из ключа AWS.

from urllib.parse import quote_plus
BROKER_URL = 'sqs://{}:{}@'.format(
    quote_plus(AWS_ACCESS_KEY_ID), 
    quote_plus(AWS_SECRET_ACCESS_KEY)
)

Я восстановил учетные данные в IAM-консонле, пока не получил ключ без косой черты (/). Проблемы с синтаксическим анализом касаются только этого персонажа, поэтому, если у вашего секрета его нет, у вас все будет в порядке.

Не самое ужасно элегантное решение, но, безусловно, защищает код от взлома.

Другие вопросы по тегам