Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Elastic Beanstalk 単一Container DjangoのpostgreをRDSで設定する

概要

Elastic Beanstalk 単一Container DjangoのpostgreをRDSで設定する

参考サイト

realpython.com

やってみたこと

  • 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先生に聞いたら、以下のような回答を見つけた。

askubuntu.com

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してみる。。。とりあえず、できた! あとは、環境変数をセキュアに渡す方法を調べる感じだな。。。