初心者がPythonのDjangoでポートフォリオを作成してみた（AWSデプロイ）

## 紹介
どうも、独学でウエブアプリを作っているクリスと申します！
最初はただの問題解決のため自分でアプリを作ろうとしましたが、まさかポートフォリオになるとは思いませんでした。（笑）

今回作ってみたものを紹介したいと思いますが、まずはその背景から語ります。

## 背景
自分は会社の寮に住んでいます。
寮は11部屋の一軒家ですが、なぜか電気代を計算してるメーターが6個しかない。
5部屋は各自のメーターで、残りの部屋はシェアという感じです。
なので毎月光熱費を計算するのを苦労してました。
そのうえ、他の部屋に住んでいる者は変わったりしますので、みんなが何日間、どのくらい使っているかを計算するのもかなり難しいです。（サービス業の従業員の出入りは激しいです）

そのため、自動的に計算してくれるアプリを作りたいと決めました。

## アプリ概要
MVCアプリ、基本的なCRUD処理と自分で作ったアルゴリズムで一人一人の光熱費を計算して、ユーザーに表示する。


### メイン機能
- 光熱費照会
- 日別で部屋のデータ照会（誰が何の部屋にいつ住んでいるか）
- 光熱費入力
- 部屋データ入力
- 光熱費削除

### アプリのイメージ
- 表示されているすべてのデータはサンプルです
- ホームページ
![home page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/f4ca9d97-e8c2-d9c5-160e-5a0addadb056.jpeg)

- ログインは　管理員　と　ゲスト　2種類あります。
    - 管理員画面
![admin bot menu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/2586a099-b82d-7f4d-0550-30cc85ec3163.jpeg)

    - ゲスト画面（入力項目なし）
    ![guest menu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/c3bf5f65-b5e4-2162-57b5-2c9fbd7f52b0.jpeg)

- 光熱費入力画面
![electric input.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/5ab6faf8-ccbb-cc33-9daa-ef1e4afff855.jpeg)
![new input 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/70d6f212-105e-d410-8d79-11eaa5f46fae.jpeg)

- 部屋データ入力画面
![room input 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/7601dfd0-1b53-409d-4471-74de6e43e47c.jpeg)

- 部屋データ入力完了の確認画面
    - 部屋番号が間違ったり、出入りの日付が逆にしたりすると、データが保存失敗になります
![room input 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/a00ab2b6-755c-63c8-49b7-c069d691fdef.jpeg)

- 照会　（光熱費＆部屋データ）（bootstrap modal）
![bill history.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/5851a85e-0381-106b-ccd6-beedd7096fa3.jpeg)
![room history.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/5b69db7a-d2b1-7dcc-2b02-d5e40a8cde3f.jpeg)

今までの入力はすべてCRUDでした
<strong>照会画面</strong>のボタンをクリックすると、DBにアクセスして、光熱費の金額を部屋データで毎日の平均で割ったりして、計算した結果を照会画面に出るようになります。

- 照会画面
    - 光熱費（水道代）
    ![water history.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/e43c8910-11da-55ca-762e-dc57722ccc0f.jpeg)

    - 部屋データ
    ![room history 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/1b3c524b-5236-d948-8eaa-f7ebfbf94ce7.jpeg)

## 使用技術
### フロントエンド
- bootstrap
- html/css/js (django template)

### バックエンド
- Python 3.10.4
- Django 4.1.1
- uwsgi 2.0.20
- NGINX

### インフラストラクチャー
- AWS (VPC, EC2, ALB, Route53)
- MySql (RDS)

### DB Diagram
![Database diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/d670db16-5236-8b84-a69f-5bdc0e944016.jpeg)

### インフラ構成図
![Environment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858947/433289e3-8273-33d3-b915-4685a76b857c.jpeg)

## 感想
完璧ではないが、アプリを使うことで、毎月この辺でかかる時間が縮めてて大変助かってます。それに携帯でも見れるので、どこにいても、上司や寮に住んでいる同僚たちにいろいろ聞かれたらすぐデータを見れるのでそれも大きいなメリットになりますね。

技術面に関して、
Djangoを独学して、ゼロから今までは大体4か月くらいかかりました。
そのうちAWSは2か月くらいの学習でした。
エラー > Google > 編集 > エラー > Google　という流れがほとんどです
”新しいエラーが出ることは、前のエラーから進んでいること”というのを心かけて学習を続いています。

### はまりポイント
- uwsgiをインスタンス再起動と同時にスタートすることを設定するには時間かかりました。それはLinuxに対しての勉強不足ですね。
- 環境変数はssh切断すると消えることを知らなかった。

### AWS
ほかの方の記事など見ると、AWSで苦労したりするのが多いですが、自分はAWSのコースを受けてるおかげで、今回のデプロイはAWSのほうは結構順調でした。

### 今後の計画
- コンテナーでデプロイ
- terraform使用
- CI/CD使用（circleCI）
- 少しだけ Auto Scale を試す （お金取られるのが怖いので笑）

## まとめ
初めての投稿ですが、見てくださった方ぜひぜひ気軽にコメントなどをしてください！

## 参考サイト
- EC2でPython3.10.xをインストールする際の手順
    - https://blog.serverworks.co.jp/install-python3-with-openssl11 
- uwsgi設定
    - https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html