[wip] サーバで、快適に自由にサーバサイド開発をする

## 概要
### 悩み
* エンジニアMac(MacBookPro:i7,Mem16GB)が火を吹いてて辛い
  * オンライ会議ソフト(zoom)や、オンライホワイトボード(miro)など、重量級のソフトCPUを食い潰すようになった
  * サーバサイドエンジニア(Rails/AWS)のMacでは各種開発用サーバをdockerで動かしているが、  
   もともと重かったdockerと相まって笑えるほど遅い
 
![develop_with_remote.mkd-Page-1 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/f20f414a-bf04-17a2-09c4-c4f52680c826.jpeg)

### やりたいこと
* Macの負荷を下げるため、手元のMacからできるだけプロセスを外部のサーバに(AWS EC2)に投げたい。
![develop_with_remote.mkd-Page-1 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/a797c726-7424-3110-b9d2-a6b11b93e165.jpeg)

### 不安と期待
* 今までローカルで完結してた開発環境をリモートに切り離すにはいろいろ不安がある、
  またはリモートだからこその期待がある。
    * 快適に開発できるのか
        * 「sshでつなげてVimで開発は流石に嫌だよ？ VSCode 使いたい」
    * 安全に開発できるのか
        * 「通信ダダ漏れとかありえない」
    * 自由にどこでも開発できるようになるのか
        * 「カフエとかドーナツ屋さんで仕事したい」
    * 自由にどんな端末でも開発できるようになるのか
        * 「旅行にパソコン持って行きたくない！！！、ipadとかスマホで仕事したい！！」
    * 無駄なコストが発生しないか
        * 「使ってない月に、ン万円以上コストがかかるのは生理的に無理」

## 計画
### フェーズ分け
* いきなり全部やるとしんどそうだったので、以下のようにフェーズ分けしてます。

    * [x] Phase1. 予め決まった拠点(オフィス、家など)から、PCで開発環境につなぐ
![develop_with_remote.mkd-Page-1 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/703028ad-f147-3a4e-6ac3-c102de9d1cb1.png)


    * [ ] Phase2. 任意の場所から、PCで開発環境につなぐ
