まずはじめこれは宣伝ではありません。
AWSのEC2にタイトルに書いたサービスをリリースしたのでリリースするまでの過程を自分のアウトプット含めてシェアします。
Djangoでスマホ情報と中古価格情報のデータベースを作成
まず最初にスマホの情報をまとめ、効率的に構築するためにスマホ名やCPUなど使いますものを外部キーになるように作る。
次に中古データ平均価格を取得するために中古サイトをスクレイピングし、格納するためのデータベースを構築する。
この2つを同じアプリ内で作るとviewsの中が見にくくなるのでアプリを分ける。
スクレイピングのデータを取得する方はアクセス制限を掛ける
まず前提として出来れば管理者側と一般公開するサイトはEC2でべつにインスタンスを用意して分けた方が良い。
そして管理者側のサイトはipアドレスで制限を掛ける方が良い。
どちらでもスクレイピングツールがあるページはかならずログインやsuperuserのみなどのアクセス政権をviewsで掛けるべき。
特にスクレイピングはスペックの高いインスタンスでないと複数の同時動作をすればサーバーがパンクしてしまうから要注意。
Nginxとアプリを繋げる
ここをやらなくても一般公開することは出来るがセキュリティやSEOを考えれば致命的。
ドメイン、常時SSHなどの設定をするにはNginxやApacheなどのウェブサーバーが必要です。
今回は最近のトレンドや使いやすさを考えてNginxを使いました。
直接のEC2のNginxをインストールしてアプリに繋げる方法もありますがローカルでのメンテナンスがめんどくさくなるのでDockerを使い、Nginxとアプリのコンテナを作成してポートで繋げ運用します。
Dockerでローカルと本番環境の差をなくす
普段からPythonでプログラミングをしているため既にいろんなライブラリがインストールされている
複数のインスタンスでの運用
ライブラリやその他プログラムの管理
これらを全てインスタンスに直接インストールしたり構築するのは非常に手間なのでDockerで管理します。
本来はECS, Github Actionなどを使い自動テスト、デプロイを実装したいのですがそこまでまだやれていないので今回はGitHubでec2にpullをしてdocker-composeでコンテナを組み合わせました。
ドメインを取得してRoute53に登録
ドメインは今回のサイトは色々な実験ってこともあって無料のドメインを取得。
やらなくても出来ますがELBを通さずにEC2をドメインと紐付ける場合は固定ipの設定をすることを勧めたい。
ドメインに証明書を登録してELBでhttpsに対応させる
Googleも推奨している暗号化通信をするにはドメインに証明書を発行する必要ある。
AWSではパブリック証明なら無料で入手することが出来る。
ACMとAWSの検索欄で入力すれば出てくるので入力して出てきた指示に従って入力する。
尚、反映まで30分ほど掛かる。
それが終わったら次にEC2に行き右側にロードバランサーの設定をするページがあるので設定し終わればドメインにhttpsでアクセス出来るようになる。
Nginxでhttpsにリダイレクト設定
今のままだとurlを変えれば暗号化されていないページへのアクセスを許してしまう。
それを防ぐにはNginxで301リダイレクト設定をしてhttps以外のアクセスを全てhttpsへアクセスされるように設定する。
Amazon RDSとS3をDjangoのアプリに繋げる
今のままだとファイルを追加、新しく投稿をするたびにEC2へ直接アップロードして重くなってしまう。
それを防ぐにためにAmazon RDSでデータベースとS3でバケット作りsettingsで設定をする。
ローカルでテストとして動かしたい場合にはパブリックパーミションをonにする。