オンラインIDEを無料で作ろう

## :golf: はじめに

HerokuにCloud9をデプロイして無料オンラインIDEを使おうと頑張ってます。
その努力の経過をまとめています。

GithubもHerokuも知ってるよ。
過程は良いから、Dockerfileが早く見たい。って人は、[GitHub](https://github.com/Utree/alpinehelloworld)に公開しているので、リンクを参照してください。

## なぜ、始めたのか？

友人のAWS Cloud9が13ヶ月目に入り、お金がかかってきたので、無料でやる方法を模索していて思いつきました。

## 無料オンライン開発環境についてぐぐってみた

レガシーなCloud9のアカウントを持ってるなら、[Cloud9](https://c9.io/)使えばいいんですが、持っていない場合、、、

![cloud9](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101441052_+2018-12-06+21.58.56.png)


HTML, CSS, JSだけでいいなら、[Thimble](https://thimbleprojects.org)が良さげ。

![thimble](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101476871_+2018-12-06+21.55.57.png)


Pythonでデータの処理とか、機械学習系をするなら、[Jupitor Notebook](http://jupyter.org/)とか、[Google Colab](https://colab.research.google.com/)になるのかな。

![google colab](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101484580_+2018-12-06+21.56.30.png)



![jupitor Notebook](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101515122_+2018-12-06+21.56.14.png)


JSONを返すだけとか、静的なファイルを置くだけなら、[myjson](http://myjson.com/)とか、[GAS](https://developers.google.com/apps-script/)がいいかも。

![GAS](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101558727_+2018-12-06+21.54.22.png)



![myjson](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101558704_+2018-12-06+21.53.41.png)


あと、オンラインのコンパイラとかは、言語ごとに探せばあるって感じですね。

## やり方をググってみた。

ない。。。

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544101905780_+2018-12-06+22.11.15.png)


Cloud9から、Herokuにデプロイする方法は引っかかるが、
HerokuにCloud9をデプロイする方法は見つからない。。。

## 具体的に何がしたいかというと、、、

とりあえず、思いついた方法、３つ

### 1. GithubにあるCloud9のリポジトリをフォークして、Herokuにデプロイ
![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544137076382_file.jpeg)

### 2. Cloud9のDockerfileを使って、コンテナをHerokuにデプロイ
![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544137094107_file.jpeg)

### 3. ローカルでCloud9を動かし、SSHトンネリング([ポートフォワーディング](#) )でアクセスさせる
実現可能性は高いが、 [オンプレ](https://codezine.jp/article/detail/8051) のサーバを置く時点で、無料ではない
![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544137048233_file.jpeg)

## 1. GitHubからデプロイ
> [GitHubのアカウント](https://programmingnavi.com/61/) 、[Heroku](https://webbibouroku.com/Blog/Article/heroku-getting-started) のアカウント, CLIはすでに持っているものとして、話を進めます。
> 「なんだそれ?」ってひとは、上のリンクにアクセスするか、よしなにぐぐってください。

### a. シンプルにフォークして、デプロイしてみる
Cloud9の[GitHubページ](https://github.com/c9/core) にアクセスしてForkする

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156422276_+2018-12-07+13.03.18.png)

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156525542_+2018-12-07+13.03.28.png)


[Heroku](https://dashboard.heroku.com/apps)にアクセスして、Create new app をする

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156649280_+2018-12-07+13.03.44.png)


Create appを押す(App nameは入力しなくていい)

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156659700_+2018-12-07+13.03.55.png)


GitHubにつなぐ

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156732778_+2018-12-07+13.04.08.png)


Forkしたリポジトリを探して、Connectする

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156782554_+2018-12-07+13.04.22.png)


Deploy Branchする

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156787629_+2018-12-07+13.04.34.png)


すると、Buildが進んで、

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156793824_+2018-12-07+13.04.47.png)


“Your app was successfully deployed”と表示されたら、Viewをクリックする。

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156799051_+2018-12-07+13.05.17.png)


全然Successfullyじゃないじゃん。

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544156805438_+2018-12-07+13.05.33.png)


アプリの設定ページに戻って、Activity → View build logをクリック

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544158025431_+2018-12-07+13.44.01.png)


ログを見てみると

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544158032194_+2018-12-07+13.44.10.png)

