[AWS]EC2,RDS,Django1から環境構築

##はじめに

今回初めてバックエンドを触ることになり、かなり手惑いました。
次回作成時この記事を見ればすぐに作成できるようにと思い作成しました。

```
$             <- 自分のPCターミナルでのコマンド
[ec2-user] $  <- EC2にログイン中でのコマンド
MySQL >       <- MySQLにログイン中でのコマンド
#             <- 私のコメント
>>>           <- 実行結果(出力値)
```






##[1] AWS環境設定

###[1.1] VPC作成

**作成手順**

- [1] VPCの作成
- [2] 名前タグを「VPCtest」
- [3] IPv4 CIDR ブロックを 「10.0.0.0/16」
- [4] タグキーを「Name」 値を「VPCtest」 とする

![スクリーンショット 2020-09-27 12.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/9102d2d2-86c4-be25-97c5-49d73cc1e577.png)
![スクリーンショット 2020-09-27 12.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/aa86afc7-e977-1527-0f72-5ce4ce891c40.png)





####[1.1.2]サブネット作成

**作成手順**

- サブネットの作成
- [1] パブリックtest作成
- [1.1] VPCには先ほど作成した 「VPCtest」 を入れる
- [1.2] アベイラビリティゾーンはとりあえず 「1a」 を選択
- [1.3] IPv4 CIDRブロックは「10.0.1.0/24」
- [2] プライベートtest作成
- [2.1] [1.1][1.2]と同じ
- [2.2] IPv4 CIDRブロックは「10.0.2.0/24」
- [3] プライベートtest2作成
- [3.1] [1.1]と同じ
- [3.2] アベイラビリティゾーンは「1c」を選択([2.1]と異なるアベイラビリティゾーンならOK)
- [3.3] IPv4 CIDRブロックは「10.0.200.0/24」

![スクリーンショット 2020-09-27 13.34.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/8f252ae1-42eb-d7d7-f99b-c5e30a074714.png)
![スクリーンショット 2020-09-27 13.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/c6b74cb0-9338-f1e2-85af-027004603f80.png)
![スクリーンショット 2020-09-27 17.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/105bb4b0-0b55-2f93-a3ca-aa827f19ed48.png)





####[1.1.3]ルートテーブル作成


**作成手順**

- [1] ルートテーブルの作成
- [2] 名前タグを 「ルートtest」
- [3] VPCには先ほど作成した 「VPCtest」 を入れる

![スクリーンショット 2020-09-27 13.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/54ab4db5-b575-feb9-6436-4321df89c39c.png)







####[1.1.4]インターネットゲートウェイ作成


**作成手順**

- [1] インターネットゲートウェイ作成
- [2] 名前タグを 「igw-test」 とする
- [3] タグキーを「Name」 値を「igw-test」 とする
- [4] VPCへアタッチする
- [5] VPCには先ほど作成した 「VPCtest」 を入れる

![スクリーンショット 2020-09-27 13.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/00f1fdba-ed4b-a696-dfab-475c12ebd1e0.png)
![スクリーンショット 2020-09-27 13.53.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/639fccc9-ae03-a073-4652-f10df8a81b9e.png)
![スクリーンショット 2020-09-27 13.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/bafe21b4-8d62-0af4-a3bc-cfff9088671f.png)




####[1.1.5]ルートテーブルに外部向けルートを追加

**作成手順**

- [1] ルートの編集
- [2] ルートの追加を押す
- [3] 送信先は 「0.0.0.0/0」 にする
- [4] ターゲットはInternet Gatewayから今回作成したインターネットゲートウェイを選択
- [5] ルートの保存

![スクリーンショット 2020-09-27 14.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/2905610a-02d8-2ff6-a229-313421795781.png)
![スクリーンショット 2020-09-27 14.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/a55a456b-b304-0d98-ea36-f52f584554fc.png)





####[1.1.6]サブネットにルートテーブルを紐付け


**作成手順**

- [1] パブリックtestのルートテーブルの関連付けの編集
- [2] ルートテーブルIDを今回作成した 「ルートtest」 に変更
- [3] 保存

