AWS Cloud9でFlaskを使ってみた①

#はじめに
##モチベーション
pythonでデータ分析や機械学習のプログラムを書いていると、それを使ってちょっとしたWebアプリを作ってみたい衝動に駆られることがあります。

ちょっと作ったものを誰かに見てもらいたいときとか、Webアプリで小遣いを稼ぎたいときとか、仮想通貨の予測サイトで荒稼ぎしたいときとか、あんなときとかこんなとき。

そこでちょっと調べてみると、Webフレームワークなるものがいるそうな。

そのむかし大学でwebサーバを作るという実習をした時にはそんなことは習わなかったけど、最近はいるらしい。さらにWebサーバとWebフレームワークのつなぎをするWISG（名はウィズギー）なるものもいるそうで。

そのあたりは調べればいろいろでてきますし、詳しくはないのでそちらにお任せするとして。実際今回は全く意識せずに動きます。ということで、とりあえず簡単に動くものを作りたいということでやってみます。

#作るもの
Hello Flask!と表示するWebサイト

これですね
![HelloFlask.PNG](https://qiita-image-store.s3.amazonaws.com/0/227631/41a7c69a-253b-0b95-5077-7bd50dba3e04.png)


「機械学習とかデータ分析とか言っときながらそれかい！」と突っ込まれそうですが、その辺もそのうち作りますんで、とりあえずほんとの基礎の基礎ということで。

#使うもの
・AWS cloud9
・python
・Flask

AWSのcloud9はクラウドの開発環境です。いろいろな言語の環境が整っていて、ブラウザ上で開発・実行ができる便利なものです。私の記事は基本これを使っています。

pythonは言わずと知れたプログラミング言語です。googleが使ってブレイクしたとかしないとか。データ分析とか機械学習ではとりあえずやっとけみたいなところです。

そしてFlaskですが、こいつがWebフレームワークです。RubyですとRuby on Railsがこれにあたります。のちのちpythonでプログラミングしたいので、pythonのフレームワークから選びました。

ちなみにpythonのフレームワークには有名どころとして、他にDjangoとbottleがあります、機能的にはDjango > Flask > Bottleです。
全部つかってみましたが、Djangoは何回チュートリアルやっても眠くなって断念しました。bottleも単純で使いやすかったですが、画像やファイルを扱いだすとうまくいかなかったりして（自分が悪いいんですが）なんとなくFlaskに落ち着きました。
#やってみた
前置きはこのくらいにしてやってみます。「ヘイボーイ…言葉はもう十分だぜ」（byジミヘン）
##cloud9に環境を立ち上げます
これは普通にやってください。設定は何も変えなくて結構です。と言ってもインスタンスタイプくらいしか選べませんが（ムロン一番小さいやつでいいですmicroですね）
##Flaskをインストールする
pythonでパッケージを使うにはインストールがいります。知っている方は何をいまさらですが、念のため。
`$sudo pip install flask`
これをターミナルに打ち込みます。いまさらですが、念のため。
オプションもありますが、なるべくシンプルにいきます。

pipはpythonのパッケージをインストールしたり、依存関係をうまくやってくれたりしてくれるやつです。pythonのパッケージ管理はpip一択でいいと思います。

##app.pyを書く
```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello Flask! "

if __name__ == "__main__":
    app.run(host = '0.0.0.0', port = 5000)
```
これが本体です。
最初のfrom～でパッケージを呼び出しています。
app～はおまじないです。Flaskのインスタンスを生成しているとか言うんですかね。
@app.route("/")から続くdef～はブラウザからアクセスがあったときに実行する処理を書いています。
この場合はルートにアクセスすると"Hello World"を返すということになります。分かる方にはすぐ分かりますが、よくわからない方は、他の使い方も見ているうちに理解できると思います。
if～はapp.pyを実行した時に実行されるものです。これも決まった書き方です。
そして、その中のapp.run～でアプリケーションを起動します。（これでも一応Webアプリです。）
##AWSのサーバーのポートを開けます
これでapp.pyを実行すれば、出来上がりと行きたいところですが、さすがはAWS。セキュリティがしっかりしています。そう簡単にはアクセスさせてくれません。ポートを開けなければなりません。

ここでは、先ほどapp.pyの最後でport=5000としたので5000番のポートを開けます。
AWSのサービスでEC2を選んで、実行中のインスタンスを選択しセキュリティグループをクリックします。そこのインバウンドタブの編集から、カスタムTCPでポート番号5000番を設定して保存します。ソースは任意の場所でいいと思います（気になる方は指定してもいいとは思いますが）。
##app.py実行！
いよいよ実行です。ターミナルで以下のコマンドを実行してください。
`$python app.py`
実行するとこんな結果がターミナルに出てきます。
なんか警告が出てますね。開発環境だから本番に使うな的な事でしょうか。
よく分からないですが、まあいいでしょう。

```
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

```
ちなみにアクセスがあるとこの下に、ログが残っていきます。

##外部からアクセスしてみる
ブラウザで以下にアクセスしてみます。
http://(実行中のEC2のパブリックDNS):5000/

パブリックDNSは先ほどのEC2サービスから確認できます。ちなみにインスタンスが再起動するたびに変わりますのでご注意ください。お金を払えば固定できますが。

この画面がでてきます。感動です。これをベースにWebサービス作り放題です。
![HelloFlask.PNG](https://qiita-image-store.s3.amazonaws.com/0/227631/41a7c69a-253b-0b95-5077-7bd50dba3e04.png)
#終わりに
今回はpythonでWebサービスを作りたいということで、AWS cloud9とFlaskを使って初歩の初歩をやりました。これからWebサービスらしくしていきます。とりあえずcssとかJavaScriptとかですかね。なんか考えます。
##続きはこちら
[AWS Cloud9でFlaskを使ってみた➁](https://qiita.com/ympnov22/items/5d7c786b28e7543cba27)