クラウド環境での Linux を利用した開発のすすめ


ここ1年ほど、仕事での開発環境をクラウド上に起動しているインスタンス上で行うようにしています。 結構使い勝手が良く個人的にはみんなそうすればいいのに〜と思っているので自分の思う所感などをまとめておこうかと思います。

前提条件として私は主にバックエンド開発を行うエンジニアでスマートフォンのアプリケーション側の開発や Unity などをはじめとするゲームクライアントの開発 に関わっているわけではないのでその辺の開発の方には適さないかもしれません。

良い点

良いなと思う点としては以下のあたりが挙げられます。

  • CPU、メモリをはじめとするリソースを自在に変化させることができる
  • クラウド内のネットワークが非常に安定で高速
  • 本番環境は Linux なので Mac 特有の謎の悩みに頭を抱えなくて済む
  • ラップトップマシンの切り替えが非常に簡単

CPU、メモリをはじめとするリソースを自在に変化させることができる

クラウド環境なので、ラップトップなど会社から支給されるマシンの制約に縛られず開発を進められます。 わたしは Elixir という言語で開発を行なっているのですがコードベースが大きくなるにつれてコンパイル時間が大きくなり、また手元のラップトップのファンが回り続け、開発が苦しいということが多々ありました。 こういうとき、ささっと CPU やメモリの割り当てを増やすことでコンパイル待ちの時間を短縮したり、テストを手元ですぐ動かしたりとイライラさせられずにすむようになりました。 また昨今のリモートワークなどで手元で、カメラをオンにしたリモート会議などをしていると意外とマシンのCPUなどを食い潰すことなどがありましたが開発のための CPU 使用などをリモートに追い出せるのでサクサク、キビキビ動くのでストレスなく仕事に集中できるのも大きなメリットです。

クラウド内のネットワークが非常に安定で高速

自宅のネットワークも光回線を契約していますがおおよそ日中は下り 100 Mbps 程度です。 時折大きなコンテナイメージや仮想マシンのイメージなどをダウンロードするときに非常に高速にダウンロードできるので快適です。 ちなみにわたしは GCP のインタンスを使用しているのですが、おおよそ下り 1.2 Gbps 程度は出ているようです。

本番環境は Linux なので Mac 特有の謎の悩みに頭を抱えなくて済む

よくあるのが Coreutils の挙動やオプションが BSD と GNU/Linux で異なり、Mac では動くのに Linux 環境だとなんかうまく動かない! などの問題です。 さらに Mac 環境特有であるとすれば、Docker for Mac のディスクボリュームマウントしたディスクアクセスが非常に遅い問題や、そもそも M1 Mac によるアーキテクチャ変更による問題、直近であれば Docker for Desktop 有料化のニュース 名どの影響があるでしょうか? この辺の問題にも特に影響を受けないというのもいい点だと思います。 さらに ARM マシンが開発で必要であれば AWS であれば Graviton プロセッサーが動くインスタンスを採用すれば解決できるというところもあります。 このように開発の本質ではない余計な問題 (主に Mac だけど、Windows でもあるかもしれない) に頭を抱えなくて済むのは非常に平和的です。

ラップトップマシンの切り替えが簡単

これも今回クラウド環境に切り替えて感じたことなのですが、支給されているラップトップマシンの切り替えが非常に楽になりました。 今までだとまず、開発環境を構築するために必要なツールをインストールして (場合によってはソースコードからビルドする必要などもある)、データなどを移行して、その他必要なツールなどをインストールして… と半日程度構築にかかってしまいましたが、クラウド環境に開発環境があれば SSH とエディタだけインストールすればとりあえず OK なレベルで切り替えられるようになりました。 この辺は GitHub のエンジニアリングチームが Codespaces に開発環境を移行した話と似ているかと思います。

悪い点

今の所、そこまで悪い点や困っていることないんだよなぁ… という気持ちです。何かあったら追記します。

現状どのような感じで使用しているのか

現状わたしのインスタンスの構成は次のようになっています。

  • クラウドプロバイダ: Google Cloud Platform
  • リージョン: 東京
  • インスタンスタイプ: e2.custom (CPU 10コア、メモリ 10G) (プリエンプティブルインスタンス)

インスタンスコストですが、1日10時間稼働で週5日動かすとするとおおよそ1月あたり、ディスクを含めても $40 ほどです。参考 そこそこ高性能なインスタンスでもプリエンプティブルインスタンスを採用することでコストを下げることができています。 ただしときおり開発中にインスタンスが停止されてしまうため一時的に SSH などが切れてしまうのがちょっと大変なのでお金に余裕があるのであればスタンダードでもいいかもしれません。 また、私の居住地域に合わせて東京リージョンでインスタンスを立てていますが、開発用途であればどこでも問題ないと思うので、アメリカのリージョンなど安い地域に立てることでコストの圧縮などができるかもしれません。

あとはインスタンスの適当なポートを適当にローカルマシンにポートフォワーディングしています。 こうすることで SSH セッションに適当な TCP 通信をフォワードさせることができるのであたかもローカルにあるリソースにアクセスするような形で開発環境にアクセスでき、ほとんど変わらない形で利用できます。

その他 (セキュリティの問題など)

現状、この環境はチーム内で自分とあともう一人のエンジニアしか使用していないため、各々の良心に任せて運用していますが実際にチームで運用するにはいろいろなことを考慮しないといけないと思います。わたしが思いつくだけでも、

  • VPC を切り分ける (開発環境にはアクセスできてもいいかも…?)
  • 余計なポートを解放しない
    • GCP の場合は SSH の前に IdP を噛ませられますし、AWS なら直接 SSH するのではなく Session Manager を噛ませるとよいでしょう。
  • ソフトウェア、カーネルのアップデート
  • ウイルス対策 (このへんは不要かもしれませんが、エンタープライズグレードになると求められるかも?)
  • 監査ログ
  • 他人のインスタンスに管理者以外がログインできないようにする

などなど、いろいろあるでしょう。とはいえ今のラップトップ環境でも実現できていなそうな項目もありそうですが…. この辺など企業で全体的に導入している人たちなどがいたら事例があれば見てみたいですね。

まとめ

こんなわけでわたしの現在の開発環境についてまとめてみました。 もちろんチーム内や会社に対して稟議を通さないと使えないとかいろいろあるかもしれませんが、非常に得られるメリットも多いのでぜひ検討してみるとよいかもしれません。