```Bash
    -----> Node.js app detected
           
    -----> Creating runtime environment
           
           NPM_CONFIG_LOGLEVEL=error
           NODE_ENV=production
           NODE_MODULES_CACHE=true
           NODE_VERBOSE=false
           
    -----> Installing binaries
           engines.node (package.json):  unspecified
           engines.npm (package.json):   unspecified (use default)
           
           Resolving node version 10.x...
           Downloading and installing node 10.14.1...
           Using default npm version: 6.4.1
           
    -----> Building dependencies
           Prebuild detected (node_modules already exists)
           Rebuilding any native modules
           c9@0.1.0 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/c9
           kaefer@0.1.0 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/kaefer
           amd-loader@0.0.5 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/amd-loader
           architect@0.1.11 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/architect
           connect-architect@0.2.0 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/connect-architect
           frontdoor@0.0.1 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/frontdoor
           msgpack-js@0.1.5 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/msgpack-js
           smith@0.1.22 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/smith
           treehugger@0.0.2 /tmp/build_75f4baa91a3c7c165659cc801c15ba00/node_modules/treehugger
           Installing any new modules (package.json)
           added 183 packages from 273 contributors, removed 9 packages and audited 253 packages in 11.329s
           found 40 vulnerabilities (11 low, 10 moderate, 18 high, 1 critical)
             run `npm audit fix` to fix them, or `npm audit` for details
           
    -----> Caching build
           - node_modules
           
    -----> Pruning devDependencies
           audited 253 packages in 1.963s
           found 40 vulnerabilities (11 low, 10 moderate, 18 high, 1 critical)
             run `npm audit fix` to fix them, or `npm audit` for details
           
    -----> Build succeeded!
    -----> Discovering process types
           Procfile declares types     -> (none)
           Default types for buildpack -> web
    -----> Compressing...
           Done: 39.6M
    -----> Launching...
           Released v3
           アプリ名 deployed to Heroku
```

HerokuのCLIで `heroku logs　--　tail -a アプリ名`を実行して、ログをみると、

```Bash
    $ heroku logs --tail -a safe-shelf-96289
    
    2018-12-07T04:04:02.738118+00:00 app[api]: Release v1 created by user ユーザー名
    省略
    2018-12-07T04:05:20.248779+00:00 heroku[web.1]: State changed from starting to crashed
    2018-12-07T04:05:20.250837+00:00 heroku[web.1]: State changed from crashed to starting
    2018-12-07T04:05:20.222517+00:00 heroku[web.1]: Process exited with status 1
    2018-12-07T04:05:19.969827+00:00 app[web.1]: 
    2018-12-07T04:05:19.969850+00:00 app[web.1]: > c9@3.1.5000 start /app
    2018-12-07T04:05:19.969851+00:00 app[web.1]: > node server.js
    2018-12-07T04:05:19.969853+00:00 app[web.1]: 
    2018-12-07T04:05:20.124000+00:00 app[web.1]: internal/modules/cjs/loader.js:582
    2018-12-07T04:05:20.124004+00:00 app[web.1]: throw err;
    2018-12-07T04:05:20.124005+00:00 app[web.1]: ^
    2018-12-07T04:05:20.124007+00:00 app[web.1]: 
    2018-12-07T04:05:20.124009+00:00 app[web.1]: Error: Cannot find module 'amd-loader'
    省略
    2018-12-07T04:05:20.130850+00:00 app[web.1]: npm ERR! code ELIFECYCLE
    2018-12-07T04:05:20.131414+00:00 app[web.1]: npm ERR! errno 1
    2018-12-07T04:05:20.133176+00:00 app[web.1]: npm ERR! c9@3.1.5000 start: `node server.js`
    2018-12-07T04:05:20.133438+00:00 app[web.1]: npm ERR! Exit status 1
    2018-12-07T04:05:20.133806+00:00 app[web.1]: npm ERR!
    2018-12-07T04:05:20.134072+00:00 app[web.1]: npm ERR! Failed at the c9@3.1.5000 start script.
    2018-12-07T04:05:20.134327+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    2018-12-07T04:05:20.158427+00:00 app[web.1]: 
    2018-12-07T04:05:20.158771+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
    2018-12-07T04:05:20.159000+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2018-12-07T04_05_20_136Z-debug.log
    2018-12-07T04:05:10.873607+00:00 app[api]: Release v3 created by user ユーザー名
    2018-12-07T04:05:12.000000+00:00 app[api]: Build succeeded
    2018-12-07T04:05:10.895893+00:00 app[api]: Scaled to web@1:Free by user ユーザー名
    2018-12-07T04:05:10.873607+00:00 app[api]: Deploy c4d1c59d by user ユーザー名
    2018-12-07T04:05:26.277205+00:00 heroku[web.1]: Starting process with command `npm start`
    2018-12-07T04:05:30.026512+00:00 heroku[web.1]: State changed from starting to crashed
    2018-12-07T04:05:29.989756+00:00 heroku[web.1]: Process exited with status 1
    2018-12-07T04:05:29.665053+00:00 app[web.1]: 
    2018-12-07T04:05:29.665073+00:00 app[web.1]: > c9@3.1.5000 start /app
    2018-12-07T04:05:29.665075+00:00 app[web.1]: > node server.js
    2018-12-07T04:05:29.665076+00:00 app[web.1]: 
    2018-12-07T04:05:29.856720+00:00 app[web.1]: internal/modules/cjs/loader.js:582
    2018-12-07T04:05:29.856725+00:00 app[web.1]: throw err;
    2018-12-07T04:05:29.856726+00:00 app[web.1]: ^
    2018-12-07T04:05:29.856728+00:00 app[web.1]: 
    2018-12-07T04:05:29.856729+00:00 app[web.1]: Error: Cannot find module 'amd-loader'
    2018-12-07T04:05:31.263257+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" 省略
```

