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

Djangoroidの奮闘記

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

Elastic BeanStalk で、DjangoアプリをDockerでdeployしてみたときの話(結局失敗した)

Elastic Beanstalk Docker Django

概要

Elastic BeanStalk で、DjangoアプリをDockerでdeployしてみた。結局失敗した(^ ^;)

参考サイト

glynjackson.org

やってみたこと

  • Djangoのテストアプリを作成する。
  • Dockerfileを設定する。
  • Dockerfile.aws.jsonを設定する
  • eb init でアプリケーションを設定
  • ".elasticbeanstalk/config.yml"を設定する
  • eb create で環境を構築
  • Nginxを設定する

バージョンなど

python3.4.3 django1.10

Djangoのテストアプリを作成する

# 適当に今回の仮想環境を作っておく
$ pyenv activate EBdjangoforDocker 
$ pip install django

# 参考サイトからテンプレートを持ってくる
$ django-admin.py startproject --template=https://github.com/glynjackson/django-docker-template/zipball/master mysite

Dockerfileを設定する

参考サイトのテンプレートにはもともとDockerfileがついているので、これをminiconda+opencv付きに変更してみる。

# Dockerfile
- FROM python:3.4
+ continuumio/miniconda3

あと、opencvをcondaでinstallするコードを追記する。opencvに必要なパッケージも一緒にいれる。

+ RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client python-pip build-essential libpq-dev python-dev libgtk2.0-0

+ RUN pip install setuptools
+ RUN conda install -y --channel https://conda.anaconda.org/menpo opencv3

最終的に以下のような感じになっている。

# Base python 3.4 build, inspired by https://github.com/Pakebo/eb-docker-django-simple
# Python 3.4 | Django

FROM python:3.4
MAINTAINER Glyn Jackson (me@glynjackson.org)

##############################################################################
# Environment variables
##############################################################################
# Get noninteractive frontend for Debian to avoid some problems:
#    debconf: unable to initialize frontend: Dialog
ENV DEBIAN_FRONTEND noninteractive

##############################################################################
# OS Updates and Python packages
##############################################################################

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y

RUN apt-get install -y apt-utils
# Libs required for geospatial libraries on Debian...
RUN apt-get -y install binutils libproj-dev gdal-bin

##############################################################################
# A Few pip installs not commonly in requirements.txt
##############################################################################

RUN apt-get install -y nano wget
# build dependencies for postgres and image bindings
RUN apt-get install -y python-imaging python-psycopg2
RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client python-pip build-essential libpq-dev python-dev libgtk2.0-0

##############################################################################
# setup startup script for gunicord WSGI service
##############################################################################

RUN groupadd webapps
RUN useradd webapp -G webapps
RUN mkdir -p /var/log/webapp/ && chown -R webapp /var/log/webapp/ && chmod -R u+rX /var/log/webapp/
RUN mkdir -p /var/run/webapp/ && chown -R webapp /var/run/webapp/ && chmod -R u+rX /var/run/webapp/

##############################################################################
# Install and configure supervisord
##############################################################################

RUN apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
ADD ./deploy/supervisor_conf.d/webapp.conf /etc/supervisor/conf.d/webapp.conf

##############################################################################
# Install dependencies and run scripts.
##############################################################################

ADD .      /var/projects/mysite
WORKDIR /var/projects/mysite

RUN pip install setuptools
RUN conda install -y --channel https://conda.anaconda.org/menpo opencv3
RUN pip install -r requirements.txt

##############################################################################
# Run start.sh script when the container starts.
# Note: If you run migrations etc outside CMD, envs won't be available!
##############################################################################
CMD ["sh", "./deploy/container_start.sh"]

# Expose listen ports
EXPOSE 8002

EXPOSEについては、参考サイトによると、以下のような感じらしい。

It is worth noting however that on Beanstalk's single container environments only the first port you expose (8002) is mapped to port 80 using a passthrough server on the actual EC2 instance running Docker.

Benstalkの単一コンテナ環境だと、最初のexpose(今回だと8002)だけが、port80にmappingされるみたい。実際にウェブサーバが稼働しているEC2インスタンス上のDokcerではね。だからexposeはいくつか書いてもあんま意味ないよ。のようなことを言っている気がする。。。

CMD ["sh", "./deploy/container_start.sh"] について

sh -> shファイルを実行するコマンド

container_start.sh

cd /var/projects/mysite && python manage.py migrate --noinput
supervisord -n -c /etc/supervisor/supervisord.conf

supervisordは、簡単に複数のデーモンの実行を指示できるものらしい。

Supervisordを使って複数のサービスを単一コンテナで起動する | TANKSUZUKI.COM

Dockerfile.aws.json の設定

Dockerfile.aws.json

docs.aws.amazon.com

Dockerrun.aws.json ファイルは、Docker コンテナを Elastic Beanstalk アプリケーションとしてデプロイする方法を記述するものです。この JSON ファイルは Elastic Beanstalk に固有です。

今回のサンプルだと以下のようになっている。

{
  "AWSEBDockerrunVersion": "1",
  "Logging": "/var/eb_log"
}

eb createで環境を作成する。

$ eb create

めちゃ時間がかかってerrorが出た!

TIMEOUTを900にしてみる。

再度挑戦。。。無事deployは完了!!

$ eb open してみる。。。。internal error!ダメだぁ〜。

そもそも中身もよくわかってないので、AWSチュートリアルからやり直そう。