![スクリーンショット 2020-09-27 14.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/7d31bf9a-504e-cab9-d32f-8ae791bf041d.png)
![スクリーンショット 2020-09-27 14.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/b2ea0e94-3519-a3cc-f192-092f586cef6a.png)






###[1.2]EC2インスタンス作成

**作成手順**

- [1] インスタンスを起動
- [2] Amazon Linux2 AMI(HVM),SSD Volume Type を選択
- [3] 無料利用枠のインスタンスタイプを選択後、次のステップ(詳細の設定)へ
- [4] ネットワークを 「VPCtest」 、サブネットを 「パブリックtest」、 自動割り当てIPを 「有効」 後、次のステップ(ストレージ追加)へ
- [5] 次のステップ(タグの追加)へ
- [6] 別のタグを追加し、タグキーを「Name」 値を「webサーバーtest」 とした後、次のステップ(セキュリティグループ)へ
- [7] 新しいセキュリティグループを作成し、名前を「webtest-sg」 とする
- [7] 新しいキーペアの作成から キーペア名 「test-key」としキーペアのダウンロードを行う 
- [8] インスタンスの作成

![スクリーンショット 2020-09-27 14.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/992bdb40-066c-293c-0fb6-a0a9473b5289.png)
![スクリーンショット 2020-09-27 14.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/0d7ac942-e0f5-6ace-5527-40a913dc93e4.png)
![スクリーンショット 2020-09-27 14.31.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/2a2603f4-6d4c-8088-e449-2b0c1088653a.png)
![スクリーンショット 2020-09-27 14.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/92394450-c1df-fd57-7e36-af318514e3b4.png)
![スクリーンショット 2020-09-27 14.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/a147ffa2-48b4-5045-5e54-f74a1a722ee3.png)
![スクリーンショット 2020-09-27 14.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/7f1477df-29eb-fbbd-f774-18e3c712e151.png)
![スクリーンショット 2020-09-27 14.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/5fd5661f-1c85-6c95-f0b8-b808dfc252ab.png)
![スクリーンショット 2020-09-27 14.42.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/b237d3f5-6fa8-f0f4-1c02-b4c99f9f0e3d.png)

EC2が起動できたか確認してみましょう
以下のコマンドを打ち込んでください

```
$ cd

$ cd (test-key.pemまでのPATH)
#意味がわからなければ $ cd Downloads でOKです

$ chmod 400 test-key.pem

$ ssh -i test-key.pem ec2-user@xxx.xxx.xxx.xxx
#xxxにはEC2のパブリックIPv4アドレスが入る

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

#上記のEC2の文字が表示されれば起動完了です

[ec2-user] $ exit
#終了
```

これでEC2を起動することができました。






###[1.3]RDSの作成

**作成手順**

- [1] データベースの作成
- [2] エンジンのタイプ    :MySQL
- [3] テンプレート       :無料利用枠
- [4] DBインスタンス識別子:database-test
- [5] マスターユーザー名  :お好きな名前
- [6] マスターパスワード   :お好きなパスワード
- [7] 接続VPC : VPCtest
- [8] 追加の接続設定タップ
- [9] VPCセキュリティグループ　:新規作成
- [10] VPCセキュリティグループ名　:dbtest-SG
- [11] データベースの作成

![スクリーンショット 2020-09-27 17.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/a05f3985-9e57-9056-698d-7de721cba465.png)






####[1.3.2]セキュリティグループ編集
セキュリティグループについてまだ学習量が少なくセキュリティがガバガバな設定かもしれません。
**テスト環境のみ**で使用してみてください。

**作成手順**

