Django, Celery, そして Redis を Railway で使用する - DEV コミュニティ

Django, Celery, Redis を Railway で利用するためのカバーイメージ

はじめに

Django Rest Framework、Celery、Redisを使って、技術分野でのロールを見つける手助けをする個人用クイズを作成しました。このアプリは質問をして、処理に時間がかかる結果のカスタム画像を作ります。そこで、CeleryとRedisを使ってバックグラウンドで作業ができるようにしました!

アプリの構築には1日かかりましたが、本番環境へのデプロイには1週間かかりました。なぜでしょうか?それは、見つけにくい、あるいは存在しないドキュメントという古くからの話です。この壊れたサイクルを技術の世界で断ち切るため、次のステップをカバーするこのチュートリアルを作成しました:

  1. RailwayでRedisをデプロイして設定する方法
  2. RailwayのDjangoサーバーをRedisサーバーに接続する方法
  3. ビルド中にCeleryワーカーを実行する方法

このブログではカバーしないこと:

  1. Pythonの基本
  2. Django Rest Frameworkの導入方法
  3. Celeryの使い方
  4. Redisの使い方

前提条件

  1. 必要なスキル: Django、Redis、Celeryの基本知識
  2. 必要なツール: Redis & Celeryを使用する設定が済んだDjangoプロジェクト

または、このチュートリアルで作成する予定が無い方でも、楽しみながら読み進めることもできます!

セクション2: プロジェクトの概要

1.以下はプロジェクト構造の単純化された概要です。プロジェクトの構造をより良く理解するために
1.このブログでは、注目すべきファイルを太字で示しています

tbc/
├── manage.py
├── ➕ Procfile
├── tbc/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── ➕ celery.py
│   └── wsgi.py
└── quiz/
    ├── migrations/
    │   └── __init__.py
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── serializers.py
    ├── ➕ tasks.py
    ├── tests.py
    ├── urls.py
    └── views.py

celery.py

import os

from celery import Celery

# 'celery'プログラムのデフォルトDjango設定モジュールを設定します。
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tbc.settings')

app = Celery('tasks',
             backend=os.getenv('REDIS_URL'),
             broker=os.getenv('REDIS_URL')
             )

# ここで文字列を使用することで、ワーカーは子プロセスに設定オブジェクトをシリアライズする必要がなくなります。
# - namespace='CELERY'は、全てのcelery関連の設定キーは`CELERY_`プレフィックスを持つべきことを意味します。
app.config_from_object('django.conf:settings', namespace='CELERY')

# すべての登録されているDjangoアプリからタスクモジュールをロードします。
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

Railwayのセットアップ

RailwayでRedisサーバーを作成する

異なる環境用にファイルが用意できたので、次はRailwayのプロジェクトへ行って新しいRedisインスタンスを追加しましょう。

1. スタートするにはRailwayダッシュボードに行き、Redisセットアップを追加したいプロジェクトを選択します。プロジェクトに入ったら、' + New 'をクリックしてサービスドロップダウンを表示します。

![Railwayダッシュボードのスクリーンショット。' + New 'ボタンをクリックして新しいサービスを作成します。](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s0nc9scypk92bln6mx8n.png)

2. ドロップダウンから、Redisをタイピングしてポップアップさせるか、またはデータベースを選択してRedisオプションを見つけることにより、Redisを選んでください。

検索ボックスにRedisと入力して'Add Redis'オプションをクリックしているユーザーのスクリーンショット

Railway参照変数を追加する

コード内で、REDIS_URL環境変数をcelery.pyファイルで使用しており、作業している各環境に応じた異なるRedis URLをプロジェクトで使用できるようにしています。

本番環境用には、先ほど作成したRedisサーバーに接続するためのREDIS_URLに設定します。これを行うために、RailwayのRedis_URL用の参照変数を利用します。

>ℹ️ Railwayの参照変数は、Railwayが提供するサービス用の変数を追加するための素早い方法と考えることができます。値の入力やコピーペーストをせずに、Railwayが値を指定してくれるからです! このトピックについてもっと学びたいですか? その場合は[この変数に関するドキュメント](https://docs.railway.app/develop/variables)をチェックしてください。

ユーザーがRailwayから定義済みの変数のリストからRedis_Url変数を環境設定に追加しているスクリーンショット

RailwayでCeleryタスクを実行して監視する

  1. Celeryワーカーを実行するには、Procfileを次のように更新する必要があります:
web: celery -A tbc worker --loglevel=info & python manage.py migrate && gunicorn tbc.wsgi  --bind 0.0.0.0:$PORT
**これは何をしているのでしょうか?**
これにより、サイトのデプロイ時にRailwayがceleryワーカーを実行できるようになります。このタスクが実行されていないと、Djangoアプリはceleryワーカーに接続することができません。

> ℹ️ 「おや、ローカルで実行するときはRedisサーバーを起動しなきゃいけないけど、本番環境でもやらないとダメですか?」と思うかもしれません。答えはいいえです。なぜならRailwayがやってくれるからです。

なぜProcfileファイルを更新するのですか?

ローカルファイルで作業するときは、DjangoとRedisサーバーを開始し、celeryワーカーを実行し、すべてのマイグレーションを実行して確認します。

Procfileファイルとは何ですか?
Procfileは、Railwayがサーバーを起動した後にこれらのコマンドなどをサーバーが実行する方法を伝えるものです。

追加したコマンドはどういう意味ですか?
celery -A tbc worker --loglevel=info & を他のコマンドの前に追加することで、タスクが実行できるようにRailwayに指示しています。ここで一つ指摘しておきたいのは、タスクの順序が重要です。アプリのビルド中にceleryが稼働していないと、ビルドエラーに遭遇する可能性があるためです。

ℹ️ もしProcfileファイルに慣れている人であれば、下記のように、ワーカーの下にceleryの詳細を記載することに慣れているかもしれません。Railwayはwebの下でのコマンドしか読まないため、ワーカーの詳細をwebラインに配置しています。

web: python manage.py migrate && gunicorn tbc.wsgi
worker: celery -A tbc worker --loglevel=info

テストの準備が整いました

この段階で、すべてが接続され、本番環境でテストを実行する準備が整いました!タスクにログを追加している場合、この情報はRailwayのDjangoサーバーに表示されます。

すべてのワークフローを行い、期待通りに動作していれば、おめでとうございます。成功です!

まとめ

このブログでは、Django、Redis、Celeryを使ってRailway環境を設定しました!

  1. 下記の内容をカバーしました
    1. 本番環境をサポートするためのプロジェクトの設定方法
    2. RailwayでRedisサーバーを作成するステップ
    3. 本番環境でのDjangoサーバーをRedisサーバーに接続する方法

その他のリソース

  1. ドキュメントとその他の高度なガイドへのリンク
    1. Redisドキュメント
    2. Railwayドキュメント
    3. 役に立ったDjango Celery Redisガイド

最後まで読んでいただき、ありがとうございます!このブログ記事に関するあなたのフィードバックや考えをお聞かせください。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/techbychoiceorg/django-celery-and-redis-on-railway-214h