AWS EC2で懐かしのcgiゲームを動かす

[FUJITSU Advent Calendar 2018 その2](https://qiita.com/advent-calendar/2018/fujitsu2) の19日目の記事です。
(注意)この記事は個人の見解であり、所属する会社、組織を代表するものではありません。

#はじめに
昔やっていたcgiゲーム(箱庭諸島、Fated Labylinth、etc...)を久しぶりに遊びたくなったので、EC2上に設置してみました。

#AWSアカウントの作成
公式にガイドがあるので[こちら](https://aws.amazon.com/jp/register-flow/)をご覧ください。
EC2はアカウント取得から1年間、月750時間まで無料枠が存在します。(2018/12/19現在)
一ヶ月は24*31=744時間なので、インスタンスを複数生成しなければ無料枠を超えることはないと思います。

#EC2インスタンスの取得
###新規インスタンスの作成
EC2マネジメントコンソールに[ログイン](https://console.aws.amazon.com/)してください。
左ペインの「インスタンス」から、インスタンスの生成をクリックします。
![FireShot Capture 1 - EC2 Management Con_ - https___ap-northeast-1.console.aws.amazon.com_ec2_v2_home.png](https://qiita-image-store.s3.amazonaws.com/0/296916/13bdbce6-c17b-2c05-4cec-dd3d4a6e0c96.png)

無料枠の範囲内でいくつかマシンイメージが選べますが、今回はperlを使いたいので
「Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type」を選択します。
他のやつを選んでも大丈夫だと思います。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/296916/344cae7f-d782-9515-863b-a0d41af8d356.png)

インスタンスタイプは無料枠の範囲だと**t2.micro**しか選べないのでそれを選択します。

###セキュリティグループの設定
EC2ではインスタンスにセキュリティグループというファイアウォールのようなものを設定できます。
今回は公式が提供している[Webサーバーのリファレンス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-web-server)に従って設定します。
httpsは使わないと思いますが、この設定で作っておけば今後webサーバ－を作るときに流用できます。
分かりやすい名前を付けておきましょう。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/296916/4e08afd6-3e6f-e0f6-9b93-a71bedeb19be.png)

設定が終わったら右下の「確認と作成」を押してください。

###キーペアの生成
SSH接続に使うキーペアを生成します。
適当な名前をつけてどこか安全な場所に保存してください。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/296916/df7c0e28-865a-7027-19ed-2c55ec2de7c5.png)


#インスタンスへの接続
適当なSSHクライアントから先ほど作ったインスタンスへアクセスします。
今回はteratermを使用しました。
EC2のマネジメントコンソールからインスタンスのIPv4パブリックIPを確認して、SSHクライアントから接続してください。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/296916/0c1cc898-b362-aacf-cf3b-63a6cae4daa1.png)

ユーザー名の入力を求められるので、「ec2-user」
パスワードは空欄で大丈夫です。
「RSA/DSA/ECDSA/ED25519鍵を使う」を選んで、さきほど生成した.pemファイルを選択します。
**ファイルタイプを「すべてのファイル」にしないと.pemファイルが表示されないので注意してください。**
![5.png](https://qiita-image-store.s3.amazonaws.com/0/296916/9ffd37be-c974-5899-2a1f-6dd69fc9d7cf.png)

この画面が表示されたらログイン成功です。
とりあえず`sudo yum update`でパッケージを最新にしておきましょう。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/296916/85dc69fc-5e63-ceaa-cbd5-8b24403134fe.png)


#Apacheの導入
以下のコマンドを入力してください。
逐一sudoをつけるのが面倒なので、`sudo su`でrootに入ります。

```bash
sudo su
yum -y install httpd
service httpd start
chkconfig httpd on
```
`chkconfig httpd on`しておくと、インスタンス起動時に自動でapacheが起動します。
ブラウザでインスタンスのパブリックIPかパブリックDNSにアクセスすれば、apacheのテストページが表示されるはずです。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/296916/4783ca81-8dc3-379e-4a0a-f3c4e3506e7f.png)


#cgiゲームの設置
###cgiゲームの取得・設置
今回は「箱庭諸島2」を設置してみます。
[箱庭諸島の保管庫](http://www.hakoniwa.net/hako/)から「箱庭諸島2スクリプト」と「jcode.pl」をDLし、適当なフォルダに保存します。
拡張子が.txtになっているので、hako-readme.txt以外は.cgiに変更してください。

DLが終わったらフォルダをzipに圧縮してEC2上に転送します。
scpコマンドを使うのが一般的ですが、teratermなら「ファイル」→「SSH SCP」で転送できます。
Fromを圧縮ファイルのパス、Toを今回は`/home/ec2-user/`に設定してsendします。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/296916/9feeb261-e10e-e04a-82eb-0832a5ac3a6b.png)

転送したファイルをapacheのcgi-binディレクトリにコピーして解凍します。

```bash

cd /var/www/cgi-bin
cp /home/ec2-user/ファイル名.zip .
unzip ファイル名.zip
cd ファイル名
```

###perlパスの変更
cgiファイル内のperlのパスを正しく設定する必要があります。
perlのパスは`which perl`で確認できます。
おそらく`/usr/bin/perl`になってると思うので、必要ならcgiファイルの先頭行を書き換えます。
文字化けしている場合は`:e ++enc=euc-jp`で文字コードをeuc-jpにすると直る場合が多いです。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/296916/019c1ca1-b974-2b6c-f2a9-70f68a910737.png)

###パーミッションの変更
基本的に~~全部777にすれば動く~~ユーザーが表示だけできればいいものは644に、実行する必要があるものは755に設定します。
今回はhako-readme.txtに基づいて以下のように設定しました。

```
 cgi実行可能なディレクトリ(755)/
     |
     |-- hako-main.cgi   (755)
     |-- hako-mente.cgi  (755)
     |-- hako-top.cgi    (644)
     |-- hako-turn.cgi   (644)
     |-- hako-map.cgi    (644)
     |-- jcode.pl        (644) ※必要な場合のみ
     |-- data         (生成される)
     |-- data.bak0～3 (生成される)
```

#httpd.confの設定
最後にこのゲームにアクセスするためのURLを設定します。
apacheの設定ファイルは`/etc/httpd/conf/httpd.conf`です。
お好きなエディタで開いて以下のように設定してください。

```txt:httpd.conf
ScriptAlias /ゲームの名前/ "/var/www/cgi-bin/ディレクトリ名"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
```

これで`http://パブリックIP/ゲームの名前/○○○.cgi`にアクセスすればcgiが実行されるはずです。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/296916/4eb626b7-801c-f304-6f88-2aa16ee5ffe8.png)


#おわりに
うまく動きましたでしょうか？
パーミッションの設定やフォルダ構造は設置するゲームによって異なるので、いろいろと調べてみてください。

何か間違っている点などありましたらコメント欄で教えていただけると幸いです。

#参考
[AWS EC2でWebサーバーを構築してみる](https://qiita.com/Arashi/items/629aaed33401b8f2265c)
[Apache:CGIの利用設定をする](https://qiita.com/YasuyukiKawai/items/231821dd22a72194b3fb)