【Django】Amazon Linux 2+MySQLでDjangoをデプロイする方法

AWSにMySQLでDjangoをデプロイする時に結構苦戦したので、備忘録として残しておきます。
<h2>AWSの設定</h2>

yumを最新にアップデート

~~~
$ sudo yum update
~~~

Pythonの最新版をインストール

~~~
$ sudo yum -y install python37
~~~
gitをインストール

~~~
$ sudo yum -y install git
~~~

Gitに上げているDjangoのプロジェクトを持ってくる

~~~
$ git clone https://github.com/example/hogeproject.git
~~~

プロジェクトに入っている仮想環境の実行

~~~
$ cd hogeproject/
$ source venv/bin/activate
~~~
仮想環境に`django`をインストール

~~~
$ sudo pip3 install django
~~~
`settings.py`にデータベース情報を追加

~~~
$ vim taxproject/settings.py
~~~

~~~python
ALLOWED_HOSTS = ['EC2のパブリックアドレス', 'localhost']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '〈データベース名〉',
        'USER': '〈ユーザー名〉',
        'PASSWORD': '〈パスワード〉',
        'HOST': '〈エンドポイント〉',
        'PORT': '3306',
    }
}
~~~

データベースにテーブルを作成するためにmigrateを行う
※ここが一番苦戦しました。


~~~
$ python3 manage.py makemigrations
~~~

下記のエラーが発生してしまった。

~~~
Traceback (most recent call last):
  File "/usr/local/lib64/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
ModuleNotFoundError: No module named 'MySQLdb'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
・
・
・
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
~~~

`mysqlclient`をインストールしているか聞かれたので、とりあえずインストールしてみる。


~~~
$ sudo pip3 install mysqlclient
~~~
すると今度はmysql_configがないとエラーになってしまう。
何故だ・・・

~~~
    /bin/sh: mysql_config: command not found
    /bin/sh: mariadb_config: command not found
    /bin/sh: mysql_config: command not found
~~~

調べてみると下記をインストールすると解決するらしい
インストール開始

~~~
#リポジトリ追加
$ sudo yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

$ sudo yum -y install mysql-community-client
$ sudo yum -y install mysql-devel
~~~
mysql_configがインストールされたか確認

~~~
$ whereis mysql_config
mysql_config: /usr/bin/mysql_config /usr/share/man/man1/mysql_config.1.gz
~~~

どうやらインストールされたみたいなので、これで大丈夫だと思い、再度`$ sudo pip3 install mysqlclient`を実行

~~~
    unable to execute 'gcc': No such file or directory
    error: command 'gcc' failed with exit status 1
~~~
今度は`gcc`がないと怒られる。
`gcc`をインストール

~~~
$ sudo yum -y install gcc
~~~

今度こそと思い、`$ pip3 install mysqlclient`を実行。
すると・・・

~~~
#include "Python.h"
              ^~~~~~~~~~
    compilation terminated.
    error: command 'gcc' failed with exit status 1
~~~

またエラーになる。
`Python.h`が原因らしいので調べてみると`python-devel`に入っているモジュールとのこと。
なので、今度は`python-devel`をインストールする。

~~~
$ sudo yum -y install python-devel

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
37 packages excluded due to repository priority protections
Package python-devel-2.7.18-1.amzn2.0.2.x86_64 already installed and latest version
Nothing to do
~~~

あれ？
すでにインストールされている・・・
と思ったらPython2.7だったので、Python3の`python-devel`をインストール

~~~
$ sudo yum -y install python3-devel
~~~

インストールが完了したので、何度目かの`$ sudo pip3 install mysqlclient`を実行

~~~
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-2.0.2
~~~
やっと成功した！！！

これで大丈夫なはずなので、データベースにテーブルを作成していきます。

~~~
$ python3 manage.py makemigrations

$ python3 manage.py migrate
~~~

データベースに値が入ったので、EC2のセキュリティグループにポートを追加
![cats.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900677/8584dac6-d1a0-073c-497d-e3e488b7957b.jpeg)

サーバーを起動して、EC2のパブリックIPにアクセス

~~~
$ python3 manage.py runserver 0.0.0.0:8000
~~~

![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900677/8691c9ae-e325-9cac-6199-4465aebfb889.jpeg)

表示できるようになりました。

調べるのにめちゃくちゃ時間がかかった・・・
ひとまずこれでデプロイはできた。

あとはgunicornを入れて常時アクセスできるようにすればOK