1.1. やろうとしていること
EC2ではlambdaからきたpostを受取り、推論サーバーに渡して推論を行った後結果を返す。
EC2内の動きで必要になるポイントは、
- サーバーを立ち上げた後自動的にアプリケーションが実行されてほしい
- 簡単に環境を整えたい
の2つである。これに対して私は、
- Systemdを用いてサーバ起動時の動作を設定する。
- Dockerを用いて環境を設定する。
1.2. サービスの説明
1. Systemdについて[1]
Systemd : Linuxの起動処理やシステム管理を行う仕組み
Systemdファイルの基本構成要素は Unit, Service, Install の3つ。
Unit, Install にユニットファイルの共通的な設定内容を書き、Service で自ユニットファイルの実行内容の設定を行う。
ファイルの書き方について
Unit
- Description : ユニットの説明を書く
- After/Before : 指定したユニットの実行順番の依存関係を設定
- Requires/Wants : ユニットの依存関係の定義
2つのコマンドの違いは、依存関係のユニットが失敗したときの処理- Wantsの場合、依存ユニットが失敗したときでも自ユニットは失敗にならない。
Service
- Type : 5種類存在する。デフォルトはsimple
- simple
- forking
- oneshot
- notify
- dbus
- ExecStart : 実行するコマンドラインを書く
Install
- WantedBy/RequiredBy : ”*systemctl enable ~~*" でユニットをenableしたときに、.wants, .requires にシンボリックリンクを作る。
動作としては"Wants=", "Requires="と同じような感じになる。
2. Dockerについて
Docker : Linuxのコンテナ機能を使ったアプリケーションの実行環境を構築/運用するためのプラットフォーム[2]
今回は、pythonをベースに
- WebフレームワークであるBottleでpostに対するレスポンスを設定した。
- DLフレームワークであるchainerで推論部分の動作を作成した。
そしてこれをdockerにいれて動作するような環境を作成した。
1.3. サービスの設定方法
1. Systemd
コード
[Unit]
Description=start_dl_app
Requires=docker.service
After=docker.service
[Service]
Type=simple
ExecStartPre=-/usr/bin/docker container rm dl_app
ExecStart=-/usr/bin/docker container run -i -v /home/ec2-user/document/server:/myvol -p 8080:8080 --name dl_app dl_app
[Install]
WantedBy=multi-user.target
- Systemdファイル作成
- /etc/systemd/system/の下にファイルを置く
- SystemdファイルがServiceとして認識されたか確認する
systemctl list-unit-files --type=service
の出力に現れれば正しく認識されているということ。 - enableして起動する
systemctl enable ~~
で認識され、systemctl start ~~
で起動。
2. Docker
コード
FROM python:3
RUN pip install bottle chainer matplotlib pillow
WORKDIR /myvol
CMD python index.py
dockerコンテナ内に入り、コマンドを入力
docker image build -t dl_app ./ Dockerfile
docker container run -it -p 8080:8080 -v [マウントするパス]:./myvol --name dl_app dl_app
(注意)EC2サーバーの設定[3][4]
まず、dockerをinstallする必要あり
また、各ファイルをEC2内に入れるためにS3とマウントする。
最後にマウントしてあるディレクトリから推論サーバー作成に必要なファイルを移して終了
参考サイト
[1] systemdの*.serviceファイルの書き方
[2] いまさらDockerに入門したので分かりやすくまとめます
[3]EC2インスタンスにS3をマウントする
[4]s3fs を使って EC2 に S3 の Bucket をマウントする