Django アプリのデプロイ: 外部 Celery を使用した EC アプリ ランナー

王林
リリース: 2024-08-08 22:54:12
オリジナル
1019 人が閲覧しました

ちょっと待って…

Deploying A Django App: ECs App Runner with External Celery

本番環境に移行するのに忙しいという状況に誰もが遭遇したことがありますが、展開プラットフォームの選択には多くの要因が考慮されます。そうですね、AWS を使います。通常、プラットフォームに固執した後は、アーキテクチャ、コスト、信頼性、スケーラビリティ、可用性、実現可能性などのいくつかの要素に頼ることができます。何だと思う!!! AWS はそれらすべてにおいて信頼されているため、これは信頼性、スケーラビリティ、可用性、実現可能性に関するものではありません。このチュートリアルでは、Django アプリのいくつかのアーキテクチャの良い点と悪い点を特定します。

先に進む前に、何が起こっているかを完全に理解するために、いくつかの前提条件を理解しましょう。

:) このチュートリアルに含まれるすべてのコードは、オープンソースとして利用可能になります。ご自由に足跡を入れてください

前提条件

先に進む前に、次のことを行う必要があります:

  • AWS アカウントをお持ちです
  • Django の知識がある方
  • キュー、タスク、ブローカーとは何かを理解する

キャッシュとは何か、なぜキャッシュするのか

キャッシュは、頻繁にアクセスされるデータを高速アクセスの場所に一時的に保存し、このデータの取得にかかる時間を短縮するために使用される技術です。 AWS では、キャッシュによりプライマリ データベースと API の負荷が最小限に抑えられ、アプリケーションのパフォーマンスとスケーラビリティが向上し、エンドユーザーの応答時間が短縮されます。

効率を高め、レイテンシーを削減し、コストを削減するためにキャッシュを行います。キャッシュはデータをアプリケーションの近くに保存することで、データベース クエリの頻度、ネットワーク トラフィック、および計算負荷を軽減します。これにより、データの取得が高速化され、ユーザー エクスペリエンスが向上し、リソース使用量が最適化されます。これは、高トラフィックのアプリケーションにとって重要です。

ウォーミングアップをしましょう

Deploying A Django App: ECs App Runner with External Celery

  1. EC2:
    Elastic Compute Engine の正式な意味から、EC2 は AWS データセンターにある Web サーバーです。言い換えれば、EC2 は AWS から取得できる仮想的なものです。利用可能なすべての機能を備えた「従量課金制プラン」の下で、非常に安い月額料金で入手できます。

  2. AWS アプリランナー:
    これは、Web アプリケーションと API の実行とスケーリングを簡素化し、開発者がインフラストラクチャ管理なしでコード リポジトリやコンテナ イメージから迅速にデプロイできるようにするフルマネージド サービスです。

  3. セロリとジャンゴセロリ:
    Celery は、Python でリアルタイム処理を行うためのオープンソースの分散タスク キューです。 Django Celery は Celery を Django フレームワークと統合し、Django アプリケーション内での非同期タスクの実行、定期タスク、およびバックグラウンド ジョブ管理を可能にします。このテクノロジーの使用例はさまざまです。これには、通信サービス (SMS、電子メール)、スケジュールされたジョブ (Cron)、およびデータ集約、機械学習モデルのトレーニング、ファイル処理などのバックグラウンド データ処理タスクが含まれます。

  4. Amazon RDS (リレーショナルデータベースサービス):
    これは、クラウドでのリレーショナル データベースのセットアップ、運用、スケーリングを簡素化するマネージド データベース サービスです。 MySQL、PostgreSQL、Oracle、SQL Server などのさまざまなデータベース エンジンをサポートし、自動バックアップ、パッチ適用、高可用性を提供し、ユーザーをデータベース管理タスクから解放します。

  5. このコンテキストでの EC2 と App Runner の比較

アーキテクチャ

