はじめに
Djangoは、Pythonベースの人気のあるウェブフレームワークで、迅速な開発とセキュリティを考慮した設計が特徴です。一方、AWS(Amazon Web Services)は、クラウドコンピューティングにおけるリーダーで、信頼性が高く、スケーラブルなインフラを提供します。この二つを組み合わせることで、強力かつ拡張性の高いウェブアプリケーションを構築・運用することが可能です。
AWSとDjangoを使うメリット
DjangoをAWSでホスティングすることで、アプリケーションの運用が効率化され、パフォーマンスとセキュリティが向上することが期待できます。この記事では、具体的な手順を通じて、DjangoアプリケーションをAWSでデプロイする方法を紹介します。

Djangoアプリを作ったけれど、どうやって公開したらいいのか分からない…?そんな方にぴったりの、AWSでのDjangoアプリケーションのデプロイ手順をまとめたガイドを作りました!クラウドに興味がある方やアプリの公開に挑戦してみたい方は、ぜひ気軽にチェックしてみてくださいね!
必要な準備
AWSでDjangoアプリケーションをデプロイする前に、いくつかの準備が必要です。ここでは、AWSアカウントの作成からDjangoプロジェクトのセットアップまでの基本的な手順を紹介します。
AWSアカウントの作成
AWSを使用するためには、まずAWSアカウントが必要です。以下の手順でアカウントを作成します。
- AWS公式サイト にアクセスし、「アカウントを作成」ボタンをクリックします。
- メールアドレスやクレジットカード情報を入力し、アカウントを作成します。
- アカウント作成後、AWSコンソールにログインします。ここから各種サービスにアクセスできます。
Djangoプロジェクトの準備
既存のDjangoプロジェクトを持っていない場合は、新規プロジェクトを作成する必要があります。また、仮想環境を設定することで、依存関係の管理を簡単にすることができます。
手順
- Pythonとpipのインストール
Pythonがインストールされていない場合、公式サイトからインストールします。
python --version
pip --versionこれらのコマンドでインストールの確認ができます。
- 仮想環境のセットアップ
仮想環境は、Pythonプロジェクトの依存関係を隔離するために使用されます。
python -m venv myenv
source myenv/bin/activate # Windowsでは `myenv\Scripts\activate`- Djangoのインストール
仮想環境がアクティブな状態で、以下のコマンドを実行し、Djangoをインストールします。
pip install django- Djangoプロジェクトの作成
インストールが完了したら、新しいDjangoプロジェクトを作成します。
django-admin startproject myproject
cd myproject- ローカルでの確認
開発サーバーを起動して、ローカル環境でアプリが正常に動作するか確認します。
python manage.py runserverDjangoアプリケーションがローカルで正常に動作することを確認したら、次にAWS上でのデプロイ準備に移ります。
EC2のセットアップ

