DjangoをEC2にデプロイしてわかった事

# はじめに
今までクラウドプラットフォームはHerokuを使っていたのですがEC2に移行する機会があったので移行作業中に躓いたところの解決策と、EC2にwebアプリをデプロイする上での注意点等についてまとめました。

今回は以下のディレクトリ構造を想定しています

```
root
├── etc
│   └── systemd
│       └── system
│           └── sampled.service
└── home
    └── ubuntu
        └── sample
            └── sample.py
```
また1分おきに"OK"を出力するPythonプログラムです

```:sample.py
#!/usr/bin/env python3
import syslog
from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job("interval", minutes=1)
def sample():
    syslog.syslog("OK")

sched.start()
```
# 余談: AWSアカウントがすぐに作れなかった
自分の場合は電話認証でエラーが出て先に進めなかった為サポートケースを作って対応してもらいました。

結局コールセンターから電話で手動手続きになってアカウントが使用可能になるまで1週間近くかかったのでエラーが出たら直ぐにサポートケースを作って対応してもらいましょう!

# EC2インスタンス作るときの注意点
まずEC2インスタンスを作るときの注意点について書いていきます。

EC2インスタンスを作る時、使用するAMIを選択するのですが基本的にはAmazon Linux系を選ぶのがベターですがこれによって後に紹介するデーモンプロセスの作り方が変わってきます。

なので何かしらのサイトを参照しながらデプロイする際はまずどのAMIを使用しているか確認した上で作業を進めましょう!

# デーモン化行う際の注意点
次にプログラムのデーモン化で注意すべき点です。

先ほど書いたように使用するAMIによって作り方が変わる部分になります。

今回はUbuntu20.04を使用したためプログラムをデーモン化するためのサービス設定ファイルは以下の場所になっていました。

```
使用するAMIによって異なる
Ubuntu: /etc/systemd/system/sampled.service
```

# デーモンの環境変数
次にデーモンで環境変数を扱う際の注意点です。

デーモンの環境変数設定が作業を進める際1番躓いた点です。

基本的にターミナルからプログラムを動作させる分には以下のコマンドを打ち込めば問題ないです。

```
$ SAMPLE=123456789
$ export SAMPLE
$ echo $SAMPLE
>>> 123456789
```
また環境変数を永続化させたい場合は

```
sudo vi /etc/profile
```
で設定したい環境変数を以下のように列挙していけば次回起動時から適用されます。

```:/etc/profile
SAMPLE=123456789
export SAMPLE
```
しかし!!

デーモンではこれらの環境変数は読み込まれません <<< ここ重要!!

なのでデーモン専用の環境変数設定を以下のように作りましょう

```:/etc/sysconfig/sampled_env
SAMPLE=123456789
```

また指定した環境変数をデーモンで読み込ませるためにサービス設定に追記します。

```:/etc/systemd/system/sampled.service
'''
省略
'''
[Service]
#追記
EnvironmentFile=/etc/sysconfig/sampled_env
'''
省略
'''
```
その後以下のコマンドを打ち込みサービス設定の再読み込みとデーモンの再起動を行います。

```
$ sudo systemctl daemon-reload
$ sudo systemctl restart sampled
```

その後以下のコマンドを打ち込みActiveの項目がactive (running)になっていたら成功です。 

```
$ sudo systemctl status sampled 
>>> sampled.service - sampled daemon
>>>   Loaded: loaded (/lib/systemd/system/sampled.service; enabled; vendor preset: enabled)
>>>   Active: active (running)
>>> '''
>>> 省略
>>> '''
```
またプログラムのログを確認したい場合は以下のコマンドで確認できます!

```
$ sudo journalctl -u sampled
>>> Jul 29 17:50:24 ip-省略 sampled.py[省略]: OK
>>> Jul 29 17:51:24 ip-省略 sampled.py[省略]: OK
```

# ファイルのパーミッション設定
次にファイルのパーミッション関連の注意点です。

私はプログラムをデーモン化する時にファイルのパーミッション設定を適切に行えてなかったために躓きました。

先ほど同様以下のコマンドを打ち込みActiveの項目がfailed (Result: exit-code)になっていた場合はパーミッションエラーを疑いましょう。

```
$ sudo systemctl status sampled 
>>> sampled.service - sampled daemon
>>>   Loaded: loaded (/lib/systemd/system/sampled.service; enabled; vendor preset: enabled)
>>>   Active: failed (Result: exit-code)
>>> '''
>>> 省略
>>> '''
```
まずPermission deniedエラーが出現したらデーモン化したいファイルのあるディレクトリに移動して以下のコマンドを打ち込んでください。

```:~/sampled
$ ls -l
>>> -rw-r--r-- 1 root  root  1052 Jul 29 17:16 sample.py
```
コマンドで表示されたファイルのアクセス権限を確認してデーモンのサービス設定ファイルに記述したUser、Groupと違う場合は以下のコマンドを打ち込む。

```:/etc/systemd/system/sampled.service
'''
省略
'''
[Service]
User=sample
Group=sample-group
'''
省略
'''
```
上記の設定である場合

```
# ファイル権限を変更
$ sudo chown sample:sample-group /home/ubuntu/sample/sample.py
$ sudo chmod 755 /home/ubuntu/sample/sample.py

#ファイル権限変更の確認
$ ls -l
>>> -rwxr-xr-x 1 sample  sample-group  1052 Jul 29 17:16 sample.py

# デーモンの再起動
$ sudo systemctl restart sampled

# デーモンの稼働状況表示
$ systemctl status sampled
>>> sampled.service - sampled daemon
>>>   Loaded: loaded (/lib/systemd/system/sampled.service; enabled; vendor preset: enabled)
>>>   Active: active (running)
>>> '''
>>> 省略
>>> '''
```
これでActiveの項目がactivr (running)になってれば完了です!!

# おわりに
普段Linuxを使わない分いろいろなれるまで大変でしたが使いこなせるようになると非常に便利なのでこれからも学習していこうと思います!

やっぱりAWSはすごいわ

ご覧いただきありがとうございました。