なんかamd-loaderモジュールが無いのが問題らしいけど、ぐぐっても、いまいちどうしたらいいかわからん。 

### とりあえずローカル環境にCloud9をインストールしてみる。

```Bash
    $ git clone フォークしたリポジトリのURL
    $ cd core/
    $ scripts/install-sdk.sh
    $ node server.js
```

できた。

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544159424343_+2018-12-07+14.05.58.png)


そういや、`install-sdk.sh`スクリプトって、herokuデプロイの時、実行してないな。

Herokuで使われている言葉がよく分からなかったので、調べてみると、 [Procfile](https://qiita.com/you8/items/600bd6215a88f977bfd7) ってのが、重要そう。

### b. Procfileを作ってみる

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544165897446_.png)

```Procfile:Procfile
    web: scripts/install-sdk.sh
    web: node server.js --port $PORT --listen 0.0.0.0 -a name:password
```

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544160893372_+2018-12-07+14.25.06.png)


→ デプロイ → 失敗 😭 
エラーのログにも変化がないし、
`script/install-sdk.sh`が実行されてる様子がないな。

### c. インストールコマンドと起動コマンドを一つのファイルにまとめる
Procfileを変更

```Procfile:Procfile
    web: scripts/install-sdk.sh
```
```Bash:install-sdk.sh
    # 追記
    node server.js --port $PORT --listen 0.0.0.0 -a name:password
```

→ 失敗
g++が無いから、インストールに失敗してるのかな?

**d. cedar-14っていう**[**スタック**](https://qiita.com/mokamoto/items/c4896b5fa691007b65ff) **に変えてみる**

```Bash
    # stackを指定してherokuのアプリをcreate
    $ heroku create --stack cedar-14
    # ディレクトリを移動
    $ cd cloud9のディレクトリ
    # herokuをリモートに追加
    $ git heroku git:remote -a アプリ名
    # herokuにpush
    $ git push heroku master
```

-> 失敗

うん、、、わからん。ここで力尽きました。（泣）

## 2. Dockerでデプロイ
> [Docker](https://qiita.com/sho7650/items/9654377a8fc2d4db236d) のアカウントを持っていて、パソコンにDockerが入っているものとして話を進めます。
> 「なんだそれ?」ってひとは、上のリンクにアクセスするか、よしなにぐぐってください。

### Cloud9コンテナをローカルのDocker上に置く

```Bash
    # docker イメージをダウンロードし、コンテナをつくる
    $ docker pull kdelfour/cloud9-docker
    # コンテナにbashで入る
    $ docker exec -it コンテナID bash
    # コンテナ内でcloud9を起動
    $ node server.js --port 8080
```

→ 出来た

### Heroku Docker のチュートリアルを進めてみる

```Bash
    # herokuにログイン
    $ heroku container:login
    # gitからcloneする
    $ git clone https://github.com/heroku/alpinehelloworld.git
    # herokuのアプリをcreate
    $ heroku create
    # ディレクトリを移動
    $ cd alpinehelloworld
    # イメージをherokuにアップロード
    $ heroku container:push web -a アプリ名
    # herokuにデプロイ
    $ heroku container:release web -a アプリ名
    # ページを開く
    $ heroku open -a アプリ名
```

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544165737842_+2018-12-07+15.55.25.png)


→ 出来た

### a. Cloud9のコンテナをHerokuの上に送る

```Dockerfile:Dockerfile
    # webappディレクトリを削除
    rm -rf ./webapp
    # Dockerfileを編集


    #Grab the latest alpine image
    FROM kdelfour/cloud9-docker
    
    RUN /cloud9/scripts/install-sdk.sh
    
    # Expose is NOT supported by Heroku
    # EXPOSE 5000
    
    # Run the app.  CMD is required to run on Heroku
    # $PORT is set by Heroku
    CMD node server.js --port $PORT --listen 0.0.0.0 --auth name:pass
```

→ 動いた?

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175176216_+2018-12-07+18.29.31.png)


