Google Cloud Shellを使う前にやっておきたいこと

## Google Cloud Shellを始めよう

クラウドコードエディタ[Code OSS](https://cloud.google.com/workstations/docs/base-editor-overview?hl=ja)など、すぐにWebアプリなどの開発が始められる環境が整っている、とても便利なGoogleの開発者向けサービス。それがGoogle Cloud Shellです。

https://cloud.google.com/shell?hl=ja

無料で使えるGoogleのクラウドでの開発環境としては[Google Colaboratory](https://colab.research.google.com/)が、より広く知られているサービスかと思われますが、Cloud Shellでも、同等といってよい使い方が可能で、個人的によく使っています。

## なぜCloud Shellを選ぶのか

メリットは何といっても、ユーザーディレクトリに保存したデータ終了時に削除されずに、永続化しておけることでしょう。`pip`や`npm`のパッケージやShellの個人設定ファイル、ソースコード、テキストや画像データなど、容量の許す限り好きなものを保存しておけます

一週間のうち60時間までという利用時間の制限や、120日間以上アクセスせず放置しておくと、HOMEディレクトリ配下のデータがすべて消去される、不定期に強制的にシャットダウンされることがある、といった注意点はありますが、無料でこれだけユーザーに高い自由度を許容されているサービスは他ではまず見かけません。

## 使用上の問題点と改善方法
 
問題はそのユーザーに割り当てられているディスク容量のサイズでしょう。下記のように最大で4GBほどが上限となっています。

![Home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/1e0289f1-63bd-f782-df72-5f669596ef73.png)

Google Colaboratoryのように使う場合は、[Jupyter Lab](https://jupyterlab.readthedocs.io)のようなアプリもユーザーディレクトリ配下にインストールしなければなりませんので、ディスク領域の確保は切実な問題です。

ディスクの使用量を削減するためには様々な工夫が必要ですが、まずはCloud Shellの日本語化を行うことをお勧めします。日本語ロケールはシステムにインストールするため永続化できず、システムを起動するたびに再インストールが必要です。

ユーザーディレクトリ直下に`.bash_login`という名前でファイルを作成し、以下のコードを設定しておけば、自動的にインストールするように出来ます。

```shell:.bash_login
locale --all | grep --quiet ja_JP.utf8
if [ $? -ne 0 ]; then         
   sudo localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8 -v 2>/dev/null
fi
export LANG=ja_JP.UTF-8
```

インストールのオーバーヘッドはそれほど大きくないので、この対応で問題無いでしょう。

では本題のディスク容量対策ですが、`df`コマンドの結果で判るように、大容量のディスクサイズが割り当てられていて、空き容量が多い、homeディレクトリより上位の永続化されないボリュームを活用することで実現します。

![Root.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/549a4bbd-d799-34ed-65a0-b2d6b8278ffd.png)

この領域のデータはシステム終了時に消去されますが、前もってクラウドストレージ／ドライブへ退避しておくことも出来るので、十分実用的といえます。

## 作業用ディレクトリの作成

まずはGoogle Colaboratoryでよくあるデータ分析を行う際、一時的に大きなサイズのファイルを読み込むための手段ですが、下記の例ようにhomeディレクトリより上位に任意のディレクトリを作成し、ユーザーが書き込めるようにパーミッションを変更する処理を、`.bash_login`ファイルに追加しておきます。

```shell:.bash_login
if [ ! -d /var/work ]; then
  sudo mkdir -v /var/work
  sudo chown -Rc $USER:$USER /var/work
fi
```

この例ではシステム起動時に/var/workディレクトリが自由に書き込み出来るように準備され、色々な目的で大きなサイズのデータも扱うことが出来るようになります。

この領域に例えばデフォルトで利用可能な`gsutils`コマンドや、テキストベースのユーティリティが提供されている[MEGA](https://mega.io/ja/cmd)や、多様なサービスに対応する[RCLONE](https://rclone.org/)などにより、データを取り込んでJupyter Labで分析したり、[GitHub](https://github.com/)からリポジトリをクローンして、ビルドした成果物をユーザーディレクトリに保存しておく、といった利用方法が考えられます。

## キャッシュデータ対策

さらに重要なのは、意図せずディスク容量を消費される、パッケージマネージャなどのキャッシュデータに関する対策です。キャッシュにはそれなりの効能はありますが、使っているうちに肥大化していきますし、貴重なディスク容量を使ってまで永続するほどのものではないと思います。

まずは典型的なものとして`pip`、`npm`の対策として、やはり`.bash_login`に下記を追加します。

```shell:.bash_login
if [ ! -d /var/cache/pip ]; then
  sudo mkdir -v /var/cache/pip
  sudo chown -Rc $USER:$USER /var/cache/pip
fi

if [ ! -d /var/cache/npm ]; then
  sudo mkdir -v /var/cache/npm
  sudo chown -Rc $USER:$USER /var/cache/npm
fi
export npm_config_cache=/var/cache/npm
```

その上で`pip`コマンドの設定ファイル`pip.conf`をホームディレクトリ直下の`.pip`ディレクトリ内に作成し、以下設定で保存します。
```conf:pip.conf
[global]
cache-dir=/var/cache/pip
```
この設定により、システムが起動してから終了するまでに取得したキャッシュデータは有効となります。
その他のパッケージマネージャを利用する場合も、個別に同様の対策を実施することにより、ディスク容量の確保を図れます。

## 個別のアプリケーションでの対策

Cloud Shellでファイルの整理などをする場合は、デフォルトでインストールされている[Midnight Commander](https://midnight-commander.org/)が便利です。

個人的にはとてもよく利用するので、キャッシュ対策は必須です。サイズの大きい圧縮ファイルを展開する際にも一時ファイルがキャッシュされるので、ユーザーディレクトリの空き容量が不足していると開けなくなったりします。
こちらにはキャッシュディレクトリを任意に設定できないので、シンボリックリンクにより問題を回避します。

```shell:.bash_login
if [ -d ~/.cache/mc ] && [ ! -h ~/.cache/mc ]; then rm -rfv ~/.cache/mc; fi
if [ ! -d /var/cache/mc ]; then
  sudo mkdir -v /var/cache/mc
  sudo chown -Rc $USER:$USER /var/cache/mc
fi
if [ ! -d ~/.cache/mc ]; then ln -sv /var/cache/mc ~/.cache/mc; fi
```

クラウドストレージ／ドライブで提供されているユーティリティには、仮想ドライブとしてマウントする機能を備えているものもあるので、こうしておけばクラウドストレージ／ドライブの大容量のファイルの整理のためにも活用できるようになりますが、注意すべき設定項目があります。

メニュバーのオプション(O)→設定(C)で開ける設定オプション画面の「File Operations」グループに「Preallocate space」というチェックボックスが有ります。

![commander.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/964026d4-6c3e-7e99-aad6-7fd99db4661c.png)

この設定の働きに関しては英語表示なので推測も含みますが、ファイルのコピーを行う際、事前にコピー先にコピー元のファイルと同一サイズのダミーのファイルを作成することにより、コピー先のディスク容量が不足しないか確認し、不足する場合は作業を中断する機能のようです。

当然クラウドストレージ／ドライブにはこのような機能に対応できないため、コピーなどを実行するとエラーで失敗となります。
下記はチェックボックスをオンにした状態で、MEGAのドライブをマウントした状態でファイルをコピーしようとした際に表示された画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/0448f8e7-f472-a9a8-81fd-ff4e3488b24a.png)

エラーを回避するためには、チェックを外してこの機能を無効に設定しておけば大丈夫です。ここまでしておけば、数ギガバイトのデータを一括でクラウドにコピーしたりすることも可能となりましたが、Cloud Shellには強制シャットダウンというリスクもあるので、1GB程度までに振り分けて作業した方が無難ではないかとは思います。

## 終わりに

以上、Google Cloud Shellを快適に利用するための最低限の準備の方法を解説させていただきましたが、これを機に使ってみようと興味を持っていただけたら幸いです。