アプリがどのように構成されているか、そして展開セットアップがどのように動作するかを調べてみましょう。

    AWS App Runner (ECR) を使用したデプロイメントセットアップ

  1. コードを GitHub にプッシュし、CodePipeline ワークフローをトリガーします。 CodePipeline は CodeBuild を使用して、リリースのバージョン管理のために Elastic Container Registry (ECR) に保存される Docker イメージを作成します。このチュートリアルでは、Virtual Private Cloud (VPC) 構成をスキップします。 CloudWatch を使用してログを継続的に監視することで、アプリケーションの健全性を確保します。さらに、静的ファイル用に AWS RDS および S3 によって提供される Postgres を使用するためのプロジェクトの迅速な設定も可能です。Deploying A Django App: ECs App Runner with External Celery

  2. AWS EC2インスタンスを使用したデプロイ
    Deploying A Django App: ECs App Runner with External Celery
    同様のプロセスを使用して、バージョン管理と ECR を省略し、コードを GitHub にプッシュし、CodePipeline をトリガーします。CodePipeline は、CodeBuild を使用して、バージョン管理のために ECR に保存される Docker イメージを作成します。 EC2 インスタンスはこれらのイメージをプルして VPC 内にアプリケーションをデプロイし、エンドユーザーがアクセスできるようにします。アプリケーションは、データ ストレージの場合は RDS、静的ファイルの場合は S3 と対話し、CloudWatch によって監視されます。必要に応じて、certbot などのオプションを使用して、SSL 構成をこのインスタンスに追加できます。

価格比較表

ここでは、典型的な使用シナリオに基づいた EC2 と App Runner の仮想の価格比較を示します:

サービス コンポーネント コストの内訳 月額費用例(概算)
EC2 インスタンスの使用状況 t2.micro (1 vCPU、1 GB RAM) $8.50
ストレージ 30 GB 汎用 SSD $3.00
データ転送 100 GBのデータ転送 $9.00
合計 $20.50
アプリランナー リクエスト 100万件のリクエスト $5.00
コンピューティング 1 vCPU、2 GB RAM、30 時間/月 $15.00
データ転送 100 GBのデータ転送 $9.00
合計 $29.00

管理のしやすさ

これら 2 つのリソースの管理方法について簡単にまとめてみましょう。

要因 EC2 アプリランナー
セットアップ 手動セットアップが必要です フルマネージドサービス
管理オーバーヘッド 高 - OS アップデート、セキュリティ パッチなどが必要です 低抽象度のインフラストラクチャ管理
設定 インスタンス構成の広範な制御 制限された制御、シンプルさを重視

スケーラビリティ

要因 EC2 アプリランナー
スケーリング設定 Auto Scaling グループの手動セットアップ トラフィックに基づいた自動スケーリング
スケーリング管理 設定と監視が必要です AWSによる管理、シームレスなスケーリング
柔軟性 スケーリング ポリシーの高詳細な制御 簡素化され、柔軟性が低下します

導入速度

要因 EC2 アプリランナー
展開時間 遅い - インスタンスのプロビジョニングと構成 より高速な - 管理された導入
アップデートプロセス ダウンタイムまたはローリングアップデートが必要な場合があります シームレスなアップデート
自動化 デプロイメントパイプラインのセットアップが必要です 簡素化された統合された導入

カスタマイズと制御

要因 EC2 アプリランナー
カスタマイズ 広範囲 - 環境を完全に制御 限定された管理環境
コントロール 高 - 特定のインスタンス タイプ、ストレージなどを選択します 下 - 使いやすさを重視
柔軟性 高 - 特殊な構成に適しています 標準的な Web アプリケーション向けに簡素化

安全

要因 EC2 アプリランナー
セキュリティ管理 セキュリティ構成の高度で詳細な制御 シンプルなセキュリティ管理
管理 セキュリティグループ、IAMの手動構成が必要です AWS によって管理され、より細分化された制御
コンプライアンス コンプライアンス構成のための広範なオプション コンプライアンス管理の簡素化

プロジェクトのセットアップ

プロジェクトの比較はプロジェクトの設定自体には依存しないことを前提としています。 AWS の celery 構成を使用した基本的な Django アプリケーションを用意します。
Django を使用した基本的なプロジェクトを進めていきます。

依存関係のインストールとプロジェクトの作成:

コマンドは以下の順序で実行する必要があります:


リーリー

この時点で、これでプロジェクトのスケルトンを確認できます:


リーリー

そして現時点ではこれを持っているはずです


リーリー

コードとロジック

アプリのロジックに数行を追加し、このプロジェクトの別のマイルストーンをカバーすることで、次に進むことができます。

1- セロリの準備

リーリー

