AWS Cloud9上でFlaskの設定から公開まで

# 1.はじめに
AWS Cloud9上でFlaskを走らせるための備忘録です。
概ね以下のような構成です。
・AWS Cloud9でpython3を使うための環境設定
・ポートの開放
・ElasticIPを使ったドメインの割り当て（追加しました）

# 2.Cloud9の起動
Cloud9を起動し、「Create enviroment」でFlaskで公開するCloud9用の環境を用意します。
![c91.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/239956ff-0296-6191-3306-6f71237a8968.png)

Configure settings で環境設定を行います。Name欄に名称をつけで「Next Step」
![c92.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/db466f8e-540b-5140-a1bd-a9129d6ce60a.png)

Cost-saving settingは標準のままだと30分で強制的に終了しますので、「Never」に設定します。
後から設定変更可能です。（AWS Cloud9→Preferences→EC2 Instance）
(当初これを知らずに、勝手にflaskが停止する理由がわからなった...。)
![c95.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/4eac5446-2f4b-0140-3d80-5091d3e37f97.png)

「Next Step」のボタンを押し、確認の画面で「Create enviroment」ボタンで環境を構築します。

# 3.IDEの起動と初期設定
作成した開発環境を「Open IDE」で開き、開発環境を確認します。
![c96.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/7106a0f6-2f47-bd2f-4ed9-36160d26383f.png)
Pythonは3.6、pipは2.7が設定されていますので変更します。
sudo update-alternatives --config python
「2」を選択します。
![c97.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/60e6a062-134f-f7f6-29d1-3c9709a4f840.png)
再確認します。
![c98.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/80961547-47c5-f7a8-20f4-cf39759242f7.png)
pipで必要なモジュールをインストールします。今回はflaskをインストールします。
flaskに限らずpipでインストールするときは末尾に「--user」をつけてインストールします。
![c99.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/98c9d69c-7349-ad4c-d37a-f34800962a27.png)
# 4.ポートの開放
AWSのEC2管理画面から「実行中のインスタンス」を選択しインスタンスの一覧を表示します。
![C100.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/236c11bd-f55e-3c9e-d2cc-ea3096a3a903.png)

「説明」タブ内の「セキュリティグループ」の項目を選択
ここでパブリックIPのIPアドレスを控えておきます。
![C106.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/cb386790-bc27-1cc6-bd1b-bf9f666f771e.png)

「インバウンド」タブ内の「編集」ボタンを押します。
![C102.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/4517ce21-da3c-0b6d-de5d-f7f2a69f4c60.png)

「ルールの追加」ボタンを押し、タイプ「カスタムTCP」を選択し、開放するポート番号とソースに「0.0.0.0/0」を指定し保存します。今回は50000を開放します。
![C103.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/e75ff788-005b-7572-36d0-753e8132c55c.png)

# 5.Flaskのテスト
もう一度cloud9の開発環境に戻り、Flaskのテストコードを入力します。

```python

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello World"

if __name__ == "__main__":
    app.run(host = '0.0.0.0', port = 50000)
    app.debug = True
```
コードを実行します。
![C104.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/b621dfbe-d3f1-4f05-c5db-d6f72073e6a6.png)

ポート開放で確認したパブリックIP:ポート番号を叩いてアクセス可能なことを確認します。
http://〇〇.〇〇〇.〇〇〇.〇〇〇:50000/

![C107.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/2198a964-f2e8-2be0-5425-73e31a1172b2.png)
これで外部からアクセスできるようになりました。

#6. ドメインの割り当て（おまけ）
Elastic IPを使ってお名前ドットコムで取得したドメインを割り当てます。
##6.1 AWS側(Elastic IP)の設定
EC2ダッシュボードからElastic IPをクリック
![C108.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/3d9d4a4d-2814-ea65-ba5f-a215128a6fa6.png)

ElasticIPアドレスの割り当てをクリック
![C109.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/3486e52b-5077-d399-8486-82caed5eda2c.png)

パブリックIPアドレスが割り当てられます。
![C111.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/3f7a3de3-b6b9-012a-a6ea-c546b96d560b.png)

割り当てられたパブリックIPアドレスをクリックします。
![C114.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/8aaa7997-5636-7984-3d52-c635549a67d5.png)

該当するインスタンスを選択します。![C115.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/798f4e71-8c1c-ebee-8b7f-dfb5e6a64275.png)

プライベートIPも自動で候補が表示されますので、指定して「関連付ける」をクリックします。
これでElasticIPがEC2のインスタンスに割り当てられます。
![C116.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/d0f2b5cc-416d-70a2-3545-4d2696b257c1.png)

##6.2 お名前ドットコム側の設定
お名前ドットコムのドメイン管理画面でDNS関連機能の設定をクリックします。
※ネームサーバーはお名前ドットコムのネームサーバーを使用します。
ちなみに「.com」のドメインで1年間1,166円でした。
![C117.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/6162b204-5900-81a6-6b46-734d258157a9.png)

対象ドメインを選択して次へ
![C119.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/863a21b5-440d-dc48-5346-fb30717231d1.png)

DNSレコード設定を利用するの「設定する」ボタンをクリック
![C120.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/2e6727f1-9416-04e7-618b-4239ff97c667.png)

A/AAAA/CNAME/MX/NS/TXT/SRV/DS/CAAレコードのVALUE欄にElasticIPで取得したパブリックIPを入力して追加し、「確認画面へ進む」→「設定する」
![C121.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/a783a020-cba6-1a5f-b565-5a6fffadda69.png)

これでドメインと紐づけできました。反映されるまで数時間かかります。