【AWS EC2】Djangoで作成したアプリをAWS上にデプロイしてみた

IT、仕事

今回の記事では、Djangoで作成したWebアプリをAWS EC2にデプロイしたので
使用した環境やWebサーバー、手順を備忘録を兼ねて紹介していきます。

使用した環境,ツールなど

搭載OS Ubuntsu
python・・使用言語
nginx・・・Webサーバー
Guniron・・pythonで使われるAPサーバ

AWS EC2のインスタンスを作成

まずは EC2のインスタンスを作成します。
AWSのコンソールにサインインし、サービス > EC2 > インスタンス
インスタンスの管理画面を開きます。

そのあと、「インスタンスの作成」でAMIにUbuntuを選択。
他の設定はデフォルトのままで作成。

作成時にインスタンスに接続するためのキーを取得します。
「新規にキーを作成する」を選択し、ダウンロードします。
再発行はできないので、置き場所は忘れないように!

ダウンロード後はローカルの分かりやすいところに保管する。

SSH接続

今回使ったのはMacなので、Windowsの場合はTeratermを使うなどしてSSH接続を実施

事前に EC2のコンソール上でインスタンスが「running」となって起動していることを確認

1キーをダウンロードしたディレクトリに移動してパーミッションを変更

$ ls #カレントディレクトリにkeyがあることを確認
aws-ubuntu.pem

$ chmod 400 aws-ubuntu.pem #「所有者のみに読み取り権限付与」というパーミッションに切り替える

chmodコマンドは400でも600でも可

2キーを使ってインスタンスに接続

$ ls #カレントディレクトリにkeyがあることを確認
aws-django.pem

$ ssh -i "aws-django.pem" ubuntu@ec2-13-131-159-214.ap-northeast-1.compute.amazonaws.com #例です

sshコマンドの意味は、aws-django.pemというキーを使って
DNSのec2-13-131-159-214.ap-northeast-1.compute.amazonaws.com
ubuntsuというユーザーでサインインするという意味です。

赤マーカーのところは自分が設定した内容によって変化します。

コマンドを実行すると、
Are you sure you want to continue connecting (yes/no)?と聞かれるので
「yes」と入力

必要なツールをインストール

EC2を起動したらpythonなど必要なツールのインストールを行います。

1Ubuntuで使用される「apt-get」パッケージを使ってpython,nginxをインストール

$ sudo apt-get update #サーバーからパッケージ・リストを入手する
.....

$ sudo apt-get install python3-pip python3-dev nginx #数分かかるかもしれません
......

パッケージのインストール時に、Do you want to continue? [Y/n]と聞かれるので
「Y」と入力

2インストールが正しくできているかを確認

バージョンが表示されたら正常にインストールされています。

$ python3 --version
   Python 3.8.10

  $ nginx -v
   nginx version: nginx/1.18.0 (Ubuntu)

3virtualenvをインストール

以下のコマンドを実行

sudo -H pip3 install --upgrade pip
  Successfully~と出たらOK

sudo -H pip3 install virtualenv
  Successfully~と出たらOK

仮想環境の作成、Djangoのインストール

1仮想環境の作成

  $ virtualenv python3 #python3は例です。好きな名前を指定できます。

2アクティベートの実行

$ source python3/bin/activate 

<仮想環境名>/bin にactivateというファイルが生成されるので、
`source`で読み込んで仮想環境をアクティベート

3仮想環境上にDjangoをインストール

(python3) $ pip install django gunicorn Pillow
  Successfully~と出たらOK

Webアプリのクローン

1 gitから作成したWebアプリをクローンする

(python3) $ pwd #カレントディレクトリが/home/<user>であることを確認

(python3) $ git clone https://github.com/<GitHub_Username>/<PJ_NAME>.git #GitHubの例 <>内はご自身のものを入力し

settings.pyの設定

クローンしたアプリケーションに移動してsetting.pyを編集

(python3) $ cd <PJ_NAME>/<PJ_NAME>
(python3) $ vim settings.py

settings.pyを開いたら、 EC2インスタンスのパブリックIPを設定。
パブリックIPはコンソールで対象インスタンスを選択したら画面下あたりに表示されている。


......

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '**************************************************' #ここは環境変数を設定して外部ファイルから読み込むようにするべきなのですが、ここでは割愛します。

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['12.210.159.124'] #変えるところ1: ここにEC2インスタンスのパブリックIPを入力。環境によって変わります。



# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = '<PJ_NAME>.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templetes'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = '<PJ_NAME>.wsgi.application'

......

ここではパブリックIPからの接続許可を設定しています。
今回は使っていないですが、データベース接続するときもここに設定を書き込みます。

AWSのセキュリティグループ設定

1 EC2のコンソールからセキュリティグループ作成

SSHは自分のアドレスでインスタンスに接続するために許可が必要となっています。
HTTPの設定でパブリックIPにアクセスできる様にしています。

2作成したセキュリティグループを EC2に適用

3サーバーを起動

(python3) $ python3 manage.py runserver 0.0.0.0:8000

Gunicorn設定

1virtualenvから抜ける

(python3) $ deactivate

2Gunicornのserviceファイル作成

$ sudo vim /etc/systemd/system/gunicorn.service

3 Gunicorn serviceの自動起動を設定

$ sudo vim /etc/systemd/system/gunicorn.service

nginxの設定

1 nginxの設定ファイルを作成

$ sudo vim /etc/nginx/sites-available/<PJ_NAME>

2 シンボリックリンクを貼る

$ sudo ln -s /etc/nginx/sites-available/<PJ_NAME> /etc/nginx/sites-enabled/

3 nginxをリスタート

$ sudo systemctl restart nginx

4 8000番ポートを閉じる

$ sudo ufw delete allow 8000

5 設定を反映

$ sudo ufw allow 'Nginx Full'

Gunicornのリスタート

設定が完了したので、APサーバのリスタートを行います。

$ sudo systemctl restart gunicorn

EC2のパブリックIPにアクセス

ここまできたらブラウザ上にパブリックIPを入力することで
インターネット上に自作アプリが公開される様になります。

一応IPアドレスは伏せさせてもらいますが、これでWebアプリの公開が完了しました!

手こずったこと

今回、初めて使ったツールばかりでデプロイ完了まで時間がかかりました。
特にGitには大苦戦しました。(AWSあんま関係ない・・・)

他にもGunicornの設定で502エラーを吐くこともありました。

これは設定ファイルのパスを間違えたことが原因でした。

エラーを起こしたところは改めてまとめてみようと思います。

最後に

今までAWSを含めたクラウドを自分で触ったことがないので、
エラーも多く出しましたが勉強になりました。

まだまだ分からないことだらけですが、これからもAWSの学習を
続けていこうと思います。


コメント

タイトルとURLをコピーしました