第4回はDockerリポジトリを使わずに
PythonuWSGIflaskの環境の作る方法です。
連載一覧
構築の前提
本来はECRなどのDockerリポジトリを使うべきですが
検証の為にリポジトリを用意せずに対応する方法になります。
AWSの公式ドキュメントではシングル構成のDocker時に
amazon/aws-eb-python:3.4.2-onbuild-3.5.1
というイメージを利用する記載がありますが
-
Pythonのバージョンが古い
-
multi container構成(Dockerrun.aws.json)ではイメージのカスタマイズができない
という理由により、GITで公開されている、
amazon/aws-eb-python:3.4.2-onbuild-3.5.1のDockerfileを元に
シェルにてコンテナ作成時にセットアップを実行します。
start-docker.shの配備
eb createをするカレントディレクトリにstart-docker.shという名前の
シェルスクリプトを作成します。
#!/bin/bash
# virtualenvのインストールをして
# 仮想環境(xxxdemo)を作成
pip3 install virtualenv
virtualenv /var/xxxdemo
# virtualenv環境にuwsgiをインストール
/var/xxxdemo/bin/pip install uwsgi
# volumeの共有ディレクトリから
# プログラム一式を仮想環境のディレクトリにコピー
cp -PR /var/app/* /var/xxxdemo/
# uWSGI用の実行ユーザーの作成
useradd uwsgi -s /bin/false
# ログディレクトリの作成と権限を付与
mkdir /var/log/uwsgi
mkdir /var/log/xxxdemo
chown -R uwsgi:uwsgi /var/log/uwsgi
chown -R uwsgi:uwsgi /var/log/xxxdemo
# uwsgiの起動関連の設定
chmod 700 /var/xxxdemo/uwsgi-start.sh
if [ -f /var/xxxdemo/requirements.txt ]; then /var/xxxdemo/bin/pip install -r /var/xxxdemo/requirements.txt; fi
# uwsgiの起動シェルを実行
sh /var/xxxdemo/uwsgi-start.sh
uwsgi-start.shの配備
eb createをするカレントディレクトリにuwsgi-start.shという名前の
シェルスクリプトを作成します。
#!/bin/bash
cd /var/xxxdemo
. bin/activate
# Flask support
if cat requirements.txt | grep -q -i Flask && [ -z "$WSGI_MODULE" ]; then
WSGI_MODULE=application:app
fi
[ -n "$WSGI_MODULE" ] && UWSGI_MODULE="--module $WSGI_MODULE"
# defaulting to application.py if not explicitly set
[ -z "$WSGI_PATH" ] && WSGI_PATH=application.py
uwsgi --http :8080 --chdir /var/app --wsgi-file $WSGI_PATH $UWSGI_MODULE --master --processes $UWSGI_NUM_PROCESSES --threads $UWSGI_NUM_THREADS --uid $UWSGI_UID --gid $UWSGI_GID --logto2 $UWSGI_LOG_FILE
上記のファイルを配備するとDockerrun.aws.jsonの
entryPointの指定よりシェルスクリプトが起動してuWSGIが起動します。
flaskの起動モジュールはeb createのカレントディレクトリの
application.pyという名前ファイルで配備する必要があります。