個人の開発環境を全てクラウド上 (AWS Cloud9とGithub Codespaces) に移行してみた

# はじめに
- **個人開発をする環境として、ローカルPCを使うのを止め、全てクラウド上に移して**数年経ちました。
- 現在は、主に[AWS Cloud9](https://aws.amazon.com/jp/cloud9/)と[Github Codespaces](https://github.co.jp/features/codespaces)を使っていますが、自分が使ってみたいくつかのサービスの使用感などを紹介します。

（なお、用途としては、Pythonを使って簡易アプリ作成やデータ分析をしていました）

# なぜクラウド
色々と良いところがあると思っています。
- 物理端末に依存しないので、**ネットさえつながれば、どんな場所からでも同じように使える**（自分のMac PC, Windows PC, iPad, etc..）
- 自分の物理端末がハイスペックでなくとも、必要なときに必要なだけ高スペックなマシンを使うことができる
- ウン十万円する良いマシンを自前で買うより、長期的に見たら（多分）安い
- 環境構築失敗して意味不明になったら、環境潰して新たにインスタンス立てればいい
- 実際に自分でクラウドサービスを色々なユースケースで扱うと、仕事においても役立つ

# 試したサービスたちと感想
各サービスの導入の手順などの詳述は別記事にゆずって、フワッと概要、感想、料金体系などを書いていきます。
## [AWS Cloud9](https://aws.amazon.com/jp/cloud9/)
### 概要
Cloud9は、AWSが提供するElastic Compute Cloud (EC2)インスタンス（仮想マシン）で動く開発環境です。

AWSのアカウントを持っていれば、マネジメントコンソールでCloud9を探して、すぐに環境を作成できます。
![スクリーンショット 2023-09-12 201438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/f398d59a-3305-b241-8937-c078be3568c9.png)
実際にやっていることは開発環境がくっついたEC2インスタンスを立ち上げるということなので、Cloud9の環境を作成する際に、EC2インスタンスの詳細も選べます（通常のEC2インスタンスと同様に後からも変更可能）。

UIはこんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/590238f8-fbb5-a550-525b-2977811465e7.png)
自分は、GithubからリポジトリをCloneしてきて、もろもろ開発に使っています。

Cloud9で環境を作ると、EC2インスタンスが作られているのがダッシュボードからも分かります↓
![スクリーンショット 2023-09-12 203348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/81c9e50c-b441-604f-e166-5186f78aeced.png)

### お気に入りポイント
- あくまでEC2インスタンスなので、インスタンスタイプ、ストレージ、VPC、IAM Roleの設定などを自由自在に行うことができるところ

そのときの作業内容の必要に応じてスペックを変えることも容易ですし、開発環境でありながら、やろうと思えばサーバーとしても使えます。
※外部サービスとの通信等をする場合は、通常のEC2インスタンスと同様、セキュリティグループの設定とかもろもろは必要

その時々でやりたいことや必要なものは色々と変わるので、柔軟に色々変えられるのが便利です。

### いまいちポイント
- Visual Studio Codeではないところ（当たり前だけど）

（自分が使いこなしていないだけですが）UIやデバッグなどの諸機能については、VSCodeほど良くはないと思います。
VSCodeの拡張機能があるのが当たり前になっている人も多いと思いますが、それらは使えません。

とはいえ、単にコードを書いて実行確認して云々、という趣味開発レベルで特に不満と思ったことはなかったです。

### 料金
[**Cloud9自体には料金はかかりません。**](https://aws.amazon.com/jp/cloud9/pricing/)
課金対象は、Cloud9の環境を立ち上げている時間（＝EC2インスタンスの起動時間）、EC2インスタンスにくっつけているストレージ（Elastic Block Store (EBS)）、データの転送など、**基本的なEC2の使用分**となります。

また、連続でX分操作しないとインスタンスを止める、といった設定が初めからできるようになっていて（デフォルトは30分）事故防止機能もあります。

諸条件で費用は変わるので目安ですが、自分は下記の条件でCloud9を使っていて、\\$5～\\$10/月くらい（下図参照）でした。
- インスタンス：t3.medium
    - pytorchで推論するのにt2.microだときつかったため
- EBS：30GB（デフォルトは8GB）
    - pytorchをinstallしようとすると、8GBだときつかったため
- 使用頻度
    - ムラはあるが、平日は仕事の前後に1時間使ったり使わなかったり。休日も同様に、予定がない日に4~5時間使う感じ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/b033b155-5993-8941-24dc-cb391b5c68f8.png)

EBS（EC2の料金の中に入っている）代は、インスタンスを立ち上げるか否かに関係なく、確保している容量に対してかかるので、それ以外の変動がEC2を立ち上げている時間によるものです。