- [1] セキュリティグループから「webtest-sg」のインバウンドルールを編集
- [2] ルールを2つ追加する
- [3] 1つはタイプ 「HTTP」、ソース 「0.0.0.0/0」 とする
- [4] もう1つはタイプ 「MYSQL/Aurora」、ソース 「0.0.0.0/0」 とし、ルールを保存
- [5] 「dbtest-SG」のインバウンドルールを編集
- [6] タイプ 「MYSQL/Aurora」、ソース 「0.0.0.0/0」 とし、ルールを保存

 追記：**[6]のソース「0.0.0.0/0」 はEC2のプライベートIPアドレスを指定するのが望ましい(セキュリティが堅い)が、もう少し理解した後に設定するのがいいでしょう。(いろいろ設定すると動かなくなった時に困惑すると思います。)**

(sgを小文字に統一するの忘れてた)

![スクリーンショット 2020-09-27 20.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/04c08207-6f42-4796-39b8-3707515b8067.png)
![スクリーンショット 2020-09-27 20.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/1a4b2fcb-dd1b-f03c-e0f9-35a77eb4b0aa.png)
![スクリーンショット 2020-09-27 20.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/5cbc780c-0381-65fa-bd89-f54e556ebc75.png)
![スクリーンショット 2020-09-27 20.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/8aea1008-ac66-d101-41c5-76f776567ca8.png)


RDSが起動できたか確認してみましょう
以下のコマンドを打ち込んでください


```
$ cd

$ cd (test-key.pemまでのPATH)

$ ssh -i test-key.pem ec2-user@xxx.xxx.xxx.xxx

[ec2-user] $ sudo yum install mysql -y

[ec2-user] $ mysql -h DBエンドポイント -u DBマスターユーザー名 -p
# パスワードを要求されるので入力(文字は表示されないが打ち込めています)（コピペ可）

>>> Welcome to the MariaDB monitor.
# が表示されればRDSのMySQLに接続ができた

#データベース内一覧を表示(小文字でも可 show database;)
MySQL > SHOW databases;

#「dbtest」という名前のデータベースを作成
MySQL > CREATE DATABASE dbtest;

#終了
MySQL > exit
```

これでRDSの設定は完了です。






##[2]Django環境構築

###[2.1]Python3をインストールするための準備

```
#yumをアップデート
[ec2-user] $ sudo yum update -y

#yumでgitをインストールします
[ec2-user] $ sudo yum install git -y

#次にgithubのリポジトリからpyenvをクローンしてきます
[ec2-user] $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

#パスを通してコマンドが打てるようにします
[ec2-user] $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
[ec2-user] $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
[ec2-user] $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
[ec2-user] $ source ~/.bash_profile

#######まとめてコピペできます
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
#################

#pyenvが入ったか確認
[ec2-user] $ pyenv -v
>>> pyenv 1.2.20-7-gdd62b0d1
```