AWSでDjangoアプリケーションをデプロイする際、EC2(Elastic Compute Cloud)インスタンスを使って、アプリケーションをホストするサーバーを作成します。EC2は、AWSの仮想サーバーサービスで、必要に応じてコンピューティングリソースをスケールできる柔軟なソリューションです。
EC2インスタンスの作成
まずは、EC2インスタンスを作成し、Djangoアプリケーションをデプロイするための環境を構築します。
手順
- AWSコンソールにログイン
AWSコンソールにアクセスし、サービスメニューから「EC2」を選択します。 - インスタンスの起動
- 「インスタンスを起動」ボタンをクリックして、インスタンス作成ウィザードを開始します。
- AMI(Amazon Machine Image)の選択
オペレーティングシステムとして、Amazon Linux 2 か Ubuntu を選択します(本記事では、Ubuntuを前提に進めます)。 - インスタンスタイプの選択
開発やテスト環境の場合、無料枠内で使用できる「t2.micro」インスタンスタイプを選択します。 - キーペアの設定
インスタンスにアクセスするためのキーペアを作成または既存のものを選択します。キーペアをダウンロードし、安全な場所に保管してください。 - セキュリティグループの設定
HTTP(ポート80)とSSH(ポート22)を許可するセキュリティグループを作成します。これにより、Webアクセスとリモート接続が可能になります。
- インスタンスの起動
インスタンスの設定が完了したら、「インスタンスを起動」をクリックして、インスタンスを起動します。
EC2インスタンスへのSSH接続
インスタンスが起動したら、SSHを使ってリモート接続し、サーバーにアクセスします。以下の手順で接続します。
手順
- ターミナルを開く
キーペアを保存したディレクトリに移動し、SSH接続を行います。 - SSHコマンドを実行 インスタンスのパブリックIPアドレスとキーペアファイルを使用して、SSH接続を行います。以下は基本的な接続コマンドの例です。
ssh -i "your-key-pair.pem" ubuntu@your-ec2-public-ip必要なパッケージのインストール
EC2インスタンスに接続できたら、Djangoアプリケーションを実行するための環境を整えます。
アップデートとPythonのインストール
まずはパッケージリストを最新に更新し、必要なツールをインストールします。
sudo apt update
sudo apt upgrade
sudo apt install python3-pip python3-dev libpq-dev nginx git仮想環境のセットアップ
仮想環境を使って、Djangoプロジェクトの依存関係を管理します。
sudo apt install python3-venv
python3 -m venv myenv
source myenv/bin/activateDjangoとGunicornのインストール
仮想環境内で、DjangoとGunicorn(Djangoのアプリケーションサーバー)をインストールします。
pip install django gunicornこれで、EC2インスタンス上でDjangoを実行するための基本的なセットアップが完了しました。
データベースのセットアップ
Djangoアプリケーションでは、データベースが重要な役割を果たします。AWSでは、Amazon RDS(Relational Database Service)を利用して、データベースをホストすることが一般的です。RDSは、信頼性が高く、スケーラブルなデータベースサービスで、PostgreSQLやMySQLなどのデータベースエンジンを選択できます。
ここでは、Amazon RDSを使ってPostgreSQLのデータベースを設定し、Djangoアプリケーションと接続する方法を紹介します。
Amazon RDSの作成
まずは、AWSコンソールからRDSインスタンスを作成します。
手順
- RDSダッシュボードにアクセス
AWSコンソールにログインし、「RDS」を選択します。 - データベースの作成
- 「データベースの作成」ボタンをクリックします。
- エンジンの選択
PostgreSQLを選択しますが、DjangoはMySQLや他のデータベースとも互換性があるため、必要に応じて他のエンジンも選べます。 - インスタンスの仕様
開発やテスト環境の場合、無料枠に該当する「db.t2.micro」インスタンスを選択します。 - 認証情報の設定
データベースの管理者ユーザー名とパスワードを設定します。これらは後ほどDjangoと接続する際に使用するため、メモしておきましょう。
- ネットワークとセキュリティの設定
- VPCとサブネットの選択
デフォルトのVPCを選択します。RDSがEC2インスタンスからアクセスできるように設定する必要があるため、同じVPC内にインスタンスを作成します。 - セキュリティグループの設定
EC2インスタンスからRDSにアクセスできるよう、RDSインスタンスのセキュリティグループにPostgreSQL用のポート(通常は5432)を開放します。
- VPCとサブネットの選択
- データベースの起動 設定が完了したら、RDSインスタンスを起動します。起動には数分かかることがあります。
DjangoとRDSの接続設定
RDSインスタンスが起動したら、Djangoアプリケーションから接続できるように設定を行います。
RDSのエンドポイントを確認
RDSインスタンスの「エンドポイント」を確認し、Djangoの設定ファイルに追加します。このエンドポイントがデータベースサーバーのアドレスとして使用されます。
Djangoのsettings.pyを編集
settings.pyファイルを開き、以下のようにデータベース設定を変更します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'your_db_endpoint',
'PORT': '5432',
}
}依存関係のインストール
PostgreSQLを使用する場合、DjangoがPostgreSQLに接続できるように、psycopg2パッケージをインストールする必要があります。
pip install psycopg2データベースのマイグレーション
RDSとDjangoが正しく接続されたら、Djangoのデータベースマイグレーションを実行します。
python manage.py migrateこれにより、DjangoアプリケーションのデータベーススキーマがRDSに反映され、アプリケーションが正しく機能するようになります。
静的ファイルとメディアファイルの設定

