[PYTHON] Utiliser SSL avec Celery + Redis

introduction

Celery est un framework pour traiter les tâches Python dans une file d'attente. Vous pouvez utiliser Redis en tant que courtier de Celery, mais lors de l'utilisation d'Azure Redis Cache, j'étais accro à la partie qui utilise SSL, donc je vais laisser l'utilisation ici.

environnement

En supposant qu'il soit utilisé dans Flask, une application Web, je pense que c'est la même chose dans d'autres environnements.

Pour utiliser SSL

Selon Quoi de neuf dans Celery 4.0 (appel latent), Celery pourra utiliser une connexion SSL avec Redis à partir de la version 4.0. C'est.

On dit qu'il peut être utilisé en paramétrant broker_use_ssl, mais dans le cas de Redis, cette information Cela ne fonctionne pas même si je l'ai réglé en avalant.

Error while reading from socket: (104, 'Connection reset by peer')

Vous serez en proie à l'erreur. Cette erreur est due à l'utilisation de redis.connection.Connection de Redis au lieu de redis.connection.SSLConnection pour se connecter à Redis dans Celery.

Correction de la prise en charge de Redis SSL Si vous ne définissez pas cette pull request comme référence, vous ne pourrez pas utiliser SSL.

from celery import Celery
from redis.connection import SSLConnection
from .config import broker_use_ssl


def make_celery(app):
    celery = Celery(app.import_name, backend=app.config['CELERY_BACKEND'],
                    broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    celery.conf.update(broker_use_ssl=broker_use_ssl)

    # URL: https://github.com/celery/kombu/pull/634
    if celery.conf.broker_use_ssl:
        celery.backend.connparams.update(celery.conf.broker_use_ssl) # <-ici
        celery.backend.connparams['connection_class'] = SSLConnection # <-ici

    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True

        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)

    celery.Task = ContextTask
    return celery

ʻApp, qui est passé comme argument de make_celery, est le contexte d'application de Flask. Après avoir défini broker_use_ssl, vous devez définir celery.backend.connparams ['connection_class'] = SSLConnection`.

De plus, la documentation indique que broker_use_ssl peut être défini sur True ou sur un dictionnaire, mais définir ** True ne fonctionne pas. ** Vous devez définir le dictionnaire. Contrairement à Ruby, le dictionnaire sera jugé comme «False» s'il est vide.

broker_use_ssl = {'ssl_cert_reqs': ssl.CERT_NONE}

Je pense que c'est une bonne idée de le garder.

mot de passe

Dans Céleri, définissez un mot de passe

CELERY_BROKER_URL = "redis://:password@hostname:port/db_number"

Doit être défini au format. J'ai gaspillé ma connaissance de HTTP, alors? Puis-je inclure le mot de passe dans l'URI? J'ai pensé, mais quand j'ai regardé l'implémentation interne, l'URI a été correctement analysé en interne.

finalement

L'implémentation interne de Celery était étonnamment compliquée et difficile à lire. En outre, la documentation Azure indique Comment utiliser Azure Redis Cache avec Python

Par défaut, les ports non SSL sont désactivés pour les nouvelles instances Azure Redis Cache car certains clients Redis ne prennent pas en charge SSL. Au moment d'écrire ces lignes, le client redis-py ne prend pas en charge SSL.

Cependant, en ce qui concerne le journal de validation, redis-py prend en charge SSL à partir de 2014. J'aimerais que vous mettiez à jour l'ancienne description. C'est plutôt déroutant.

URL de référence

Recommended Posts

Utiliser SSL avec Celery + Redis
Utilisez mecab-ipadic-neologd avec igo-python
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Utiliser l'indicateur avec pd.merge
Utiliser Gentelella avec Django
Utiliser mecab avec Python 3
Utiliser DynamoDB avec Python
Utiliser pip avec MSYS2
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser python avec docker
Utiliser TypeScript avec django-compresseur
Utilisez LESS avec Django
Utiliser MySQL avec Django
Utiliser Enum avec SQLAlchemy
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Utilisez nim avec Jupyter
[blackbird-redis] Surveiller Redis avec blackbird
Utiliser l'API Trello avec python
Utiliser la mémoire partagée avec une bibliothèque partagée
Utiliser des balises personnalisées avec PyYAML
Utiliser des graphiques directionnels avec networkx
Utiliser TensorFlow avec Intellij IDEA
Utiliser DATE_FORMAT avec le filtre SQLAlchemy
Utiliser TUN / TAP avec Python
Utilisez sqlite3 avec NAO (Pepper)
Utilisez les load_extensions de sqlite avec Pyramid
Utiliser les polices Windows 10 avec WSL
Utilisation du chainer avec Jetson TK1
Utiliser Cython avec Jupyter Notebook
Utilisez Maxout + CNN avec Pylearn2
Utilisez WDC-433SU2M2 avec Manjaro Linux
Utilisez OpenBLAS avec numpy, scipy
Utiliser l'API subsonique avec python3
Utilisation de Sonicwall NetExtener avec Systemd
Utilisez prefetch_related commodément avec Django
Utiliser l'interpréteur AWS avec Pycharm
Utilisation de Bokeh avec IPython Notebook
Utiliser une plage de type Python avec Rust
Utiliser MLflow avec Databricks ④ --Call model -
Gérez les clés Base91 avec python + redis.
Utiliser pyright avec CentOS7, emacs lsp-mode
Python: comment utiliser async avec
Utilisation de la base de données SQL d'Azure avec SQL Alchemy
Utiliser la caméra Point Grey avec Python (PyCapture2)
Utilisez vl53l0x avec RaspberryPi (python)
Utilisez PX-S1UD / PX-Q1UD avec Jetson nano
Utilisez la fonction de prévisualisation avec aws-cli
Pour utiliser virtualenv avec PowerShell
Utilisez NAIF SPICE TOOL KIT avec Python
Utiliser rospy avec virtualenv dans Python3
Utiliser Markdown avec le notebook Jupyter (avec raccourci)
Utiliser Python mis en pyenv avec NeoVim
Utilisez Tensorflow 2.1.0 avec Anaconda sur Windows 10!