####[2.1.2]Python3のインストール
現在入っているPythonのバージョンの確認
Python 2系 は2020年1月1日にサービスを終了した
[Python2系について詳しくはこの記事から](https://www.atmarkit.co.jp/ait/articles/1906/27/news016.html)

```
#Pythonのバージョンを確認
[ec2-user] $ python --version
>>> Python 2.7.18

#Python3に移行する

#必要な依存関係のインストール
[ec2-user] $ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel libffi-devel -y
>>>(略) 完了しました!

#現在ダウンロードできるPythonのバージョンを確認
[ec2-user] $ pyenv install -l
>>>(略) 
    3.8.5　
    3.8.6
   (略)


#現時点(R2,9/26)での最新版3.8.6をインストール
[ec2-user] $ pyenv install 3.8.6
>>> Downloading Python-3.8.6.tar.xz...
    -> https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tar.xz
    Installing Python-3.8.6...
#少し時間がかかります
    Installed Python-3.8.6 to /home/ec2-user/.pyenv/versions/3.8.6


#Pythonのバージョン2系から3系へ切り替え
[ec2-user] $ pyenv global 3.8.6
[ec2-user] $ pyenv rehash

[ec2-user] $ python --version
>>> Python 3.8.6

#後に必要になってくるパッケージ
[ec2-user] $ pip install --upgrade pip
[ec2-user] $ sudo yum install python-devel mysql-devel -y
[ec2-user] $ pip install mysqlclient

#以上でPython3への移行が完了した
```






###[2.2]Djangoの環境構築
pipはEC2(Linux2)に元から入っている

```
#pipバージョンの確認
[ec2-user] $ pip -V
>>> pip 20.2.1 from /home/ec2-user/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip (python 3.8)

#Djangoをインストール
[ec2-user] $ pip install django

#もし以下のエラーが出たら内容にしたがってシングルクォーテーション（'xxxx'）内をコピペして再度Djangoをインストールしてください
>>> WARNING: You are using pip version 20.2.1; however, version 20.2.3 is available.
You should consider upgrading via the 'xxxx' command.

#Djangoのバージョン確認
[ec2-user] $ python -m django --version

#「testDjango」という名前のプロジェクトを作る
[ec2-user] $ django-admin startproject testDjango

#確認すると生成されているはずである
[ec2-user] $ ls

>>> testDjango/
        manage.py
        testDjango/
            __init__.py
            settings.py
            urls.py
            asgi.py
            wsgi.py
```

- トップのmysite・・・ルートディレクトリで任意の名前で作成できる。変更も可。
- manage.py・・・Djangoプロジェクトの様々な操作を行うためのコマンドラインユーティリティ。
- mysite・・・このプロジェクトのパッケージ。
- mysite/init.py・・・このディレクトリがpythonであることの空ファイル。
- mysite/settings.py・・・プロジェクトの設定ファイル。
- mysite/urls.py・・・URLを宣言。
- mysite/asgi.py・・・プロジェクトを提供するASGI互換WEBサーバーのエントリポイント。
- mysite/wsgi.py・・・プロジェクトをサーブするためのWSGI互換WEBサーバーのエントリポイント。






###[2.3]FileZillaをダウンロードする

testDjangoのコードを編集するためにSSHで直接vimを使って編集もできるが今回はFailZilaを使ってみようと思う
[超初心者向け！FileZilla（ファイルジラ）の使い方](https://techacademy.jp/magazine/2447)

[Win版FileZilaダウンロード](https://filezilla-project.org/download.php?type=server)
[Mac版FileZilaダウンロード](https://filezilla-project.org/download.php?type=client)

インストールして開き,左上のサーバーボタンを押すと以下の画面が現れる

**設定手順**

- [1] プロトコルは 「SFTP」 を選択 (FTPでは通信を暗号化していないため)
- [2] ホストは 「EC2のオープンIPアドレス」 を入力       
- [3] ログオンタイプは 「鍵ファイル」 
- [4] ユーザー 「EC2にログインする時の名前」 
- [5] 鍵ファイル 「EC2にログインする時の鍵のPATH」  
- [6] ポート は空白でOK  
- [7] 接続

![スクリーンショット 2020-09-26 13.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/5f1c6e19-6e53-81e2-e2c9-20ee4b03c8fb.png)
![スクリーンショット 2020-09-26 13.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/1ffa3d56-70b9-3582-e7c4-61943ee32008.png)

設定が完了したのち、上記の画面が現れる
**左はローカルサイト(自分のPC内)**
**右はリモートサイト(EC2内)**
ここでファイルの受け渡しや書き換えなどが行える。
とりあえず作ったtestDjangoをローカルサイトに複製をしておく

編集したいファイルを右クリック後、表示編集で編集が行える
次の[2.4]でPyCharmで編集できるようにする






###[2.4]PyCharmをダウンロードする

[最強のPython統合開発環境PyCharm](https://qiita.com/yamionp/items/f88d50da8d6b548fc44c)

PyCharmを関連つけるには

- [1] Finderから.pyのファイルを右クリック
- [2] このアプリケーションで開くをPyCharmに設定
- [3] すべてを変更

![スクリーンショット 2020-09-26 13.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/22f5b9c2-7d22-9cd6-5e21-3deb10b6f999.png)






###[2.5]Django設定

```
[ec2-user] $ cd
[ec2-user] $ cd testDjango
[ec2-user] $ python manage.py startapp polls
```

```settings.py
...
(略)
...

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbtest',
        'USER': 'DBマスターユーザー',
        'PASSWORD': 'DBマスターユーザーパスワード',
        'HOST': 'DBエンドポイント',
        'PORT': '3306',
    }
}

...
(略)
...

#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'
```

[1.3.2]に'NAME': 'dbtest'の作成が書いています。

FileZillaでアップロード


```
[ec2-user] $ cd
[ec2-user] $ cd testDjango
[ec2-user] $ python manage.py migrate
#ここでエラーが起きた場合考えられる原因は以下に記します。

[ec2-user] $ python manage.py dbshell
```

**エラー原因**

- FileZillaを開いてアップロードしたか
- 打ち込み忘れているコマンドはないか
- errorのまま放置したダウンロード失敗のコマンドはないか
- python --version で 3以上になっているか
- [2.1.2]のコマンド打つ順番を守ったか
- setting.pyでNAMEはMySQLで作成したDB名か(**DB識別子ではない**)
- sqlite3のバージョンが足りない的なエラーはRDSのMySQLを使うことで解決した

 **その他**
[pipenvのinstall時に、No module named '_ctypes'が発生する](https://qiita.com/mynkit/items/f8a1a90b99efef4a08a3)
[CentOS7.2 + MySQL5.6 + Python3 - pip install mysqlclient で mysql_config not found が出る](https://qiita.com/narupo/items/6892a3a076e86a6a3983)

もう無理だと感じた方は1からインスタンスを作り直すか、
EC2インスタンスを選択した状態でアクションを押し、同様のものを起動で
同じ設定のインスタンスが生成されます。


以上でEC2,RDS,Djangoの設定が完了しました。






##おわりに
今回名前のつけ方が下手すぎました。
たとえば、ブログの名前がxblogなら
xblog-vpc
xblog-public-subnet
xblog-ec2
xblog-rtb
xblog-ec2-sg
xblog-db-sg
などにした方がわかりやすいかと思います。

この記事で誰かの役に立っていただければ幸いです。

次回これにAPIを実装してみようと思います。




##参考サイト
以下と本記事の途中に非常に参考にさせていただいたサイトを紹介しています。
ありがとうございました。

[1]  [EC2サーバにPython3環境構築](https://qiita.com/tisk_jdb/items/01bd6ef9209acc3a275f)
[2]  [djangoを用いてWEBアプリケーション開発　～開発その１～](https://qiita.com/sunachi/items/297a6ac5546aab6aa1d4)
[3] [AWS EC2 + RDS 環境で Django, syncdbするところまで](http://junseis.hatenablog.com/entry/2014/07/11/010158)
[4] [EC2上のDjangoからAmazon RDSに接続する](https://qiita.com/ARATAYOKOYAMA/items/335c30f3a3f54698eb30)
[5] [AWSのEC2(+RDS(+S3))でDjangoアプリケーション(+MySQL)を公開するまで](https://qiita.com/momomo_rimoto/items/cf9df8acddc377333b0c)
[6] [（Djangoメモ）データベースにMySQLを設定](https://qiita.com/juniskw/items/2eaa3212ea4ed6ef6915)
[7] [MySQLでデータベースを作成しよう](https://prog-8.com/docs/mysql-database-setup)
[8] [Django2.2で開発サーバー起動時にSQLite3のエラーが出た場合の対応](https://qiita.com/rururu_kenken/items/8202b30b50e3bfa75821)
[9] [Vim初心者に捧ぐ実践的入門](https://qiita.com/okamos/items/c97970ab34ff55ff3167)
[10] [AWSのルートテーブルって何よ？VPCとサブネット踏まえて簡単に説明してみる](https://qiita.com/chro96/items/21863e0960ba4ac72470#:~:text=%E6%9C%AC%E9%A1%8C%E3%81%AEAWS%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%88%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A8%E3%81%AF%EF%BC%9F&text=%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E5%86%85%E3%81%AB%E3%81%82%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9,%E9%80%81%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E9%80%9A%E4%BF%A1%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82)