Elastic Beanstalk 単一Container DjangoのpostgreをRDSで設定する
概要
Elastic Beanstalk 単一Container DjangoのpostgreをRDSで設定する
参考サイト
やってみたこと
- settings.pyを、settings/base.py, local.py, production.py に分ける。
- production.pyに、RDSの設定をする。
settings.pyを、settings/base.py, local.py, production.py に分ける。
以下のようなフォルダの構成にする。
- website - settings - __init__.py - base.py - local.py - production.py
- init.pyは以下のようなコードにしておく。
from .base import * try: from .local import * except: pass try: from .production import * except: pass
- base.py, local, production.pyのBASEDIRのpathを変更する。(階層?が一段階下になるため。)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
base.pyは、
DEBUG = False
にしておく。production.pyは、以下のようにDebugの時のみ読み込むように設定する。local.pyは、DEBUG=Trueのため、こうしておけば、localで読み込む時は、productionの設定を読み込まないようにできる。
from django.conf import settings if not settings.DEBUG: import os ...
production.pyのDATABASESの箇所をコメントアウトする。
.ebignoreに、app/website/settings/local.pyを追記する。(eb deployでpushしないように。)
production.pyに、RDSの設定をする。
RDSを設定する。
- eb consoleでコンソール画面を開いて、RDSの設定をする。
- 設定をクリック
- 下の方までスクロールして、「データ層」というカテゴリーの「新しい RDS データベースを作成」をクリックする。
- DB Engineをpostgreに変更する。
- MasterUsernameと、passwordをセットする。
- 適用をクリック
production.pyに以下のような感じで設定する。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], } }
- psycopg2 が入っていない場合は、pip installしておく。
いざ、eb deploy
!。。。error 発生!logを確認してみる。。。
Error: pg_config executable not found.
あー、前もあったなこれ。pg_configが入ってないので、これをDockerfileで入れる。install libpq-dev
が必要とのこと。
- Dockerfileに、
apt-get install libpq-dev
をいれる。
再度デプロイしてみる。。。Error発生! libpq-devがうまく入っていないっぽいなぁ。。。google先生に聞いたら、以下のような回答を見つけた。
sudo apt-get remove libpq5 sudo apt-get install libpq-dev
これをDockerfileに差し込んでみる。
いざ、eb deploy
、、、またerror発生!
今度は、 [0m[91mKeyError: [0m[91m'RDS_DB_NAME'
と出ている。
多分、環境変数のRDS_DB_NAMEがうまく渡せてないぽい。
RDS -> EC2 -> Docker -> Containerの流れのため、EC2からContainerへの環境変数の引渡しが必要かもしれない。
とりあえず、無理やり環境変数をsettings.pyに渡す。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': '****', 'USER': '*****', 'PASSWORD': '****', 'HOST': '*****.******.ap-northeast-1.rds.amazonaws.com', 'PORT': '5432', } }
これでbuildしてみる。。。とりあえず、できた! あとは、環境変数をセキュアに渡す方法を調べる感じだな。。。