Elastic Bean stalk で、django+s3+postgresqlをデプロイする。前編
概要
Elastic Bean stalk で、django+s3+postgresqlをデプロイする。
参考サイト
やってみた
DATABASEをPOSTGRESQLに変更する
参照サイト:
ポスグレにログインする。
- まずユーザーを作ってみる。
$ 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
は直接上書きできるぽいので、もし修正したい箇所があったら、直接書き込んで修正できる。
- .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は次の記事で書こう。