GCP cloudshellのすゝめ

はじめ

GCPにはcloudshellという無料で使えるterminal環境があります。
Gsuiteに加入していれば、社として共通のcloud terminal環境が作れるということになります。
cloudにterminalが存在することで、いつでもどこでも同じ環境で作業を行うことができます。
本記事では、このGCP cloudshellについて紹介します。

メリット

・terminalの引っ越し作業が今後起きない(はず)
 ・どのterminalからでも仕事ができる
・セキュリティ的には並の自作cloud terminalよりは強いはず
gnuとbsdの違いによるコマンドの差異に悩まされずに済む
ssh先はgcpの回線のため、sshさえできればその先の回線は圧倒的に速い
・sshfsを使えばLocalにmountできる
・Gsuiteを使ってる会社はみんなが特段の設定不要で使える

個人的には、貸与PCがmacなので「gnuとbsdの違いによるコマンドの差異に悩まされずに済む」のはとてもありがたいです。

デメリット

永続化されるのは$HOMEのみ(と書いてあるが、挙動的には/homeっぽい)
 ・aptを利用できるものの、aptでインストールしたソフトウェアは端末シャットダウンのたびに消える
  ・linuxbrewを使って回避できる
スペックがしょぼい
 ・ストレージが5GBしかない
  ・terraform providerが増えるとつらい
 ・boostモードというのがあり、スペックを一定時間ちょっと積める
GCPのステータスに依存する
起動が若干遅い
回線切れリスク
 ・tmuxを使って回避できる
 ・~/.ssh/config の設定で軽減できる(後述)
・logoutして1時間経つとシャットダウン
 ・tmuxも当然綺麗サッパリ

個人的には、terraformを扱うリポジトリが膨大であることから、ストレージが心許ないです。

また、CPU/メモリも充分ではないため、通常モードで何かをbuildするのはかなり辛いです

cloudshellへloginする

まず、Localのterminalにgcloud-sdkをインストールします。
以下のリンクを参考にインストールしてください。
PATHを通すのを忘れずに
https://cloud.google.com/sdk/install
https://cloud.google.com/sdk/docs/downloads-versioned-archives

次に、gcloudへloginします。
`gcloud init` を実行して、おおよそ以下の通り進めてください。

$ gcloud init

...

Enter configuration name. Names start with a lower case letter and
contain only lower case letters a-z, digits 0-9, and hyphens '-': // 任意の名称を設定する

You must log in to continue. Would you like to log in (Y/n)? // Enter押下し続行

Go to the following link in your browser:

https://accounts.google.com/o/oauth2/auth?........ // ブラウザにコピペして、任意のアカウントでログイン

Enter verification code: // ブラウザに表示されたコードをコピペ

You are logged in as: [hogehoge@foobar.com].

Pick cloud project to use: // 適当に選ぶ

最後に、LocalのterminalからGCP cloudshellへloginします。
`gcloud alpha cloud-shell ssh` を実行してください。​

$ gcloud alpha cloud-shell ssh

...

データの引っ越しとscp

これまで使っていたterminalから引っ越すにはどうすればいいでしょうか?
`gcloud alpha cloud-shell scp` とすることで、SCPを利用できます。
https://cloud.google.com/sdk/gcloud/reference/alpha/cloud-shell/scp

// local
$ gcloud alpha cloud-shell scp

...

ただし、ファイル個数が多いディレクトリを転送するのはかなり遅いので、アーカイブにして転送しましょう。

// local
$ find local_git_dir -maxdepth 1 -type d \
	| xargs -I {} sh -czip -r {}.zip {}” 

$ find local_git_dir -name "*.zip" -type f \
	| xargs realpath \ 
	| xargs -I {} \
		gcloud alpha cloud-shell scp \ 
			localhost:{} cloudshell:cloudshell_git_dir 

jupyterとport forwarding

データサイエンティストに人気のjupyter notebook / jupyter labを利用する場合はどうすればいいでしょうか?
`gcloud alpha cloud-shell ssh` に引数を与え、port forwardingを行うことができます。

cloudshellとlocalで、それぞれ以下のコマンドを実行します。

// cloudshell 要jupyter install
# jupyter notebook --ip=0.0.0.0 --port=8888
// local
$ gcloud alpha cloud-shell ssh --ssh-flag \
	"-NL 8888:localhost:18888"

sshには、任意のコマンドを実行するよう引数を与えることもできますが、
インタラクティブシェルではない場合、cloudshellにデフォルトで配置されている `~/.bashrc` は全て読み飛ばされることに注意してください。

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
 
...

回線切断対策

sshの設定を変更することで、回線切断を軽減することができます。
`~/.ssh/config` に以下を追記してください。

ServerAliveInterval [秒数]
ServerAliveCountMax [回数]

使ってみての感想

上記に記載したbashrcの問題などの挙動を考慮しなければならないため、そこまで使い勝手がいいものではありませんでした。
一方で、tmuxなどの導入など勉強になることはたくさんあるので、お手軽に作って壊すterminalとしては良いかもしれません。

また、cloudなので落ちるときは落ちます。
とは言え、Localも壊れるときは壊れるので、どっちのほうがきついのかは天秤にかけて考えるしかなさそうです。。

あと、ストレージが5GBは本当に厳しいです。
GCPと連携してストレージを増設とかできれば良いかもしれません。

そして、今日もより良いterminal環境を求めて、僕たちの旅は続きます。
to be continued...?

皆様のサポートが励みになりますのでどうぞよろしくお願いします...!