DjangoアプリをAWS EC2とRDSを使ってデプロイする方法

DjangoをAWSにデプロイする方法

Djangoで作成したWebアプリを公開するには、HerokuやAWSを使用するなど様々な方法があります。

ただし、ポートフォリオを作成する場合や本番環境などの場合はHerokuではなくAWSの方がよいでしょう

そこで今回は、WebアプリをAWSのEC2でデプロイする方法を紹介します。

まずはEC2上に直接開発サーバーを起動し、EC2のIPアドレスに対してアクセスするやり方でデプロイします。

以下の記事では、現役エンジニア目線でAWSやDjangoが学べるスクールを4つ厳選したのでぜひ参考にしてください。

>>【2023年最新】AWS初心者におすすめAWSが学べるスクール4選を見る

>>【2023年最新】Djangoが学べるプログラミングスクール4選を見る

目次

デプロイ環境の全体像

Djangoデプロイ環境

ローカルでの環境構築

仮想環境の構築

今回はvenvを使った仮想環境で環境構築をしていきます。

仮想環境とは、簡単にいうとpipなどでインストールしたPythonのパッケージを、他のローカル環境とは分離して管理できる機能です。

プロジェクトごとにパッケージのバージョンなどを分離して管理できるので、Djangoとの相性がいいです。

今回はdjangoawsというプロジェクト名にしようと思うので、まずはdjangoawsというディレクトリを作成します。

$ mkdir djangoaws

次に、作成したディレクトリに移動して、仮想環境を作成しましょう。

仮想環境の作成は、python -m venv <仮想環境名>で行います。

紛らわしいですが、仮想環境名はvenvとします。

$ cd ./djangoaws 
$ python -m venv venv      # 仮想環境の作成

仮想環境ができたら、venvディレクトリが作成されます。

仮想環境を有効化(アクティベート)するには、. <仮想環境ディレクトリ>/bin/activateコマンドを実行します(Windows環境では.\<仮想環境名>\Scripts\activateです)

仮想環境のアクティベートが完了すると、プロンプト(コマンドの先頭の記号)の前に(<仮想環境名>)というのがつくようになります。

$ . venv/bin/activate
(venv)$

試しにこの状態でpip listコマンドを実行すると、確かにローカルにインストールしていた他のpythonパッケージが表示されないことが確認できます。

(venv)$ pip list
Package    Version
---------- -------
pip        22.0.4
setuptools 58.1.0

pythonパッケージのインストール

では、この状態でdjangoをインストールしてみましょう。

インストールができたかを確認したいのですが、次はpip listではなくpip freezeコマンドを使用します。

pip freezeの場合、パッケージ名==バージョンの形式で出力されるので、後で解説するrequirements.txtにそのまま使用できるのがいい点です。

(venv)$ pip install django
(venv)$ pip freeze 
asgiref==3.6.0
Django==3.2.16
sqlparse==0.4.3

djangoが正しくインストールできていたので、続いてMySQLのクライアントであるmysqlclientとgunicornをインストールします。

インストール後は、pip freezeの出力をrequirements.txtに書き込みます。

このrequirements.txtを使用することで、他の環境でも同じパッケージを同じベージョンで一気にインストールできるので、後でEC2で同様のパッケージをインストールするのに便利です。

(venv)$ pip install mysqlclient gunicorn
(venv)$ pip freeze > requirements.txt

requirements.txtの内容は以下のような感じになるかと思います(バージョンはインストールしたタイミングで変わる可能性があります。私の環境に揃えたい場合は、バージョン指定してインストールしてください)

asgiref==3.6.0
Django==3.2.16
gunicorn==20.1.0
mysqlclient==2.1.1
sqlparse==0.4.3

Djangoプロジェクトの作成

djangoのインストールができたので、プロジェクトを作成します。

django-admin startproject djangoaws .コマンドを実行してください(最後のドットを忘れないでください)

lsコマンドの結果も記載しておくので、正しいディレクトリ構成になっているのか確認してみましょう。

