針對 Elastic Beanstalk 設定您的 Django 應用程式
分類
說明
這篇主要說明部署 Django 到 Elastic Beanstalk 需要做哪些設定
不包含建立環境,安裝 Django 等等的工作
1. Django 部署環境設定
因開發環境和線上環境設定有差異,我另外建立 public_settings.py 來區分
your_project/your_project/public_settings.py
import requests
from .settings import *
ALLOWED_HOSTS = [
# Elastic Beanstalk 網域,或者自己買網域
# 'www.abc.com.tw',
# 'myenv.blabla.elasticbeanstalk.com',
]
CSRF_TRUSTED_ORIGINS = [
# Elastic Beanstalk 網域,或者自己買網域
# 'https://www.abc.com.tw',
# 'http://myenv.blabla.elasticbeanstalk.com',
]
DEBUG = False
# 將 ec2 私有 ip 加入 ALLOWED_HOSTS,不然 Elastic Beanstalk 健康狀態檢查會跳警告
try:
security_token = requests.put(
'http://169.254.169.254/latest/api/token',
headers={'X-aws-ec2-metadata-token-ttl-seconds': '60'},
timeout=0.01
).text
# aws beanstalk ec2 private ip for loadbalancing health check
EC2_PRIVATE_IP = requests.get(
'http://169.254.169.254/latest/meta-data/local-ipv4',
headers={'X-aws-ec2-metadata-token': security_token},
timeout=0.01
).text
if EC2_PRIVATE_IP is not None:
ALLOWED_HOSTS.append(EC2_PRIVATE_IP)
except requests.exceptions.RequestException:
pass
2. 啟用您的虛擬環境。
如果你的 python 有建立虛擬環境記得先打開虛擬環境 source bin/activate
3. 安裝 Elastic Beanstalk 相關套件
最一開始至少要安裝以下套件
終端
$ pip install gunicorn
$ pip install requests
4. 告訴 Elastic Beanstalk 要安裝哪些套件。
Elastic Beanstalk 會安裝 requirements.txt 裡面的套件
終端
切換到你的 django 專案目錄
$ cd path/to/your_django_project
$ pip freeze > requirements.txt
5. 建立名為 .ebextensions 的目錄。
這是用來配置 Elastic Beanstalk 資料夾
在你的 Django 專案底下建立 .ebextensions 的目錄
終端
切換到你的 django 專案目錄
$ cd path/to/your_django_project
$ mkdir .ebextensions
6. 在 .ebextensions 目錄中,新增具有下列文字的組態檔案 00_django.config。
這個是跟 Django 伺服器相關的設定
跟官方文件不同的是,檔名加了數字前綴
是為了以後方便讓 Elastic Beanstalk 按照檔名順序執行配置檔
WSGIPath: 就是 wsgi.py 的路徑,專案的目錄為根目錄
DJANGO_SETTINGS_MODULE: 指定要讀取剛剛建立的 public_settings
/static: 靜態檔路徑
your_django_project/.ebextensions/00_django.config
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: yourapp.wsgi:application
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: yourapp.public_settings
"PYTHONPATH": "/var/app/current:$PYTHONPATH"
aws:elasticbeanstalk:environment:proxy:staticfiles:
/static: static
7. 部署後執行的指令
在 Djagno 專案建立 your_django_project/.platform/hooks/postdeploy/00_django.sh
寫下部署應用程式後執行的指令
your_django_project/.platform/hooks/postdeploy/00_django.sh
#!/bin/bash
source /var/app/venv/*/bin/activate && {
# collecting static files
python manage.py collectstatic --noinput;
# log which migrations have already been applied
python manage.py showmigrations;
# migrate the rest
python manage.py migrate --noinput;
}
sqlite 問題
很可惜的是在 Platform: Python 3.8 running on 64bit Amazon Linux 2/3.3.14 版本中
有遇到一個錯誤是有關於 sqlite 的問題
django.db.utils.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher
假設你使用的是 sqlite 當作資料庫,暫時先不要使用 migrate
也就是這兩個指令
python manage.py showmigrations;
python manage.py migrate --noinput;
等之後改用其他的資料庫時再補上
參考
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!