[Python]AWS + Tornadoの環境構築

# 初投稿
アウトプットのつもりなのでほんの少しでもお役に立てば幸いです。
やることはここに書いてあることとほとんど同じ
[【Python】Tornadoの環境構築 / 2017年10月](https://qiita.com/ononoy/items/d1ced6089bbee96b9d9b)
システム側に触れるようになりたいと思いやってみることに。

- AWSのEC2とRDSを使ってインフラ構築
- EC2のOSはAmazon Linux
- RDSのDBMSにはMySQL
- サーバ側はPython3
- DBのORMにはsqlalchemy
- マイグレーションにはalembic
- コーディング規約はpycodestyle(pep8)

こんな感じのチャットアプリを作ろうと思います。

# 環境設定
- Macbook Air El Capitan 10.11.6
- Python 3.6.5

# AWS
EC2サーバーとRDSの設定は下のURLから設定しました。
[AWS EC2でWebサーバーを構築してみる](https://qiita.com/Arashi/items/629aaed33401b8f2265c)
[Amazon RDS for MySQLインスタンス作成手順](https://qiita.com/na0AaooQ/items/7c69a88c80f1efb4cad3)

毎回アドレス名入れるのも面倒なので、awsと打てば接続できるようにします。
[EC2へのSSH接続を簡単にしたい！ (1)「いつもの設定」を記憶させる](http://www.subthread.co.jp/blog/20160405/)
インスタンスを停止再開させるたびに設定変えなくちゃいけないので面倒は面倒ですがそんなに使わないと思うので…
(追記)
AWSのConsoleからElastic IPを作れば、毎回違う場所に入る必要はなくなりました。
Elastic IPはEC2と紐付けておかないと課金されてしまうので注意しましょう。

# セットアップ
仮想環境を作るために必要なモジュールを入れていきます。

```
#mysql
sudo yum -y install mysql
sudo yum install mysql-server 
mysql -u root -p -h example-rds-mysql-server.rmaor3s9lak.us-east-2.rds.amazonaws.com

#PyMySQL(pipを入れた後に入れました）
sudo pip install PyMySQL

#wget
sudo yum install wget

#git
sudo yum install git

#pip
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
pip -V
>pip 9.0.1

#pyenv
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
exec $SHELL -l

#グローバル用のpython3.6.3
pyenv install -v 3.6.3
#(zlibとかsslがないとか言われた時は下記URLを参照しました）

#apache
sudo yum -y install httpd
sudo service httpd start

```
https://github.com/pyenv/pyenv/wiki/Common-build-problems
↑エラーの時にここにつないでねって言われます。

# 仮想環境構築
ec2-Userディレクトリ直下に仮想環境を作りました。

```
pyenv virtualenv 3.6.3 venv_3.6.3
#pyenv virtualenv [バージョン] [新規ディレクトリ名]
#自動的に[venv_3.6.3]が表示の前に着いたら仮想環境構築成功です。
#消したい時は  pyenv uninstall venv_3.6.3

#tornado,sqlalchemy,alembic
pip install tornado
pip freeze | grep tornado
>tornado==4.5.2
pip install sqlalchemy    #後で確認したらバージョン1.1.15でした
pip install alembic
pip freeze | grep alembic
> alembic==0.9.6
```

不安になったのでpythonのパスを確認してみました。

```
python -c 'import sys; print(sys.path)'
['', '/home/ec2-user/.pyenv/versions/3.6.3/lib/python36.zip', '/home/ec2-user/.pyenv/versions/3.6.3/lib/python3.6', '/home/ec2-user/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload', '/home/ec2-user/.pyenv/versions/venv_3.6.3/lib/python3.6/site-packages']
```
venv_3.6.3のsite-packagesに通ってるので大丈夫そうです！

# 試しに走らせてみる。
後で見つけたけど、このサイトが最強だった。
[簡単に AWS EC2 にPython3 + Tornado の動作環境を構築した。](https://qiita.com/gctoyo/items/239696d20c03ed0ab6b7)
ほとんど同じでしたね…
home/ec2-user/example直下にsample.pyを作りました。

```python:sample.py
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
```
これを走らせたら終わりや！！と思ったらサーバーのIPにはつながる(Apacheの画面がでる)のに８８８８が繋がらない…のでもしやポートが空いてないのでは？と思いsettingに
[AWS EC2の登録からDockerをインストールしTensorFlowを実行するまで](https://qiita.com/yaju/items/dfdb253d85bc7d4f8360)
これ見る限りやっぱりポート開いてなかったんかい…と思い開いてから走らせたら無事Hello Worldが表示されました。長かった。

次↓
[[Python]AWSを使ってec2+RDS環境を構築したい](https://qiita.com/tkap/items/3572168e57e012a46a04)