(venv)$ django-admin startproject djangoaws .   # djangoプロジェクトの作成
(venv)$ python manage.py startapp app    # djangoアプリの作成
(venv)$ ls -1    # ディレクトリ構成の確認
app
db.sqlite3
djangoaws
manage.py
requirements.txt
venv

Djangoアプリの作成

続いてDjangoアプリの内容を作成していきます。

今回はデプロイが目的なので、ただ画面に”Hello World”と表示するだけのアプリとします。

settings.pyの修正

INSTALLED_APPS = [
    ・・・
    'app.apps.AppConfig',    # 追加
]

urls.pyの修正

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app.urls'))
]
from django.urls import path
from .views import hello


urlpatterns = [
    path('', hello, name='hello')
]

views.py

from django.http import HttpResponse


def hello(request):
    return HttpResponse('Hello World')

サーバー起動

python manage.py runserverコマンドで環境サーバーを起動して、http://127.0.0.1:8000/にアクセスしてブラウザ表示を確認しましょう。

「Hello World」と表示されれば成功です。

(venv)$ python manage.py runserver

AWS側のリソース作成(EC2, RDS)

EC2インスタンスの作成とパッケージのインストール

以下、プロンプトが[ec2-user]$となっているコマンド例は、EC2上で実行するものと思ってください。

EC2インスタンスの作成

まずはデプロイ用のEC2インスタンスを作成します。

以下の記事ではAWS CLIを使用してEC2インスタンスを作成する方法を紹介しているのでご参照ください。

パッケージのインストール

EC2インスタンスを作成したら以下コマンドでパッケージ類のアップデートを行なっておきましょう。

[ec2-user]$ sudo yum update

続いてpython3のインストールです。

python3 --versionでpython3が使えるかどうか確認します。

[ec2-user]$ sudo yum install python3 -y
[ec2-user]$ python3 --version
Python 3.7.15

最後に、その他必要なパッケージ(gcc, python-devel, mysql-devel)をインストールします。

[ec2-user]$ sudo yum install gcc python-devel mysql-devel -y

RDSインスタンスの作成とデータベースの作成

RDSインスタンスの作成

続いてdjangoのデータベースとして使用するRDSインスタンスを作成しましょう。

今回はDBエンジンとしてMySQLを使用します。

以下の記事ではAWS CLIを使用してRDSインスタンスを作成し、EC2インスタンスからアクセスする方法を紹介しているのでご参照ください。

データベースの作成

EC2からRDSにログインし、djangoアプリケーションで使用するデータベースを作成します。

今回はdjangodbというデータベース名にしました。

[ec2-user]$ mysql -h {RDSインスタンスのエンドポイント} -u {ユーザー名} -p   # MySQLにログイン
Enter password:

(中略)

MySQL [(none)]> create database djangodb;   # djangodbというデータベースを作成

ちゃんと作成できているかshow databasesクエリで確認しましょう。

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| djangodb           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

確認が完了したら、Crtl+Cかexitコマンドを入力してRDSからログアウトしてください。

MySQL [(none)]> exit
Bye
[ec2-user]$

Djangoアプリケーションのデプロイ

ファイルのコピー

ローカルのDjangoプロジェクトをEC2にコピーします。

githubなどを介してコピーする記事もよく見かけますが、今回はrsyncコマンドを使用してgithub経由よりも簡単にコピーするコマンドを紹介します(xx.xx.xx.xxはEC2のパブリックIPアドレス)。

$ rsync -rv -e 'ssh -i ~/.ssh/MyKeyPair.pem' djangoaws \
--exclude 'venv' \
--exclude 'db.sqlite3' \
ec2-user@xx.xx.xx.xx:

scpコマンドでもいいですが、不要なファイルを除いたコピーができるrsyncを採用しました

--excludeパラメータを指定することで、特定のファイルやフォルダを除いてコピーすることが可能です。

今回は仮想環境のvenvとsqliteのファイルが不要なので除いています。

EC2側できちんとコピーできているか確認しましょう。

[ec2-user]$ ls ./djangoaws/
app  djangoaws  manage.py  requirements.txt

仮想環境の設定とpythonパッケージのインストール

ローカル環境と同様にvenvで仮想環境を作ります。