Simple Storage Service (S3) はCloud9と直接的には無関係ですが、諸々のデータ保管先としてS3を使っているので関連費用と言えるでしょう。

全てをクラウド上で完結させようとする場合、作業で使うデータを全てEBSに入れたりすると高いので、結局何らかのストレージサービスを使う事になると思います。

※SagemakerもCloud9と無関係です。GPUを使った学習をする際に利用しました。

## [Github Codespaces](https://github.co.jp/features/codespaces)
### 概要
Github Codespacesは、Githubが提供する開発環境であり、**Webブラウザ上でVSCodeが使えます**。

Githubのアカウントで"Your codespaces"に進み、リポジトリを選んでいくつか簡単な設定を決めるだけで開発環境が立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/5e6e33cf-1017-de2a-2449-ba1cdc819453.png)
環境に入ると、選んだリポジトリ・ブランチがクローンされていて、作業やコードの実行ができるようになっています。
Githubから環境を作っているので、リモートリポジトリであるGithubと開発環境間で認証の設定などをすることなく、pushが行えますし、普通のVSCodeと同じように拡張機能も入れられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/fb015fd6-ef95-7a49-0a6a-ba3f9df2648b.png)
仮想マシンのスペックは2023/9/14現在、4種類から選ぶことができます（詳細は[公式のページ](https://docs.github.com/ja/codespaces/customizing-your-codespace/changing-the-machine-type-for-your-codespace)を参照してください。）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/3f0d5f78-d629-cc71-dd4a-c11a879d419c.png)
一方で、公式のFAQでも、個人向けプランの条件は変更されうることが書かれている（2023/09/14）ため、今後様々な状況が変わりうることに注意してください。
特に料金周り（後述）や使えるリソースなどは頻繁に変わるのでは、と思っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/d0e906ef-7961-e279-e890-3d5079b8a103.png)

### お気に入りポイント
- **なんといってもVSCodeがWebブラウザで使えるところ**

業務でも多くの人々が使っているデファクトスタンダード的なエディタだと思うので、このポイントだけで非常に素晴らしいと思っています。

また、リポジトリごとに環境を作ることになるので、プロジェクト間で設定が干渉することを気にする必要もありません。

環境を極めて少ない手順で簡単に立ち上げることができ、必要な拡張機能やパッケージを好きにインストールして開発してGithubにpushできる、という非常に便利なサービスだと思っています。

### いまいちポイント
特にないです。強いて言えば、
- インスタンスとしての実体を扱えるわけではないところ

Cloud9のようにインスタンス自体を自分でコントロールして色々と使うといったことはできません。
しかし、そもそもそれは開発環境に求めることではないでしょうし、最終的に何かデプロイするときは別途サーバーを調達などして対応すればよいので、開発環境の良し悪しの観点では無関係かもしれないです。

### 料金
※**逐次情報や設定が変更される可能性があるため、各時点における詳細は[公式ページ](https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces)を確認してください**。