Djangoアプリケーションでは、CSSやJavaScriptファイル、画像などの静的ファイルを効率的に配信する必要があります。また、ユーザーがアップロードするファイル(メディアファイル)も別途管理します。これらのファイルは、Amazon S3(Simple Storage Service)を利用することで、高速かつ信頼性の高い配信が可能になります。
この章では、Amazon S3を使って静的ファイルとメディアファイルを管理する手順を説明します。
Amazon S3バケットの作成
Amazon S3に静的ファイルとメディアファイルを保存するためのS3バケットを作成します。
手順
- S3ダッシュボードにアクセス AWSコンソールにログインし、サービスメニューから「S3」を選択します。
- 新しいバケットを作成
- 「バケットを作成」ボタンをクリックし、バケット名を設定します。バケット名はグローバルで一意である必要があります(例:
my-django-static-bucket)。 - リージョンの選択
デプロイしているEC2インスタンスと同じリージョンを選択することで、パフォーマンスを向上させることができます。 - 公開アクセスの設定
静的ファイルやメディアファイルはインターネットからアクセスできる必要があるため、公開アクセスを許可します。ただし、セキュリティを考慮し、不要なファイルにアクセスされないようポリシーを調整します。 - オブジェクト所有者の設定
「ACLの有効化」を選択し、「バケット所有者がオブジェクトを完全に制御できる」設定にします。
- 「バケットを作成」ボタンをクリックし、バケット名を設定します。バケット名はグローバルで一意である必要があります(例:
- バケットポリシーの設定 S3バケットにアクセス制御を設定するため、バケットポリシーを追加します。静的ファイルを公開するための基本的なポリシーは以下のようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}この設定により、バケット内のファイルが公開され、外部からアクセス可能になります。
Djangoの設定ファイルの更新
DjangoアプリケーションがS3を利用して静的ファイルとメディアファイルを管理できるようにするため、Djangoの設定を変更します。
依存パッケージのインストール
S3バケットをDjangoで扱うために、boto3 と django-storages パッケージをインストールします。
pip install boto3 django-storagessettings.pyの設定を更新
Djangoのsettings.pyファイルに、以下の設定を追加します。これにより、S3を使って静的ファイルとメディアファイルを管理できます。
# S3の設定
AWS_ACCESS_KEY_ID = 'your-access-key-id'
AWS_SECRET_ACCESS_KEY = 'your-secret-access-key'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'your-region' # 例: 'us-west-1'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
# 静的ファイルの設定
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# メディアファイルの設定
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'静的ファイルの収集
設定が完了したら、Djangoのコマンドを使用して静的ファイルをS3にアップロードします。
python manage.py collectstaticこれにより、STATICFILES_DIRSに定義された静的ファイルがS3バケットにアップロードされ、ブラウザからアクセスできるようになります。
メディアファイルのアップロード確認
アプリケーションでユーザーがアップロードするメディアファイルは、上記の設定により自動的にS3バケットに保存されるようになります。これを確認するために、アプリケーションから画像やファイルをアップロードし、S3に正常に保存されることを確認します。
アプリケーションのデプロイ
ここでは、EC2インスタンス上にDjangoアプリケーションをデプロイし、Gunicorn(アプリケーションサーバー)とNginx(Webサーバー)を使用してアプリケーションを公開する手順を説明します。GunicornはDjangoアプリケーションを処理し、Nginxは外部からのリクエストを受け取ってGunicornに渡す役割を果たします。
Gunicornの設定と起動
Gunicornは、Djangoアプリケーションを効率的に実行するためのWSGI(Web Server Gateway Interface)サーバーです。以下の手順でGunicornを設定し、起動します。
Gunicornのインストール
仮想環境内でGunicornをインストールしていない場合は、以下のコマンドでインストールします。
pip install gunicornGunicornでDjangoアプリケーションを起動
まず、DjangoアプリケーションがGunicornを使って正しく動作するか確認します。以下のコマンドを実行して、DjangoアプリケーションをGunicornで起動します。
gunicorn --workers 3 myproject.wsgi:applicationこの状態で、ブラウザでEC2インスタンスのIPアドレスにアクセスし、アプリケーションが表示されるか確認します。
Nginxのリバースプロキシ設定
Gunicorn単体での運用は推奨されないため、Nginxを使ってリバースプロキシを設定し、外部からのリクエストを処理する役割を持たせます。以下の手順でNginxを設定します。
Nginxのインストール
EC2インスタンスにNginxをインストールします。
sudo apt install nginxインストールが完了したら、Nginxサービスを開始します。
sudo systemctl start nginx
sudo systemctl enable nginxNginxの設定ファイルを編集
次に、Nginxの設定ファイルを編集して、Gunicornにリクエストを転送するように構成します。Nginxのサイト設定ファイルを作成または編集します。
sudo nano /etc/nginx/sites-available/myproject以下の内容をファイルに追加します。
server {
listen 80;
server_name your_domain_or_IP;
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;
}
location /static/ {
alias /path/to/staticfiles/;
}
location /media/ {
alias /path/to/mediafiles/;
}
}Nginxの有効化とリスタート
Nginxの設定を有効にし、Nginxサービスをリスタートします。
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t # 設定が正しいかテスト
sudo systemctl restart nginxこれで、NginxがGunicornを通じてDjangoアプリケーションを提供するようになりました。
Djangoの設定ファイルの更新
本番環境では、Djangoの設定を適切に変更しておく必要があります。
ALLOWED_HOSTS の設定
settings.py の ALLOWED_HOSTS 設定を更新し、デプロイ環境に応じてホストを指定します。例えば、EC2のIPアドレスやドメインを指定します。
ALLOWED_HOSTS = ['your_domain_or_IP']DEBUG の無効化
本番環境では、DEBUG モードを必ず無効にします。
DEBUG = False静的ファイルとメディアファイルのパスを確認
S3バケットに正しく静的ファイルとメディアファイルが保存され、正しいURLでアクセスできるように確認します。
セキュリティと運用