ん？

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175191830_+2018-12-07+18.08.42.png)


でも、cloud9 インストールされてない(.c9が無い)のか??

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175206524_+2018-12-07+18.08.54.png)


ん？

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175214090_+2018-12-07+18.17.51.png)


Terminalが使えない（泣）

### b. Dockerfileを編集

```Dockerfile:Dockerfile
    #Grab the latest alpine image
    FROM kdelfour/cloud9-docker
    
    RUN /cloud9/scripts/install-sdk.sh
    
    RUN C9_DIR=$HOME/.c9
    RUN PATH="$C9_DIR/node/bin/:$C9_DIR/node_modules/.bin:$PATH"
    RUN cd $C9_DIR
    RUN npm install pty.js
    
    # Expose is NOT supported by Heroku
    # EXPOSE 5000
    
    # Run the app.  CMD is required to run on Heroku
    # $PORT is set by Heroku
    CMD node server.js --port $PORT --listen 0.0.0.0 --auth name:pass
```

例のごとくインストールして、

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175735022_image_preview.png)

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175739418_image_preview+1.png)

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175746197_image_preview+2.png)

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175446768_+2018-12-07+18.35.57.png)


きたーーーーーーー!!!!

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544175456979_+2018-12-07+18.37.05.png)


→ 成功!!

[GitHub](https://github.com/Utree/alpinehelloworld)にDockerfileを公開しています

## 3. トンネリング
> あらかじめ、ssh接続先でアプリケーションを実行しておいてください。

### 接続先で動かす簡易ウェブアプリの例 cloud9を動かしてもOKです)

```Bash
    # bottleをインストール
    $ pip install bottle
```

```Python:server.py
    from bottle import route, run
    
    @route('/')
    def hello():
        return "Hello World!"
    
    
    run(host='localhost', port=8080, debug=True)


    # バックグラウンドで実行
    python3 server.py &
```

### まず、トンネリングをコマンドラインで動かしてみる
🔗 [つながるSSHトンネルが俺の力だ！](http://note.crohaco.net/2017/ssh-tunnel/)

```Bash
    $ ssh example.com -p 22 -L 8080:localhost:8080
```

0.0.0.0:8080にアクセスしてみる
→ 成功

### pythonで実装
🔗 [pythonでsshtunnelする](http://blog.calcurio.com/python-sshtunnel.html)

```Bash
    # sshtunnelライブラリをインストール
    $ pip install sshtunnel
```

```Python:connect.py
    from sshtunnel import SSHTunnelForwarder
    import sys
    
    args = sys.argv
    
    server = SSHTunnelForwarder(
        ('example.com', 22),
        ssh_username="name",
        ssh_password="pass",
        remote_bind_address=('0.0.0.0', 8080),
        local_bind_address=('0.0.0.0', 8080)
    )
    
    server.start()
```

```Bash
    # 実行
    $ python3 connect.py
```

0.0.0.0:8080にアクセスしてみる
→ 成功

### Herokuの[pythonチュートリアル](https://devcenter.heroku.com/articles/getting-started-with-python)を進める

```Bash
    # GitHubからclone
    $ git clone https://github.com/heroku/python-getting-started.git
    # ディレクトリを移動
    $ cd python-getting-started
    # herokuのアプリをcreate
    $ heroku create
    # herokuにpush
    $ git push heroku master
    # デプロイ
    $ heroku ps:scale web=1
    # 開く
    $ heroku open
```

![](https://d2mxuefqeaa7sj.cloudfront.net/s_B5994448ACE184C742AE47AB7E5B4DCFE91D8DC5525FEDF6BB8E49F313782327_1544177889557_+2018-12-07+19.17.47.png)


→ 成功

### 修正して、Herokuにデプロイ

```Python:connect.py
    from sshtunnel import SSHTunnelForwarder
    import sys
    
    args = sys.argv
    
    server = SSHTunnelForwarder(
        ('example.com', 22),
        ssh_username="name",
        ssh_password="pass",
        remote_bind_address=('0.0.0.0', 8080),
        local_bind_address=('0.0.0.0', int(args[1]))
    )
    
    server.start()
```

→ 成功

というか、これをするなら、[AWS](https://blog.kowloonet.org/2018/07/aws-cloud9-with-%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89/)で良いんじゃない、、、？？

一応、[GitHub](https://github.com/Utree/python-getting-started)に上げときます。

## まとめと今後の展望

HerokuとDocker、ポートフォワーディングについていい勉強になりました。

今後の展望としては、cloud9 でのプレビュー機能をつけることですね。

今更だけど、heroku dockerって、1日に１回[リスタート](https://devcenter.heroku.com/articles/dynos#restarting)されるみたいなんで、こまめに`git push remote master`しましょう。