個人用では、**毎月、ある一定のリソースまでは無料で、それ以降は料金がかかります**（下はある日の自分の断面）。
![スクリーンショット 2023-09-14 164133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554168/d0527641-e95f-9a9c-2866-f1e514c164e9.png)
- **Usage hours**
    - `立ち上げた環境のコア数 × 立ち上げた時間`です（単に環境を立ち上げている時間ではありません）
    - 例えばマシンタイプとして16コアのものを選択し、それを1時間立ち上げた場合は、それだけで16時間分が消費されます
    - もし、2コアを使う場合、1日2時間の作業を30日間は無料で行うことができる（`120 / 2 * 2 = 30`）ので、かなり良心的なのではと思っています。
    - 無料分の120時間を使い切ると、2コアのマシンの場合で、$0.18/1hourかかります（[参照](https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#pricing-for-paid-usage)）
    - なお、デフォルトでは30分間（変更可能）でタイムアウトするようになっているので、つけっぱなしにして、無料枠を使い切り、課金され続けるといったことは防げます

- **Storage** 
    - 月単位で、アカウントに存在する全Codespaceが使っている容量です（各Codespaceが立ち上がっているかとは無関係）
    - 例えば、合計で100GB分のストレージを使う期間が1時間存在した場合は、`100 × 1 / 24 × 30 = 0.1388`のGB-monthが消費されたことになります
    - 実データをCodespaces内に保持するような使い方をしてしまうとストレージはオーバーするかもしれないですが、そうでなければ重めのパッケージを入れない限りは大体無料枠内で完結できるかなと思います。
    - 無料分の15GB/月を使い切ると、1GB-monthに対して、$0.07がかかります（[参照](https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#pricing-for-paid-usage)）

## [SageMaker Studio](https://aws.amazon.com/jp/sagemaker/studio/)
※数年前に使っていて、最近は使用していないので情報が古いかも
### 概要
SageMaker Studioは、AWSの提供する機械学習のあれこれができるSageMakerの各サービスを便利にまとめて使えるようにしてくれている環境です。

環境を作成し、起動すると、JupyterServerが立ち上がり、Elastic File System (EFS)が作成されます。
そのJupyterServerから、KernelGatewayなる機械学習を行うためのコンテナを起動させるような構造になっています。
アーキテクチャについては、[こちらの方](https://qiita.com/ishidahra/items/41132cb9ff1f2b838236)が詳しく解説いただいていました。

Kernelには様々な種類（基本的なEDAをするもの、Pytorchを使うためのもの、Tensorflowを使うためのもの、、）があり、それらの中から用途に合ったものを選ぶことができます。
スペックも自由に選べます（vcpu、メモリなど）。

基本的にはNotebookを使って作業を進めるための環境ですが、terminalも使えますし、コードエディットもできるようになっています。 

### お気に入りポイント
（あまりない）

クラウド上でGPU環境を手にし、Notebookで学習回して試行錯誤しつつ、スクリプトを作成する、といったニーズに応えてくれるとは思います。
ただ、結構な値が張りますし、個人開発レベルだとGoogle Colaboratryで十分だと思いました。

### いまいちポイント
- 値が張る
    - 環境を作るとEFSが作られるわけですが、EFSは高価なサービスなので、下手に多くの容量を使うとかなりの固定費用になります
    - GPUを使うと、学習で何時間もつけっぱなしというわけでなくとも、1日で数百円は課金されるので、日常的に使うのは厳しいという感覚でした（Colaboratryで同じことが無料でできるわけだし）
- インスタンスの起動・終了が不安定な気がする
    - ちょくちょくかなり待たされた記憶があります
    - 一度、色々試しても起動ができなくなって作業内容が見れなくなってしまい、アタッチされているEFSを探して、新規に作成したEC2インスタンスにアタッチして中身を取り出したことがありました、、
    - （もちろん自分が意図せずいらんことをしていた可能性もあります）
- コードエディタとしての機能は最低限
    - そもそもエディタとして作っているわけではないと思うので当たり前ですが、エディタの機能は最低限（メモ帳みたいな感じ）だったので、コードを書くなら、Cloud9やGithub Codespacesの方が圧倒的にやりやすいです

### 料金
課金対象は、大きく分けて下記二つです
- JupyterServer
    - インスタンスの起動時間（ml.t3.mediumで6~7円/h）、EFS、データの転送など
- KernelGateway
    - どのようなスペックを使うかに依存して料金は大きく変わります。GPUを使うと当然だいぶかかります（100円以上/h）。
    
デフォルトで～分操作しないとインスタンスが落ちる、といった設定はなかった（もしくは何らかの設定を工夫してしないとダメだった）はずなのできちんと終了操作をしないと大変なことになります。

詳しくは[公式のページ](https://aws.amazon.com/jp/sagemaker/pricing/)を参照してください。

## その他関連サービス
### [Simple Storage Service (S3)](https://aws.amazon.com/jp/s3/)
AWSの提供するストレージサービスです。

これは開発環境ではないですが、ローカルPCでの作業を止めたと同時に、データをローカルに保存するのもやめたので、データ保存先として使っています。

先述の通り、Cloud9のEBSやCodespacesの環境下に大量のデータを保存するのは不便ですし、コスト的にも賢くないので、**全てをクラウド上で完結させようとする場合は、結局何らかのストレージサービスを使う事になる**と思います。

自分は、boto3を用いて必要な時に自分のバケットからデータを読み込んできたり、加工後のデータを保存したりしています。

## [Google Colaboratry](https://colab.research.google.com/?hl=ja)
データを扱っている方々なら誰もが知っているGoogleの提供する仮想マシン上で動くnotebookです。

Googleのアカウントを持っていれば無料でnotebookでデータ分析ができます。

無料プランではterminalを使う事が出来ないのと、コードエディタではないので、開発環境としては使えないですが、何といっても、**GPUを無料で使える**という素晴らしさがあります。

Cloud9やGithub CodespacesではGPUを使った学習などができないので、そうした必要がある場合は、都度こちらを使っています。

# まとめ
- 今回は、個人の開発環境をクラウド上に移した話を書いてみました。
- 自分の場合は、**基本的な作業環境としてCloud9やGithub Codespacesを使い、必要や各用途に応じて、S3やColaboratryを使う**スタイルになってきています。
 
みなさんの開発環境構築の参考になれば幸いです！