Django アプリケーションの AWS/Heroku へのデプロイ手順
Django アプリケーションを AWS または Heroku にデプロイすることは、開発した Web アプリケーションを世界に公開するための重要なステップです。それぞれのプラットフォームには独自の利点とデプロイ戦略があります。ここでは、両方のプラットフォームにおけるデプロイ手順を詳細に解説し、共通して考慮すべき事項についても触れていきます。
AWS へのデプロイ
AWS は非常に柔軟で強力なクラウドプラットフォームですが、その分、設定項目が多く、学習コストが高い側面もあります。ここでは、代表的なデプロイ方法として、EC2 インスタンス上に直接デプロイする方法と、Elastic Beanstalk を利用する方法を説明します。
EC2 インスタンスへの直接デプロイ
この方法は、サーバー環境を完全にコントロールしたい場合に適しています。
1. AWS アカウントの準備
まず、AWS アカウントを作成し、IAM ユーザーを作成して必要な権限を付与します。
2. EC2 インスタンスの起動
* AWS マネジメントコンソールにログインし、EC2 サービスに移動します。
* 「インスタンスを起動」ボタンをクリックし、AMI(Amazon Machine Image)として Ubuntu Server などの Linux ディストリビューションを選択します。
* インスタンスタイプ(t2.micro など無料利用枠でも利用可能なもの)を選択します。
* キーペアを作成または既存のものを選択し、ダウンロードしておきます。これは SSH 接続に必要です。
* セキュリティグループを設定します。SSH(ポート 22)と HTTP/HTTPS(ポート 80/443)へのアクセスを許可します。
* インスタンスを起動します。
3. SSH 接続と環境設定
* 起動したインスタンスのパブリック IP アドレスを確認します。
* ダウンロードしたキーペアを使用して SSH でインスタンスに接続します。
“`bash
ssh -i /path/to/your-key.pem ubuntu@
“`
* パッケージリストを更新し、Python、pip、virtualenv などをインストールします。
“`bash
sudo apt update
sudo apt upgrade -y
sudo apt install python3 python3-pip python3-venv -y
“`
* データベースのセットアップを行います。PostgreSQL や MySQL などをインストールし、設定します。AWS RDS を利用する場合は、インスタンスからアクセスできるように設定します。
* Web サーバー(Gunicorn や uWSGI)と リバースプロキシ(Nginx や Apache)をインストールします。
“`bash
sudo apt install nginx gunicorn -y
“`
4. Django プロジェクトの配置と設定
* Git を使用して Django プロジェクトを EC2 インスタンスにクローンします。
“`bash
git clone
cd
“`
* virtualenvを作成し、アクティベートします。
“`bash
python3 -m venv venv
source venv/bin/activate
“`
* `requirements.txt` から依存関係をインストールします。
“`bash
pip install -r requirements.txt
“`
* `settings.py` を編集します。
* `DEBUG = False` に設定します。
* `ALLOWED_HOSTS` に EC2 インスタンスのパブリック IP アドレスやドメイン名を追加します。
* データベース接続情報を設定します。
* 静的ファイルの収集のために `STATIC_ROOT` を設定し、`collectstatic` コマンドを実行します。
“`bash
python manage.py collectstatic
“`
* データベースマイグレーションを実行します。
“`bash
python manage.py migrate
“`
* Gunicorn を設定し、Django アプリケーションを起動できるようにします。
“`bash
gunicorn –bind 0.0.0.0:8000 your_project.wsgi:application
“`
(`your_project` は Django プロジェクトのメインディレクトリ名)
5. Nginx の設定
* Nginx が Gunicorn にリクエストを転送するように設定します。`/etc/nginx/sites-available/your_project` のようなファイルを作成し、以下のような内容を記述します。
“`nginx
server {
listen 80;
server_name ;
location /static/ {
alias /path/to/your/project/static/;
}
location / {
proxy_pass http://127.0.0.1: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;
}
}
“`
* 設定ファイルを有効にし、Nginx をリロードします。
“`bash
sudo ln -s /etc/nginx/sites-available/your_project /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
“`
6. ファイアウォールの設定 (ufw)**
* ufw を使用している場合は、Nginx の HTTP/HTTPS トラフィックを許可します。
“`bash
sudo ufw allow ‘Nginx Full’
sudo ufw enable
“`
Elastic Beanstalk を利用したデプロイ
Elastic Beanstalk は、デプロイプロセスを簡素化してくれる PaaS (Platform as a Service) です。AWS がインフラストラクチャの管理を代行してくれます。
1. Elastic Beanstalk CLI のインストール**
* AWS CLI をインストールし、設定します。
* EB CLI をインストールします。
“`bash
pip install awsebcli –upgrade –user
“`
2. プロジェクトの準備**
* `requirements.txt` ファイルがプロジェクトのルートディレクトリに存在することを確認します。
* `Procfile` を作成し、Gunicorn を起動するように設定します。
“`
web: gunicorn –bind :$PORT –workers 4 –threads 2 your_project.wsgi:application
“`
(`your_project` は Django プロジェクトのメインディレクトリ名)
* `settings.py` に `DEBUG = False` と `ALLOWED_HOSTS` の設定が必要です。
3. EB CLI を使用したデプロイ**
* プロジェクトのルートディレクトリで EB CLI を初期化します。
“`bash
eb init
“`
プラットフォームとして Python を選択し、アプリケーション名などを設定します。
* アプリケーションを作成し、デプロイします。
“`bash
eb create
“`
これにより、EC2 インスタンス、ロードバランサー、Auto Scaling グループなどが自動的にプロビジョニングされ、アプリケーションがデプロイされます。
* デプロイ後、`eb open` コマンドでアプリケーションにアクセスできます。
Heroku へのデプロイ
Heroku は、開発者がインフラストラクチャの管理に煩わされることなく、アプリケーションの開発に集中できる PaaS です。
1. Heroku アカウントの準備
Heroku アカウントを作成し、Heroku CLI をインストールします。
“`bash
curl https://cli-assets.heroku.com/install.sh | sh
“`
2. プロジェクトの準備
* `requirements.txt` ファイルがプロジェクトのルートディレクトリに存在することを確認します。
* `Procfile` を作成し、Gunicorn を起動するように設定します。
“`
web: gunicorn –bind :$PORT –workers 4 –threads 2 your_project.wsgi:application
“`
(`your_project` は Django プロジェクトのメインディレクトリ名)
* `settings.py` を Heroku 用に設定します。
* `DEBUG = False` に設定します。
* `SECRET_KEY` を環境変数から読み込むようにします。
* `ALLOWED_HOSTS` を設定します。Heroku のドメイン名 (`your-app-name.herokuapp.com`) を追加します。
* データベースは Heroku の PostgreSQL アドオンを利用するのが一般的です。`dj_database_url` ライブラリを使用して、環境変数からデータベース URL を読み込むように設定すると便利です。
“`python
import dj_database_url
DATABASES = {
‘default’: dj_database_url.config(default=’postgres://user:password@host:port/dbname’)
}
“`
* 静的ファイルの配信は、Heroku では `whitenoise` ライブラリを使用するのが一般的です。`whitenoise` を `requirements.txt` に追加し、`settings.py` を設定します。
“`python
MIDDLEWARE = [
‘django.middleware.security.SecurityMiddleware’,
‘whitenoise.middleware.WhiteNoiseMiddleware’, #whitenoiseを追加
# … other middleware
]
STATIC_ROOT = BASE_DIR / ‘staticfiles’
STATICFILES_STORAGE = ‘whitenoise.storage.CompressedManifestStaticFilesStorage’
“`
デプロイ後に `heroku run python manage.py collectstatic` を実行します。
3. Git リポジトリの作成と Heroku アプリケーションの作成
* プロジェクトのルートディレクトリで Git リポジトリを初期化します。
“`bash
git init
“`
* Heroku にログインします。
“`bash
heroku login
“`
* Heroku 上に新しいアプリケーションを作成します。
“`bash
heroku create
“`
“ はユニークな名前である必要があります。
4. デプロイ
* Git のリモートリポジトリとして Heroku を追加します。
“`bash
heroku git:remote -a
“`
* アプリケーションを Heroku にプッシュします。
“`bash
git push heroku main
“`
(`main` はデプロイしたいブランチ名。`master` の場合もあります。)
* デプロイ後、マイグレーションを実行します。
“`bash
heroku run python manage.py migrate
“`
* 静的ファイルを収集します。
“`bash
heroku run python manage.py collectstatic
“`
* アプリケーションにアクセスするには、`heroku open` コマンドを使用するか、Heroku ダッシュボードから URL を確認します。
共通して考慮すべき事項
AWS と Heroku のどちらにデプロイする場合でも、いくつかの共通した考慮事項があります。
データベース
* 本番環境では、SQLite ではなく PostgreSQL や MySQL などの RDBMS を使用することを強く推奨します。
* AWS では RDS、Heroku では PostgreSQL アドオンを利用するのが一般的です。
* データベースへの接続設定は、環境変数 を利用して管理します。
静的ファイルとメディアファイル
* 本番環境では Django の `DEBUG = False` となり、Django は静的ファイルを提供しなくなります。
* 静的ファイルは、Nginx や AWS S3 (with CloudFront)、Heroku の `whitenoise` などで配信します。`collectstatic` コマンドで収集したファイルを配置します。
* メディアファイル(ユーザーがアップロードしたファイル)は、AWS S3 やその他のクラウドストレージサービスに保存し、そこから配信するのが一般的です。
環境変数
* API キー、データベース認証情報、SECRET_KEY などの機密情報は、コードに直接記述せず、環境変数で管理します。
* AWS では EC2 の環境変数設定や AWS Systems Manager Parameter Store、Heroku では Heroku Config Vars を利用します。
ロギング
* 本番環境でのエラーやアクセスログを記録し、デバッグや監視に活用できるように設定します。
* AWS では CloudWatch Logs、Heroku では Heroku Logs を利用します。
HTTPS 化
* SSL/TLS 証明書を設定し、HTTPS で通信できるようにします。
* AWS では ACM (AWS Certificate Manager) と ELB (Elastic Load Balancing) または CloudFront と連携させます。
* Heroku では、HTTPS がデフォルトで提供されます。カスタムドメインを設定した場合は、証明書の設定が必要になることがあります。
CI/CD (継続的インテグレーション/継続的デリバリー)**
* GitHub Actions、GitLab CI/CD、Jenkins などを利用して、コードの変更を自動的にテストし、デプロイするパイプラインを構築することを推奨します。これにより、デプロイプロセスを効率化し、ヒューマンエラーを削減できます。
まとめ
AWS と Heroku は、それぞれ異なるアプローチで Django アプリケーションのデプロイをサポートします。EC2 への直接デプロイは自由度が高い反面、管理の手間がかかります。Elastic Beanstalk は AWS のインフラ管理を簡素化し、Heroku はさらに抽象化された PaaS 環境を提供します。
デプロイ先のプラットフォーム選定は、プロジェクトの要件、チームのスキルセット、予算などを考慮して行います。どちらのプラットフォームを選択するにしても、データベース、静的ファイル、環境変数、HTTPS 化といった共通の考慮事項をしっかりと押さえることが、安定した本番環境を構築する上で不可欠です。CI/CD パイプラインの導入は、デプロイプロセス全体の信頼性と効率性を向上させるために非常に有効です。
