AWS EC2でPerlのWebアプリケーションをホスティングさせる

ネットの情報が古いので、最新化のため記載（といってもほぼ参考になるのが多いが）。

- 独自ドメインを使ったホスティング
    - 2019/6/5
- Supervisorインストール
    - 2019/6/9

# 概要

- PerlのWAFであるAmon2を使って作ったアプリケーションを、AWS EC2にデプロイ
- EC2の再起動をしたときも起動するように、Supervisorというツールを使ってデーモン化

# 環境

- AWS EC2 Ubuntu Server 18.04
- [Perl入学式](https://github.com/perl-entrance-org/Perl-Entrance-Textbook/tree/master/amon2)で作ったSchedulerアプリ
- すでに独自ドメイン設定は完了しており、 http://www.scheduler-amon2.xyz でindex.htmlにアクセスできるような設定をapacheに実施済みという前提

# やりかた

## アプリのデプロイ

### 作成したSchedulerアプリをEC2へgit glone
今回はEC2のIAMユーザであるubuntuユーザのホームディレクトリ直下に格納(/home/ubuntu直下)。
以下、すべての作業はubuntuユーザで行うものとする。

## Perlと、Perlのモジュール管理機構を導入
[ここ](https://github.com/perl-entrance-org/workshop-2014-01/blob/master/build_perl.md)を参照して、plenvを使ってperlの導入とcpanmの導入を行った。

### cartonでモジュールインストール

```:console
cd /home/ubuntu/Scheduler
carton install
```

### データベース作成
ほんらい、本番環境では使わないけど、練習なのでsqlite3で実施する。

```:console
sqlite3 db/production.db < sql/sqlite.sql
```

## リバースプロキシ設定

Amon2だとWebアプリの起動ポートが5000番なので、80番アクセスのときにリバースプロキシで対応する。
### モジュール有効化

```:console
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
```

### ファイル編集
```apache:/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
	DocumentRoot /home/ubuntu/Scheduler

	ProxyPreserveHost On
        ProxyPass / http://www.scheduler-amon2.xyz:5000/
        ProxyPassReverse / http://www.scheduler-amon2.xyz:5000/
</VirtualHost>
```

### apache再起動

```console:console
sudo systemctl restart apache2
```

## Superviserを使ったデーモン化

### 起動用ファイルを作成

```bash:/home/ubuntu/Scheduler/scheduler.sh
#!/bin/bash

export HOME=/home/ubuntu
export PLENV_ROOT=$HOME/.plenv
export PATH=$PLENV_ROOT/bin:$PATH
eval "$(plenv init -)"
cd $HOME/Scheduler
exec plenv exec carton exec plackup -Ilib -R ./lib -E production --access-log /dev/null -p 5000 -a ./script/scheduler-server
```

exec plenv, exec carton, exec plackupとやっておかないと、コマンド実行がうまくいかない。ここらへん調べたけど結局、なぜexecと最初に打たないといけないのか腑に落ちなかった。あとで調べてみよう。

## Supervisorのインストール
```:console
sudo apt-get install supervisor
```
pipを使う方法もあるが、今回はシステム管理コマンド(systemctl)の管理下にしたいのでapt-getを使うことにした。入ったバージョンは下記。最新バージョンは4.03

```:console
$ sudo dpkg -l | grep supervisor
ii  supervisor                     3.3.1-1.1                         all          System for controlling process state
```
 
インストールの確認。自動起動が有効(enable)になっているのが確認できる。

```:console
$ sudo systemctl status supervisor
● supervisor.service - Supervisor process control system for UNIX
   Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-06-09 11:36:23 UTC; 53min ago
     Docs: http://supervisord.org
 Main PID: 743 (supervisord)
(以下略)
```

### 設定ファイルの作成
参考にしたサイトではiniファイルを作るということをしていたが、うまくいかなかった。
今回はすべて一緒くたにした。

```ini:/etc/supervisor/conf.d/supervisord.conf

[unix_http_server]
file=/var/run/supervisor.sock

[supervisord]
logfile=/var/log/supervisor/supervisord.log
loglevel=debug
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
environment=SHELL="/bin/sh"

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
history_file=~/.sc_history

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[group:supervisord]
programs=scheduler

[program:scheduler]
numprocs=1
autostart=true
autorestart=true
startsecs=4
user=ubuntu
redirect_stderr=true
stdout_logfile=/var/log/supervisor/scheduler_out.log
stdout_logfile_maxbytes=0
stdout_logfile_backups=0
stderr_logfile=/var/log/supervisor/scheduler_err.log
stderr_logfile_maxbytes=0
stderr_logfile_backups=0
directory=/home/ubuntu/Scheduler/
command=/home/ubuntu/Scheduler/scheduler.sh
```

### supervisorサービス再起動 (※ 設定ファイルを読み込んで、変化があったプログラムだけ再起動してくれるタイプのコマンド）
```:console
sudo supervisorctl update
```

通常、supervisorを操作するときにはsupervisorctlコマンドを使って操作するのがお作法らしい。

以上。これでEC2を再起動したときにもWebアプリケーションが自動起動されるように設定された。
ログ取得、管理、操作、など、まだまだやりたいことは沢山ある。
さしあたって、つぎはCIツールを試してみたい。

## 参考情報

- http://supervisord.org
- https://tech-mr-myself.hatenablog.com/entry/2013/05/15/172118
- https://papix.hatenablog.com/entry/2015/08/05/131113
- https://qiita.com/anapple07/items/2a9de6afa356a8531636