ColaboratoryのローカルランタイムとしてAWS EC2を利用する方法

こんにちは。
最近Deep Learningを学び始めて、友人と週末に2時間くらい勉強会をやっています
その時にColaboratoryの無料版を利用しているのですが、スペックが少しキツくなってきたのでPro版を検討してみたのですが、スポットでしか利用しないので月額1000円くらい払うのはお得なのか？割高なのか微妙なとことろでした。
そこで色々と調べてみたところ、AWS EC2を使って接続した方が費用感的にも良さそうだったので、ちょっとした遊び感覚でやってみたので備忘として残すことにしました

# 対象
- Colaboratory Proの約月額1000円を払いたくなくて、少しでも安く済ませたい人(AWSの基本的な知識は必須)
- ローカル端末のスペックがそこまで高くなくて、一時的にハイスペックな環境を利用したい人

# 扱わないこと
- AWS EC2インスタンスの立ち上げや停止

# 環境
**パソコン**
Apple Mac mini(2018)
macOS Big Sur

**AWS**
Amazon Linux 2 AMI (HVM), SSD Volume Type
※インスタンスサイズなどその他の条件は任意

**アプリ**
Python 3.7.9
pip 20.2.2

jupyter core     : 4.7.1
jupyter-notebook : 6.4.0
qtconsole        : not installed
ipython          : 7.24.1
ipykernel        : 5.5.5
jupyter client   : 6.1.12
jupyter lab      : 3.0.16
nbconvert        : 6.0.7
ipywidgets       : not installed
nbformat         : 5.1.3
traitlets        : 5.0.5

# 流れ
## EC2インスタンスを立ち上げる

[チュートリアル: Amazon EC2 Linux インスタンスの開始方法](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EC2_GetStarted.html) などを参照してインスタンスを立ち上げてください。
ここで必要なものは次の2つです。

- pemファイル
- インスタンスへ接続用のSSHコマンド

## ポートフォワードしてSSHを接続
ご自身の端末から次のSSHコマンドを実行してポート8888をフォワードしてインスタンスに接続してください。
その際、インスタンスを作成した時に出力されたpemファイルが必要になりますので、手元に用意してから対応するとスムーズです。

```bash
ssh -L 8888:localhost:8888 ec2-user@ec2-x-xxx-xxx-xxx.ap-xxxxxxx-x.compute.amazonaws.com -i "xxxxx.pem"
```
お馴染みの下記画像が表示された接続に成功しているので、次のステップに進みます。
![スクリーンショット 2021-06-14 20.55.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79238/de169c52-a236-784f-0a69-5dd463e6f08e.png)

## Jupyterをインストール
[公式サイト](https://jupyter.org/install)の手順に従ってJupyterをインストールしてください。
インストールが完了したら、次のコマンドを実行して正常に起動するか確認してください。

```bash
jupyter notebook
```

下記のようにlocalhostのURLが表示されたら成功です

```bash
$ jupyter notebook
~~省略~~
    To access the notebook, open this file in a browser:
        file:///home/ec2-user/.local/share/jupyter/runtime/nbserver-3650-open.html
    Or copy and paste one of these URLs:
        http://localhost:8888/?token={{実際はここにトークンが表示されています}}
     or http://127.0.0.1:8888/?token={{実際はここにトークンが表示されています}}
```
※一部表記を省略しています

接続が確認できたら、Colaboratoryに接続するためにいくつかオプションの指定が必要なので、Jupyter Notebookを1度終了します。

## Colaboratoryで接続するようにオプションを指定してJupyter Notebookを起動
[Colaboratoryの公式サイト](https://research.google.com/colaboratory/local-runtimes.html) の手順に従って起動しましょう。
いくつか重要そうな部分だけピックアップしています

> 新しいノートブック サーバーを通常どおり起動します。ただし、Colaboratory フロントエンドからの WebSocket 接続を明示的に信頼するフラグを設定する必要があります。
〜〜省略〜〜
> ノートブックを他のユーザーと共有しても、ローカルマシン上のランタイムは共有されません。共有したノートブックを開いたユーザーはデフォルトでは標準のクラウド ランタイムに接続されます。

```
jupyter notebook \
  --NotebookApp.allow_origin='https://colab.research.google.com' \
  --port=8888 \
  --NotebookApp.port_retries=0

```

# Colaboratoryで接続先情報を入力
画面上部の右側あたりにあるメモリやディスクが表示されている隣の三角ボタンを押下します。
次に`ローカルランタイムに接続`を押下する
![スクリーンショット 2021-06-14 20.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79238/38630e21-9484-2cb5-5677-cb320f856371.png)

バックエンドURLの入力項目にコマンドライン上で表示された`http://localhost~~~~~`のアドレスを入力して[接続]を押下する

![スクリーンショット 2021-06-14 20.58.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79238/30774714-e119-7ebe-550b-be57531c3fcd.png)

接続に成功したら次の画像のように`接続済み（ローカル）`と表示されます

![スクリーンショット 2021-06-14 21.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79238/104a98b2-e674-8738-9aed-c6444a197347.png)

# 最後に
そこそこ時間がかかるので、お金は惜しいが時間には余裕がある人向けかもしれません