読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

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

Elastic Bean stalk で、django+s3+postgresqlをデプロイする。前編

概要

Elastic Bean stalk で、django+s3+postgresqlをデプロイする。

参考サイト

realpython.com

やってみた

DATABASEをPOSTGRESQLに変更する

参照サイト:

qiita.com

ポスグレにログインする。

  • まずユーザーを作ってみる。
$ psql
psql (9.5.4)
Type "help" for help.

user=# CREATE ROLE [user名] LOGIN CREATEDB SUPERUSER CREATEROLE PASSWORD '**********';
CREATE ROLE
user=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 dmadmin   | Superuser, Create role, Create DB                          | {}
 ebuser    | Superuser, Create role, Create DB                          | {}
  • データベースを作成する
user=# CREATE DATABASE [テーブル名] OWNER [Role名];
user=# \l
       Name        | Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-------------------+--------+----------+-------------+-------------+---------------------
 ecommerce2  | ebuser | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 

user=# \q

settings/local.py で設定してみる。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'データベース名',
        'USER': '設定したuser',
        'PASSWORD': '設定したパスワード',
        'HOST': 'localhost',
        'PORT': '',
    }
}

python migrateしてみる。。。

python manage.py migrate
python manage.py runserver

できた!

CLI for AWS Elastic Beanstalk をpip installする。

  • 注意:これは、pyenv deactivateして、pyenv globalの方にinstallする。pip freeze > requirements.txtの時に、余計なパッケージが入ってしまうのを防ぐため。
$ pyenv deactivate
$ pip install awsebcli
$ eb --version
EB CLI 3.8.3 (Python 3.4.3)

Elastic Beanstalk 用に Django をアプリケーションを設定する

pyenv activate [virtualenv名]
# ebextensions という名前のディレクトリを作成します。
(eb-virt) ~/ebdjango$ mkdir .ebextensions

.ebextensions ディレクトリ内に、次のテキストを持つ django.config という名前の設定ファイルを追加します。

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ecommerce2/wsgi.py
# WSGIPath は、アプリケーションを起動するのに Elastic Beanstalk が使用する WSGI スクリプトの場所を指定します

EB CLI でサイトをデプロイする

eb init コマンドで EB CLI リポジトリを初期化します。

$ pyenv deactivate
$ eb init -p python3.4 djangoroid[<-作成する環境名] # ここは、3.4としているところがかなりポイント

環境を作成し、eb create を使用してそこにアプリケーションをデプロイします。

$ eb create designtoollabs[<-アプリ名]

errorが発生!

ERROR: Your requirements.txt is invalid. Snapshot your logs for details.

とのこと。ただ、これは想定済み!パッケージが足りないとのことなので、パッケージをあらかじめinstallするように設定してみる。

#.ebextensions/01_packages.configに以下のコードを表記しておく

packages:
  yum:
    git: []
    postgresql93-devel: []
    libjpeg-turbo-devel: []

以下の手順で、eb deployする(ほんとこの辺、herokuと似てるなぁ(^ ^;)

$ git add .
$ git commit -m "01packagesを追加"
$ eb deploy
$ eb open

無事デプロイ完了!

eb configで設定を確認してみる。

  aws:elasticbeanstalk:container:python:
    NumProcesses: '1'
    NumThreads: '15'
    StaticFiles: /static/=static/
    WSGIPath: ebdjango/wsgi.py

ここを修正するには2つの方法がある: 1. eb configは直接上書きできるぽいので、もし修正したい箇所があったら、直接書き込んで修正できる。

  1. .ebextensions/~.config で、configファイルで設定できる。

/.ebextensions/02_python.configのconfigを書いてみる。

option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "ebdjango.settings"
    "PYTHONPATH": "/opt/python/current/app/ebdjango:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: ebdjango/wsgi.py
    NumProcesses: 3
    NumThreads: 20
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "www/static/"

こんな感じで参考サイトをそのまま持ってきてみる。

$ git add .
$ git commit -m "tsuika"
$ eb deploy

無事デプロイできた!eb openで開いて確認もできた!

RDSにつなげてみる。

eb consoleでコンソール画面を開いて、RDSの設定をする。

  • 設定をクリック
  • 下の方までスクロールして、「データ層」というカテゴリーの、「新しい RDS データベースを作成」をクリックする。
  • DB Engineをpostgreに変更する。
  • MasterUsernameと、passwordをセットする。
  • 適用をクリック

settings.pyに書いてみる。

if 'RDS_DB_NAME' in os.environ:
    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'],
        }
    }

else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': '******',
            'USER': '******',
            'PASSWORD': '******',
            'HOST': 'localhost',
            'PORT': '5432',
        }
    }

これで、RDSの設定は完了!

Databaseのmigrationの指示を出す。(Handling database migrations)

.ebextensions/02_python.configに追記する。

container_commands:
  01_migrate:
    command: "source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput"
    leader_only: true
  • container_commands: EC2インスタンスにアプリがデプロイされた後に設定する。EC2インスタンスは、virtual environmentを使ってセットアップされているので、初めにvirtual environmentをactivateしてから、migrateする。
  • the leader_only: マルチインスタンスにデプロイするときに、first instanceにだけ実行されるコマンドかどうか。

Custom Commandを設定してみる。

ebdjango
└─ management
    ├── __init__.py
    └── commands
        ├── __init__.py
        └── createsu.py

という感じで、createsu.pyを作ってみる。これはdjangoの標準機能で、custom commandという機能らしい。createsu.pyは以下の通り。

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User


class Command(BaseCommand):

    def handle(self, *args, **options):
        if not User.objects.filter(username="admin").exists():
            User.objects.create_superuser("admin", "******@******", "****")

container_commandに以下を追加する。

02_createsu:
  command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
  leader_only: true

アクションの自作は以下の公式サイトを参照

アクションを自作する — Django 1.4 documentation

ハマったポイントは、

上の例では、 blog アプリケーションを settings.INSTALLED_APPS に登録 してあるプロジェクトで explode というコマンドを使えるようになります。

の箇所で、installed_appsに登録されていないとうまくデプロイされない。。。

これでcreatesuコマンドの設定は完了

StaticFileを設定してみる。

# container_commandsに追記する。

03_collectstatic:
  command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"

Success!

S3は次の記事で書こう。