本番環境にDjangoアプリケーションをデプロイした後は、セキュリティ対策と運用管理が重要です。特に、外部からの攻撃を防ぎ、安定したサービスを提供するために、SSLによるHTTPS化や、AWSのセキュリティ機能を活用することが推奨されます。この章では、SSLの設定やセキュリティグループの管理、自動スケーリングについて説明します。
HTTPSの設定(SSL証明書の導入)
インターネット上でデータを安全にやり取りするために、DjangoアプリケーションをHTTPS対応にすることが重要です。AWSでは、Amazonが提供する無料のSSL証明書を使って、HTTPSを簡単に設定できます。
Amazon Certificate Manager(ACM)の利用
まず、AWSのACMを使用してSSL証明書を取得します。ACMでは、Amazon CloudFrontやElastic Load Balancer(ELB)と連携してSSL証明書を自動管理できます。
手順
- ACMダッシュボードにアクセス
AWSコンソールにログインし、「Certificate Manager」サービスを開きます。 - 新しい証明書をリクエスト
- 「証明書をリクエスト」ボタンをクリックし、ドメインの所有権を確認します。
- ドメインの検証には、DNSを使った検証方法が推奨されます。AWS Route 53を使用している場合は、簡単にDNSレコードを追加できます。
- 証明書の発行 所有権が確認されたら、SSL証明書が発行されます。
Elastic Load Balancer(ELB)でのHTTPS設定
EC2インスタンスに直接SSL証明書を設定することもできますが、一般的にはElastic Load Balancer(ELB)を使用してHTTPSを設定します。ELBを利用することで、複数のEC2インスタンスに負荷を分散しつつ、SSL対応のサイトを提供できます。
手順
- EC2ダッシュボードからELBを作成
- EC2ダッシュボードの「ロードバランサー」セクションで「ロードバランサーの作成」を選択します。
- アプリケーションロードバランサー を選択し、リスナーにHTTPSを追加します。
- ACM証明書の適用
- 設定画面で、先ほど発行したACM証明書を選択し、ロードバランサーに適用します。
- リスナー設定でポート80(HTTP)からポート443(HTTPS)へリダイレクトする設定を追加することで、HTTPアクセスを自動的にHTTPSに変換します。
- ターゲットグループの設定 EC2インスタンスをターゲットグループに追加し、ELBからのリクエストを受け付けるように設定します。
セキュリティグループの設定
AWSのセキュリティグループを使って、EC2インスタンスやRDSインスタンスのトラフィックを制御します。セキュリティグループは、仮想ファイアウォールのような役割を果たし、許可されたIPアドレスやポートのみアクセスを許可します。
EC2インスタンスのセキュリティグループ設定
EC2インスタンスのセキュリティグループでは、必要最小限のポートのみを開放することが推奨されます。
- ポート80(HTTP)とポート443(HTTPS) を外部アクセス用に開放します。
- ポート22(SSH) はリモート管理のために開放しますが、セキュリティの観点から特定のIPアドレスに制限することが望ましいです。
RDSインスタンスのセキュリティグループ設定
RDSインスタンスでは、データベースにアクセスできるIPアドレスやEC2インスタンスのみにポート5432(PostgreSQL用)や3306(MySQL用)を開放します。データベースへの外部からの直接アクセスは防ぐように設定します。
自動スケーリングと負荷分散
AWSの強力な機能の一つとして、自動スケーリング(Auto Scaling)とロードバランシングがあります。これを利用することで、トラフィックの増減に応じてEC2インスタンスを自動的に増減させ、アプリケーションのパフォーマンスを最適化することが可能です。
Auto Scalingグループの設定
Auto Scalingグループを設定して、EC2インスタンスの数を自動的に調整します。これにより、トラフィックが急増した場合にインスタンスを追加し、負荷を分散させます。
手順
- EC2ダッシュボードからAuto Scalingグループを作成
- 起動テンプレート を作成し、スケールするEC2インスタンスの設定を行います。
- スケーリングポリシー を設定し、CPU使用率やトラフィック量に応じてインスタンスの数を調整します。
- ロードバランサーと連携 Auto Scalingグループは、先に設定したELBと連携させて、負荷分散を自動化します。これにより、追加されたインスタンスにもトラフィックが適切に振り分けられます。
ロギングと監視
運用段階では、アプリケーションの監視とログ管理が重要です。AWSのCloudWatchを使用して、リソースの使用状況やアプリケーションの状態を監視します。
- CloudWatchメトリクス でCPU使用率やメモリ使用量をリアルタイムで監視し、問題が発生した場合にアラームを設定します。
- CloudWatchログ を使って、アプリケーションのログを収集し、エラーの発生時に通知を受け取ることができます。
まとめ
AWS上でDjangoアプリケーションをデプロイする手順を通じて、クラウドインフラの強力な機能を活用し、スケーラブルで安全なWebアプリケーションを運用するための基本的なステップを紹介しました。
デプロイの手順を振り返る
- 準備段階
AWSアカウントの作成、Djangoプロジェクトのセットアップを行い、EC2インスタンスを用意してサーバー環境を構築しました。 - EC2とRDSの設定
EC2インスタンスでPythonやDjangoをインストールし、Amazon RDSを利用してデータベースを構築し、Djangoアプリケーションをデータベースと連携させました。 - 静的ファイルとメディアファイルの管理
Amazon S3を使用して、静的ファイルやメディアファイルを効率的に管理し、高速に配信できるようにしました。 - アプリケーションのデプロイ
Gunicornを使用してDjangoアプリケーションを実行し、Nginxでリバースプロキシを設定して、外部からのリクエストを処理できるように構成しました。 - セキュリティとスケーリング
SSL証明書を使ってHTTPS通信を設定し、AWSのセキュリティグループでアクセス制限を行い、自動スケーリングと負荷分散を利用してパフォーマンスを最適化しました。
ベストプラクティス
AWS上でDjangoアプリケーションを運用する際のベストプラクティスは、次の通りです。
- セキュリティの強化
セキュリティグループやIAMポリシーを適切に設定し、不要なアクセスを制限します。また、定期的にシステムをアップデートし、脆弱性の修正を行うことも重要です。 - 自動化とスケーリング
Auto ScalingやElastic Load Balancingを活用して、トラフィックの急増にも対応できる柔軟なインフラを構築します。これにより、常に安定したサービス提供が可能になります。 - ログと監視
CloudWatchを使ってアプリケーションのパフォーマンスやエラーログを監視し、問題が発生した際にすばやく対応できる体制を整えます。
今後の最適化
AWSでの運用をさらに最適化するために、以下の追加ポイントも検討できます。
- コンテナ化の検討
DockerやKubernetesを使って、アプリケーションの環境をコンテナ化し、さらに効率的にデプロイとスケーリングを行うことが可能です。 - キャッシングの導入
AWSのElastiCacheを利用して、RedisやMemcachedでキャッシュを導入し、アプリケーションのレスポンスタイムを向上させます。 - CI/CDの導入
AWS CodePipelineやJenkinsを使ったCI/CD(継続的インテグレーション/デリバリー)を導入することで、アプリケーションの更新やデプロイを自動化し、開発サイクルを効率化します。
これで、DjangoアプリケーションのAWSデプロイに関するすべての手順が完了しました。AWSの様々な機能を活用することで、信頼性が高く、スケーラブルなWebアプリケーションを効率的に運用することができます。これを基に、自身のプロジェクトをさらに最適化していってください。

ここまで読んでいただきありがとうございます!
UdemyのPythonコースにはオンラインで学習ができる動画コンテンツがたくさんあります。
当ブログのような文章メインの説明では足りない箇所を補えると思うので、もっと詳しく勉強したいという方はぜひチェックしてみてください!


コメント