AWSにdjangoでWebアプリを立ち上げて転職

こんにちはmogkenです。

前回Python+Django+AWSでスクレイピングアプリを作って転職という記事を書いてから3ヶ月余りが経ちました。タイトルの通り幸いにも転職が成功して1月からクラウド基盤を開発している会社にサービス企画で転職しました*\(^o^)/*

というわけで今回はその時に作ったPythonのwebアプリをAWSに構築した際の手順を簡単に記録します。ただ申し訳ないのですが随分と前のことなので、やや記憶が曖昧で内容が正しいか保証できません...素人の備忘録だと思ってください。

## 今回のやること

AWSのVM(Centos7)にpython3とDjango、nginx、そしてgunicornをインストールして、作成したWebアプリをデプロイします。ロードバランサーやオートスケーリングもやろうと思っていたのですが、転職ができてしまったので一番簡単な構成で力尽きました...

構成図(最小構成すぎるのでいらないけれど一応)
<img width="438" alt="スクリーンショット 2020-02-12 17.54.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521142/d0c0636b-16fd-a901-1999-b650e58c7aba.png">


## AWSの設定

この構成でAWSで設定すべき項目は大雑把に書くと以下の通り

1. ネットワークの作成
2. VMの作成
3. DNSの設定

なお詳しい手順はここでは記載しない。だって素人のしかもうろ覚えの手順なんてとても怖くて参考にできないでしょう。

参考URL：[https://qiita.com/okoppe8/items/dc1de147a36797442e4c](https://qiita.com/okoppe8/items/dc1de147a36797442e4c)

### 1.ネットワークの作成

AWSではまずVMを立ち上げるためのVPCを作成する必要がある。

流れは次の通り

1. VPCの作成
2. サブネットの作成
3. インターネットゲートウェイの作成
4. ルートテーブルの作成
5. セキュリティグループの作成

### 2.VMの作成

アプリケーションを構築するためのVMを作成する。でもやることはただEC2をボタンをポチポチして作成するだけ。

### 3.DNSの設定

公開するためのドメインの設定をAWSのDNSサービスであるRoute53を使って行う。

自分はこのサイトを参考に行った。

[https://avinton.com/academy/route53-dns-vhost/](https://avinton.com/academy/route53-dns-vhost/)

## Linuxサーバの設定

AWSでVMの作成が終わったら次は立ち上げたVMの設定を行う。

ここからは少し詳しく解説する。(何回も失敗して繰り返したから割と記憶が鮮明なのだ...)

あとはここからの設定は基本的には

[https://narito.ninja/blog/detail/21/#_3](https://narito.ninja/blog/detail/21/#_3)

このページを参考にしている。このブログはDjango周りのとてもわかりやすい記事がたくさんあるので、とてもオススメ。

手順としては次の通り

1. 立ち上げたVMにSSH or Webコンソールでログイン
2. python3のインストール
3. djangoのインストールと設定
4. nginxのインストールと設定
5. gunicornのインストール
6. サービスの立ち上げ

### 1. 立ち上げたVMにSSH or Webコンソールでログイン

EC2の作成時に同時にsshでアクセスするための認証鍵も作成されるから、それをダウンロードして使用する。何を言っているのかわからない人はAWSのコンソール画面からもWeb上でVMにアクセスできるのでそちらでやってみると良いかもしれない。

ダウンロードした認証鍵はそのまま使おうとすると、認証鍵の権限がオープンすぎると怒られるため次のコマンドでファイル権限を設定する必要がある。

    chmod 400 "ダウンロードした認証鍵ファイル名"

あとは以下のコマンドでsshアクセスができる。

    ssh -i "＊＊＊.pem" ec2-user@"EC2のパブリックDNS名 or パブリックIP"

### 2. python3のインストール

参考URL：[https://qiita.com/s_runoa/items/156f3fa67c82e9cd9f42](https://qiita.com/s_runoa/items/156f3fa67c82e9cd9f42)

ここからは必要なパッケージをインストールしていく。まずはpython。pyenvを使っているけれど未だにpyenvが何か正確には分かっていない...

    #yumパッケージのアップデート
    yum update -y
    
    #必要パッケージのインストール
    sudo yum install git gcc zlib-devel libffi-devel bzip2-devel readline-devel openssl-devel sqlite-devel
    
    #pyenvのインストール
    git clone https://github.com/yyuu/pyenv.git ~/.pyenv
    
    #.bash_profileに追記
    export PYENV_ROOT="$HOME/.pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
    
    **ここでサーバを再起動**
    
    #Pyhtonのインストール
    pyenv install --list
    CFLAGS="-fPIC" pyenv install 3.7.2
    
    #pythonの設定
    pyenv versions
    pyenv global 3.7.2
    pyenv rehash
    
    #インストールの確認
    python --version

### 3.djangoのインストール

pythonがインストールできたらdjangoをインストールする。ちなみに自分にとっての初フレームワークがdjangoなので、djangoにはなんだかとても特別な気持ちを抱いている。

    #djangoのインストール
    pip install Django

以上でdjangoのインストールは終了なのだが、あとでsqlliteのバージョンが古いと怒られることになるのでここでその対策もしてしまうと良いと思う。

怒られないこともあるから、めんどくさい人は飛ばしてしまって本当に怒られてからやってもよい。

**Sqlliteのアップグレード**

参考URL：[https://qiita.com/rururu_kenken/items/8202b30b50e3bfa75821](https://qiita.com/rururu_kenken/items/8202b30b50e3bfa75821)

    #tarファイルの取得
    wget https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
    
    #tarの解凍
    tar xvfz sqlite-autoconf-3280000.tar.gz
    
    #ビルドしてインストール
    cd sqlite-autoconf-3280000
    $ ./configure --prefix=/usr/local
    $ make
    $ sudo make install
    $ sudo find /usr/ -name sqlite3
    
    
    $ sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
    $ sudo ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
    
    # 共有ライブラリへパスを通す
    $ export LD_LIBRARY_PATH="/usr/local/lib"

**setting ファイルの編集**

Djangoを正常に立ち上げるための最低限の設定をここで行う。

    #djangoプロジェクトの作成
    django-admin startproject "プロジェクト名"
    
    #djangoアプリの作成
    python manage.py startapp "アプリ名"
    
    #設定ファイルの編集 djangoの設定ファイルはプロジェクト名と同じ名前のフォルダに作られる
    vi /"プロジェクト名"/"プロジェクト名"/setting.py
    
    #以下setting.pyの中の編集項目
    #installed_appの末尾に追加
    "アプリ名".apps."アプリ名(頭文字を大文字にする)"Config
    例)'myapp.apps.MyappConfig'
    
    #デバッグの非表示とhostの指定
    DEBUG = False
    ALLOWED_HOSTS = ["設定したドメイン名"]
    
    #言語とタイムゾーンの設定
    LANGUAGE_CODE = 'ja'
    TIME_ZONE = 'Asia/Tokyo'
    
    #静的ファイルの置き場の設定
    STATIC_URL = '/static/'  # これは元からあります。
    STATIC_ROOT = '/usr/share/nginx/html/static'
    MEDIA_URL = '/media/'
    MEDIA_ROOT = '/usr/share/nginx/html/media'
    
    #保存してsetting.pyの編集終了
    
    #最後にこのコマンドを打って終了
    sudo python manage.py collectstatic

### 4.nginxのインストールと設定

WebサーバにはNginxを使う。初めてこれに出会った時にどうやって読むのか皆目分からなかった。

nginxのインストール

    #nginxのインストール
    sudo amazon-linux-extras install nginx1.12

nginxの設定

    #設定ファイルのの編集
    sudo vim /etc/nginx/conf.d/project.conf
    
    #以下設定項目
    server {
        listen  80;
        server_name "サーバのパブリックIPアドレス";
    
        location /static {
            alias /usr/share/nginx/html/static;
        }
    
        location /media {
            alias /usr/share/nginx/html/media;
        }
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    #保存して終了
    
    #設定ファイルチェック
    sudo nginx -t
    
    #nginxの起動
    sudo systemctl reload nginx
    
    #サーバ起動時に同時にnginxも起動するための設定
    sudo systemctl enable nginx
    

### 5.gunicornのインストール

最後にwsgiとしてgunicornをインストールする。wsgiもgunicornも名前からしてなんだか良く分からない...

    sudo pip3.7 install gunicorn

これだけで終了。なんとも簡単。

### サービスの立ち上げ

最後にサービスを立ち上げる

    #manage.pyのファイルが置かれているプロジェクトフォルダに移動
    cd /project
    
    #gunicornの起動
    sudo gunicorn --bind 127.0.0.1:8000 project.wsgi:application

ここまでやったらドメイン名でdjangoのプロジェクトのアクセスできるようになっている。

最後にgunicornを止めたい場合の設定をのせておく

    #gunicornのプロセス番号の確認
    lsof -i:8000
    
    #表示されたプロセスをkill
    kill -9 "表示されたプロセス番号"

## おつかれさまでした。

色々なエラーと闘って最後にページが立ち上がった瞬間はとても嬉しかった。
なんだか少し大人になったような気がした。