針對 Elastic Beanstalk 設定您的 Django 應用程式


建立時間: 2022年6月2日 11:47
更新時間: 2022年6月2日 11:51

說明

這篇主要說明部署 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;

等之後改用其他的資料庫時再補上

參考

觀看次數: 1092
awsbeanstalkconfigconfigurationdjangoelasticsetting設定
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!