2- セロリ変数を上書きしてブローカーを設定しましょう


リーリー

3-

init.py を更新して、Django の起動時にアプリが確実に読み込まれるようにします。リーリー
4- タスクを作成します

リーリー
5- ここで、単純な Json 応答を含む単純なビューを追加しましょう。

リーリー
6- アクセスを可能にするエンドポイントがなければ、ビューを持つことはできません

リーリー
7- アプリの URL をプロジェクト全体の一般的な urls.py に追加します。

リーリー
環境変数の追加:

リーリー
これらすべての手順を適切にフォローアップすると、次の出力が得られます:


Deploying A Django App: ECs App Runner with External CeleryAWS環境のセットアップ

AWS に出荷しているため、いくつかのリソースを設定する必要があります

新しい VPC (仮想プライベート クラウド) の作成

私たちは、リソース間の安全なアクセスと通信のために、隔離された環境とネットワークを作成します。Deploying A Django App: ECs App Runner with External Celery
セキュリティグループの作成

以前に作成した VPC の下にセキュリティ グループを作成し、受信ルールと送信ルールを TCP ポート 6379 (Redis ポート) に追加します。Deploying A Django App: ECs App Runner with External Celery
ElasticCache から RedisOSS を作成する

Deploying A Django App: ECs App Runner with External Celery基本的に、AWS Elastic Cache はキャッシュに関して 2 つの種類、つまり RedisOSS と memCache を提供します。 RedisOSS は高度なデータ構造と永続化機能を提供しますが、Memcached はよりシンプルで、キーと値のペアの高速キャッシュに重点を置いています。 Redis は、Memcached とは異なり、レプリケーションとクラスタリングもサポートしています。ビジネスに戻り、Redis に戻ります。

Elastic Container Registry (ECR) のセットアップ

ECR イメージの作成は非常にシンプルで簡単です。Deploying A Django App: ECs App Runner with External Celery
1: App Runner をデプロイするためのアップデート

以下の手順に従って、アプリランナーを実行します。


Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
ここでは非常に技術的になる必要があります。 VPC は、ほとんどのリソースが置かれている安全なネットワークです。アプリランナーは VPC 内に見つからないため、これらのリソース間の通信に安全な手段を提供する必要があります。Deploying A Django App: ECs App Runner with External Celery
資格情報 ユーザーの資格情報

このチュートリアルでは、ワークフローを ECR に接続するための承認が必要になります。次に、AmazonEC2ContainerRegistryFullAccess アクセス許可ポリシーを追加して、イメージを AWS ECR にプッシュできるようにします。


Deploying A Django App: ECs App Runner with External Celery結果

すべてが完了すると、このツリー構造が完成します。


Deploying A Django App: ECs App Runner with External Celery

Deploying A Django App: ECs App Runner with External Celeryこのチュートリアルのコードベース全体は My GitHub にあります。

TWO: Deploying to an EC2

We will go with one the easiest EC2 to setup and the one having a free tier, an ubuntu EC2 instance. And The same code base that was used above is the same we are using here.

Creating an EC2

![EC2 1]https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rk8waijxkthu1ule91fn.png)
Deploying A Django App: ECs App Runner with External Celery
Alternatively, we can setup the security group separately.
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery

Setting up the EC2

Run this script to install necessary dependencies