![develop_with_remote.mkd-Page-1 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/6241ee46-92e0-99e5-a694-57f32d111e00.png)

    * [ ] Phase3. 任意の場所から、任意の(自身の）端末で開発環境につなぐ
![develop_with_remote.mkd-Page-1 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/b9f202cb-f0ee-0419-53ec-ea0857973300.png)

    * [ ] Phase4. コスト最適化
       * ?

## この記事は
* 現在進行形の「ここはこうしよう」、「ここはこうしようかな」というメモを晒している記事です。
 
## 構成設計・調査メモ
* 選定した内容、選定した意図、簡単な比較、設定内容など

### 構成: Phase1
![develop_with_remote.mkd-Page-1 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/703028ad-f147-3a4e-6ac3-c102de9d1cb1.png)

* 概要
  * 普段の開発環境から、開発用サーバ(docker)とVSCodeのCPU負荷をEC2に追い出すことができた
  * コスト: 月$20ほど
  * インフラ: 主にAWS(Route53,EC2など)を使用
  * IDE: VSCode Remote Development
  * 独自ドメイン
  * 通信を暗号化(SSH/HTTPS)

#### リモートサーバ
* 必須条件
  * SSH可能 -> Linux
  * 公開できる -> ドメイン繋げられる(HTTPS)
* 歓迎条件
  * コストを抑えられる、抑える手段がある
* 結論: [AWS EC2](https://aws.amazon.com/jp/ec2/)
        <img width="100" alt="vscode_remote.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/cebe00f3-141b-9325-26a6-5d9b545830e1.png">
      * 必要なときは性能のスケールアウトが可能
          * ただし一旦停止は必要
      * [spot instance](https://aws.amazon.com/jp/ec2/spot/)でコストを抑えられる
          * vCPU:2,Mem:4GB (t3.medium)で 月大体$15ほど
            * (インスタンス稼働コスト+ストレージなど諸費用)
      * この記事を書いた人が慣れているため
            * 仕事でAWS使ってる人多いすよね。。。

* 他の選択肢
    * クラウド系
        * GCP,Azureなど
    * VPS系
        * [さくらのVPS](https://vps.sakura.ad.jp/?_ga=2.121074191.663258866.1601172065-1570300779.1601172065)など
* 設定内容
    * [x] security groupの設定
        * HTTPS: 「マイIP」で予め決まった拠点(オフィス、家など)のIPアドレスを設定する
        * SSH: 「マイIP」で予め決まった拠点(オフィス、家など)のIPアドレスを設定する

#### リモート開発環境
* 必須条件
    * コードの編集・実行ができる
    * クライアントとサーバが暗号通信すること
* 歓迎条件
    * プラグインが豊富で活発
    * ブラウザだけで動くと尚良  
* 結論: [VSCode + Remote Developmentプラグイン](https://code.visualstudio.com/docs/remote/remote-overview)
<img width="100" alt="vscode_remote.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57898/062eabd7-ad62-0e2c-3a2a-b89b66379f00.png">

      * VSCodeはいわずもがな2020年のサーバサイド開発のスタンダードになってるIDE
      * Remote DevelopmentはSSHした先のLinuxサーバ上でIDEを実行できる機能
* 他の選択肢
    * WebIDE系
        * [AWS Cloud9](https://aws.amazon.com/jp/cloud9/)

#### 暗号通信
* 必須条件
    * WEBへアクセスできること(HTTPS)
    * SSH
* 歓迎条件
    * 手間を書けたくない
    * コスト抑えたい 
* 結論
    * freenom(独自ドメイン) +　Route53(DNS) + Caddy(HTTPS Webサーバ)
        * [freenom: 無料ドメイン](https://www.freenom.com/ja/index.html)
            * 特定のTLDなら無料でドメインが取れる
            * Ref: [freenomでドメインの取得](https://qiita.com/hanbaga324/items/da0c4f6fa8d365db10c9)

              > 1 .tk オーストララシアにあるニュージーランドの領土であるトケラウ
              > 2 .ml マリ
              > 3 .ga ガボン
              > 4 .cf 中央アフリカ
              > 5 .gq 赤道ギニア
        * [Route53](https://aws.amazon.com/jp/route53/)
            * ドメインのDNS管理
            * 実質ほぼ無料
        * [Caddy](https://caddyserver.com/)
            * Web サーバー
            * ドメインがあれば自動でHTTPS通信になる
              * [簡単にSSL証明書を取得可能＆シンプルな設定ファイルでHTTP/3も利用できるGo製ウェブサーバー「Caddy」！](https://gigazine.net/news/20200510-caddy/)
            * [basic 認証設定可能](https://caddyserver.com/docs/caddyfile/directives/basicauth)
* 他の選択肢
    * VSCodeのポートファワーディング
        * Ref: [VSCode Remote Development + SSHトンネルで安全なWebアプリケーション開発](https://qiita.com/miyanaga/items/9680e9a846da2e725b56)
        * 開発をポートフォワードが自由に行える環境:PCだけで行うのであれば構わないが、  
        iPadなどのモバイル端末ではこの手法が使えない
    * AWS ALB + AWS Route 53
        * [Route53+ACM+ALB+EC2でHTTPS接続するまで](https://qiita.com/m-kazu/items/aa44789f9183f5a61104)
        * 高い: ALBだけで月$25ほど

#### [WIP] VPN
* 必須条件
    * クライアントの通信内容を全て暗号化したい
    * 新しい場所:新しいIPから接続するときに、ファイアウォール(SecurityGroup)をいちいち追加・削除したくない
* 歓迎条件
    * 動作・通信速度が早い 
    * スマホ、タブレットなど様々な端末でも接続可能
        * 例: iPad/android/ChromeOS
* 調査
    * wireguardが良さげ
      * 動作・通信が早く、インストールが簡単らしい
          * [第614回　WireGuardでVPNサーバーを構築する](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0614)
      * Mac/Windows/Linux/iOS/Androidに対応
          * https://www.wireguard.com/install/
          * ChromeOSはAndroid用アプリが使えるらしい
              * [Add docs that cover using Wireguard from ChromeOS](https://github.com/trailofbits/algo/issues/1329)

#### [WIP] いつでも開発するために
* 必須条件
    * Windows/Mac/ChromeOS/Android/iOSで稼働すること
* 歓迎条件
    * ブラウザのみで稼働する
        * OculusQuestとか独自カスタマイズ系のOSでも開発できると嬉しい

* 調査中
    * VSCode Onlineに「開発環境サーバ」をSelf-hosted環境としてつなぐ
        * [「Visual Studio Online」をSelf-hosted環境で使う](https://qiita.com/naitwo2/items/d12c218b02a50ae89eda)
            * △: サーバにVS Code自体のインストールが必要
                * デスクトップ環境(Gnome/LXDE)のインストールが必要
            * △: VSCode Online(codespaces)が GitHub Codespaceに統合されるようで、先行きがよくわからない 
                * [マイクロソフト、WebIDEの「Visual Studio Codespaecs」を「GitHub Codespaces」に統合へ](https://www.publickey1.jp/blog/20/webidevisual_studio_codespaecsgithub_codespaces.html)
    * [code server](https://github.com/cdr/code-server)
        * サードパーティ製のVSCodeをWebサーバ化したもの
        * △: 使えるプラグインが限定される
          * Visual Studio Intellicodeとか使えない

#### [WIP]起動していないときにサーバを止める
* herokuみたいなことをしたい
    * 「踏み台サーバ」へSSH portfowardingの接続要求が発生
    * 認証完了
    * 「踏み台サーバ」は「開発環境サーバ」を起動する
        * 30秒ぐらい？
    * 接続する