ローカルで開発した Django WebアプリをEC2で稼働できるようにするための手順。
事前にWebアプリはGitHubにアップロード済み。
静的ファイル収集とライブラリの出力もしておきます。
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
python manage.py collectstatic
pip freeze > requirements.txt
EC2 の作成と設定
・ColoudFormation用のyamlファイルを作成してVPC, EC2Instance, InternetGateway, PublicSubnet, RouteTable, SecurityGroup を作成しておきます。
コンソールで作成してもOK お好きな方で。
(ここは各自設定が違うと思うので割愛)
・セキュリティグループにDjango用のポートを設定
カスタムTCP TCP 8000 Anywere-IPv4
EC2 へアクセス
・EC2の設定のためターミナルからアクセスします(VScode AWS-Cli を使用)。
パブリックIPの取得 -> ログイン
> aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].[InstanceId,PublicIpAddress]" --output table
>>
------------------------------------------
| DescribeInstances |
+----------------------+-----------------+
| i-***************** | **.***.***.** | <- $Public_IP
+----------------------+-----------------+
> ssh -i "セキュリティキーパス/ファイル名.pem" ec2-user@$PUBLIC_IP
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Gitインストール -> Webアプリ Pull
sudo yum update -y
sudo yum install git -y
git clone <リポジトリのURL>.git
取り込まれたWebアプリのファイルが表示されればOKです
$ ls
CloudFormationTemplate.yaml config django_command.sh manage.py package.json react_command.sh templates
Lib connect_ec2.sh ec2_command.sh node_modules pyvenv.cfg requirements.txt update_settings.py
Scripts db.sqlite3 equity_hub package-lock.json react-frontend staticfiles users
必要なライブラリインストール
事前にインストール済みのライブラリを requirements.txt に出力してWebアプリ内に保存していたのでまとめてインストール。
合わせてサーバー起動用のgunicorn, 静的コンテンツ公開用のwhitenoiseをインストール
pip install -r requirements.txt
pip install gunicorn
pip install whitenoise
実行確認
<webアプリディレクトリを私はconfig にしているので Webアプリ内で実行するときは
gunicorn config.wsgi:application --bind 0.0.0.0:8000 となります。
gunicorn <webアプリディレクトリ>.wsgi:application --bind 0.0.0.0:8000
おそらく Invalid HTTP_HOST header: が表示されたと思います。
settings.py 内の ALLOWED_HOSTS = [] 内にEC2のパブリックIPを指定しないといけません。
ALLOWED_HOSTS 設定
sudo nano settings.py
ALLOWED_HOSTS = ["**.***.***.**"] <- Public_IP
#入力後 CTRL + X, Y, ENTER
再度実行後[http://Public_IP:8000] にアクセス
ページが表示されればOKです。
終わりに
・これで起動が確認できましたが、気になる点が2つ。
1:毎回ターミナルでサーバーを起動しないとWebアプリを使用できない。
2:EC2を一度停止するとPublic_IPが変わってALLOWED_HOSTS の変更が必要になる。
次回はこの対応を考えてみようと思います。