#!/bin/bash # Update the package list and upgrade existing packages sudo apt-get update sudo apt-get upgrade -y # Install Python3, pip, and other essentials sudo apt-get install -y python3-pip python3-dev libpq-dev nginx curl # Install Redis sudo apt-get install -y redis-server # Start and enable Redis sudo systemctl start redis.service sudo systemctl enable redis.service # Install Supervisor sudo apt-get install -y supervisor # Install virtualenv sudo pip3 install virtualenv # Setup your Django project directory (adjust the path as needed) cd ~/aws-django-redis # Create a virtual environment virtualenv venv # Activate the virtual environment source venv/bin/activate # Install Gunicorn and other requirements pip install gunicorn pip install -r requirements.txt # Create directories for logs if they don't already exist sudo mkdir -p /var/log/aws-django-redis sudo chown -R ubuntu:ubuntu /var/log/aws-django-redis # Supervisor Configuration for Gunicorn echo "[program:aws-django-redis] command=$(pwd)/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 my_schedular.wsgi:application directory=$(pwd) autostart=true autorestart=true stderr_logfile=/var/log/aws-django-redis/gunicorn.err.log stdout_logfile=/var/log/aws-django-redis/gunicorn.out.log user=ubuntu " | sudo tee /etc/supervisor/conf.d/aws-django-redis.conf # Supervisor Configuration for Celery echo "[program:celery] command=$(pwd)/venv/bin/celery -A my_schedular worker --loglevel=info directory=$(pwd) autostart=true autorestart=true stderr_logfile=/var/log/aws-django-redis/celery.err.log stdout_logfile=/var/log/aws-django-redis/celery.out.log user=ubuntu " | sudo tee /etc/supervisor/conf.d/celery.conf # Reread and update Supervisor sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all # Set up Nginx to proxy to Gunicorn echo "server { listen 80; server_name ; location / { proxy_pass http://127.0.01:8000; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; } error_log /var/log/nginx/aws-django-redis_error.log; access_log /var/log/nginx/aws-django-redis_access.log; }" | sudo tee /etc/nginx/sites-available/aws-django-redis # Enable the Nginx site configuration sudo ln -s /etc/nginx/sites-available/aws-django-redis /etc/nginx/sites-enabled/ sudo rm /etc/nginx/sites-enabled/default # Test Nginx configuration and restart Nginx sudo nginx -t sudo systemctl restart nginx
ログイン後にコピー

Results

This setup is available on GitHub on the dev branch, have a look and open a PR.
Deploying A Django App: ECs App Runner with External Celery
Deploying A Django App: ECs App Runner with External Celery

Pricing and Setup Comparison Table

Feature / Service Self-Managed on EC2 (Free Tier) Fully Managed AWS Services
EC2 Instance t2.micro - Free for 750 hrs/mo Not applicable
Application Hosting Self-managed Django & Gunicorn AWS App Runner (automatic scaling)
Database Self-managed PostgreSQL Amazon RDS (managed relational DB)
In-Memory Cache Redis on the same EC2 Amazon ElastiCache (Redis)
Task Queue Celery with Redis AWS managed queues (e.g., SQS)
Load Balancer Nginx (self-setup) AWS Load Balancer (integrated)
Static Files Storage Serve via Nginx Amazon S3 (highly scalable storage)
Log Management Manual setup (Supervisor, Nginx, Redis) AWS CloudWatch (logs and monitoring)
Security Manual configurations AWS Security Groups, IAM roles
Scaling Manual scaling Automatic scaling
Maintenance Manual updates and patches Managed by AWS
Pricing Minimal (mostly within free tier) Higher due to managed services

コストの概要

  • AWS 無料利用枠を使用したセットアップ: 無料利用枠の制限内にある場合は、基本的に無料です。使用量が無料枠の許容範囲を超えると、潜在的な費用が発生する可能性があります。
  • すべての有料 AWS サービスを使用したセットアップ: EC2、Elasticache、および RDS 用の 1 つの t2.micro インスタンスの継続運用を想定し、データ転送とストレージの追加コストを想定して、月額約 41.34 ドルと見積もられます。

: 料金は概算であり、地域や特定の AWS の料金変更によって異なる場合があります。特定の要件に応じた最も正確なコスト見積もりを得るには、常に現在の AWS 料金ページを確認してください。

分析

  • EC2 でのセルフマネージド: このアプローチは、特に AWS 無料枠を使用する場合にコスト効率が高くなります。より多くのセットアップと手動メンテナンスが必要ですが、環境を完全に制御できます。小規模または低予算のプロジェクトに最適です。
  • フルマネージド AWS サービス: これにより運用コストは増加しますが、インフラストラクチャの管理、スケーリング、メンテナンスに関連する作業負荷は軽減されます。大規模なアプリケーション、または操作の簡素化とスケーリングが優先される場合に適しています。

まとめ

いやぁぁぁぁぁぁぁぁぁ!!!残念ながら、この件に関する要約はありません。はい、理解を深めるために前に戻ってください。

結論

学習の道のりは長く、難しく見えるかもしれませんが、一度に 1 つのリソースを使い、継続的に知識を追加することで、目的と目標を達成することができます。

以上がDjango アプリのデプロイ: 外部 Celery を使用した EC アプリ ランナーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!