[ec2-user]$ python3 -m venv venv

仮想環境をアクティベートしてpipをアップグレードし、requirements.txtに記載のパッケージをインストールします。

[ec2-user]$ . ./venv/bin/activate
(venv)[ec2-user]$ 
(venv)[ec2-user]$ python3 -m pip install --upgrade pip
(venv)[ec2-user]$ pip install -r requirements.txt

Djangoアプリケーションのデプロイ

EC2でのデプロイを有効化する

EC2でDjangoをデプロイするには、settings.pyのALLOWED_HOSTSにEC2のパブリックIPアドレスを追加する必要があります。

以下のように、IPアドレスをリストとして定義しましょう。

ALLOWED_HOSTS = ['xx.xx.xx.xx']    # xx.xx.xx.xxはEC2のパブリックIPアドレス

RDSをデータベースに設定する

DjangoのデータベースをRDSのMySQLにするために、settings.pyのDATABSEの値を以下のように書き換えてください。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # sqliteから変更
        'NAME': 'djangodb',     # プロジェクト用に作成したデータベース名
        'USER': 'user',    # RDSで作成したユーザー名
        'PASSWORD': 'xxxxxx',    # RDSで作成したユーザーのパスワード
        'HOST': 'RDSのDBエンドポイント',
        'PORT': '3306',
    }
}

djangoのデータベースの設定がきちんとできているか確認するためにpython3 manage.py dbshellでデータベースに接続してみます。

(venv)[ec2-user]$ python3 manage.py dbshell
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 369
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [djangodb]>

うまく接続できたら一度exitコマンドでデータベースから抜けて、migrateしておきましょう。

MySQL [djangodb]> exit
Bye
(venv)[ec2-user]$ python3 manage.py migrate

セキュリティグループを追加する

EC2のセキュリティグループに、8000ポートのアクセスの許可設定を追加します。

これで、Djangoのサーバーを8000ポートで起動したときに、ブラウザでアクセスできるようになります。

以下ではCLIを使ってセキュリティグループの編集をしていますが、コンソール画面から行ってもOKです。

$ aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxx \
--protocol tcp --port 8000 --cidr 0.0.0.0/0

サーバーを起動してブラウザでアクセス

以下のコマンドでDjangoの開発サーバーを立ち上げましょう。

(venv)[ec2-user]$ python3 manage.py runserver 0.0.0.0:8000

お好きなブラウザで「xx.xx.xx.xx:8000」(xx.xx.xx.xxはEC2のパブリックIP)にアクセスしてHello Worldが表示されれば成功です!

まとめ

今回はDjangoのバックエンドデータベースをRSDにし、EC2にデプロイする方法を紹介しました。

より実用的な構成としてはnginxとgunicornを使った構成ですね。

そのような構成に関しては、こちらのQiitaの記事が参考になるかと思います。

>>【丁寧解説】秒速でもDjango 3アプリをAWS EC2で公開【Nginx, gunicorn, postgresqlデプロイ】

もっと詳しくAWSを知るには

さらにAWSを詳しく知りたいという方は、スクールでAWSを学ぶのもおすすめです。

AWSをスクールで学習するのは、以下のメリットがあります。

  • 必要最低限のサービスを厳選して学習できる
  • ハンズオン形式で効率的に学習できる
  • AWS以外のエンジニアに必要なスキルも同時に学習できる

以下の記事では、AWSが学べるスクールを現役のエンジニア目線で4つに厳選してランキングしているので、ぜひ参考にしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!

コスパ最強のサブスク型プログラミング学習サイト!


侍テラコヤのロゴ

は、50種類以上の教材が利用し放題のプログラミング学習サイト

  • 単月プランは月額4,980円から始められる
  • チャットサポートとオンラインレッスンで挫折しにくい
  • HTML/CSS/JavaScript、Python、AWS、機械学習などの幅広い教材が利用し放題

教材の豊富さと料金の低さから、「現状コスパ最強のプログラミング学習サイト」です。

無料プランでも教材の一部を利用できるので、まずは無料プランに登録してどんな教材があるかチェックしてみてください!

コメント

コメントする

CAPTCHA


目次