💾

GitHub Codespaces から GoogleDrive をマウントしファイルの永続化と共有

2022/06/09に公開

先日、順番待ちしていた GitHub Codespace を使えるようになりました[1]

早速ワクワクで GitHub Codespace を試しているのですが、ローカルでの Remote - Container に比べると「ボリュームの永続化が大変そう」な感じがしています。

そこで、Codespaces のコンテナ(Dev Container)内から Google Drive をマウントするための .devcontainer を作ってみました。

どのようにマウントするのか?

以下のリポジトリは google-drive-ocamlfuse を利用して Google Drive をマウントするための .devcontainer が含まれています。

この .devcontainer の内容を Google Drive をマウントしたい Codespace(リポジトリ) に組み込むと、認証情報を SECRET に設定するだけで利用できます。

利用方法

ここではサンプルのリポジトリを使ってマウントしてみます。

サンプルのリポジトリから Codespace を作成します(認証情報を扱うので、気になる場合はテンプレートから別のリポジトリを作成してください)。

図 2-1 リポジトリから Codespace を作成

ブラウザーでサンプルリポジトリを開き、Code メニューから Codespace を作成しているスクリーンショット

その後は認証の方法によって、「基本的な認証」「Service Accounts」のいずれかを行います。

標準的な認証

認証情報を取得するために、以下の記事などを参考にブラウザー経由で認証しマウントします(この操作は Codespace ではなく通常のデスクトップ環境で行っても大丈夫です)。

マウントすると ${HOME}/.gdfuse/<label 名> のディレクトリが作成されるので、configstate ファイルの中を確認します。

リポジトリ SECRET の Codespaces 用に以下を作成します(ユーザー SECRET でも動作します)[2]

  • GDFUSE_CONFIG - config ファイルの内容を丸ごとコピー
  • GDFUSE_STATE - state ファイルの内容を丸ごとコピー

図 2-2 SECRET にファイルの内容をコピー

Codespaces 用の SECRET に state ファイルの内容を貼り付けているスクリーンショット

作成後、Codespace を Rebuild(Reload ではないです)すると ${HOME}/gdrive に Google Drive がマウントされます。

Service Accounts

Drive API を有効化した GCP プロジェクトでサービスアカウントを作成し、gcloud iam service-accounts keys などで鍵ファイルを作成します。

リポジトリ SECRET の Codespaces 用に以下を作成します(ユーザー SECRET でも動作します)[2:1]

  • GDFUSE_SA - 鍵ファイルの内容を丸ごとコピー

図 2-3 SECRET に鍵ファイルの内容をコピー

Codespaces 用の SECRET に鍵ファイルの内容を貼り付けているスクリーンショット

作成後、Codespace を Rebuild(Reload ではないです)すると ${HOME}/gdrive に Google Drive がマウントされます。なお、サービスアカウントの鍵ファイルは ${HOME}/gd-sa-cred.json に保存されているので取り扱いには注意してください。

また、サービスアカウントを利用した場合「サービスアカウントのドライブ」がマウントされます。普段使っているドライブでファイルをやりとりしたい場合は、下記の gdrive などで共有することになります。

たとえば、Codespace で ${home}/gdrive/share フォルダーを作成し他ユーザーと共有する場合は以下のようになります。

図 2-4 gdrive の一時的なインストール(linux_386 を使う)

$ mkdir ~/tmp
$ cd ~/tmp
$ curl -sL https://github.com/prasmussen/gdrive/releases/download/2.1.1/gdrive2.1.1linux_386.tar.gz | tar -zxvf -

図 2-5 フォルダーの作成と gdrive による folder id の確認

$ cd ~
$ mkdir gdrive/share
$ ./tmp/gdrive --service-account gd-sa-cred.json -c . list
Id                                  Name                Type   Size      Created
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   share               dir              2022-06-08 09:33:42
# 実際は複数の項目が表示されます

図 2-6 folder id を指定し共有

$ ./tmp/gdrive --service-account gd-sa-cred.json -c . share --role writer --type user --email <mail address> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

これで共有が完了します。

この他、サービスアカウントの利用では制限の解除も必要になることがあるので、以下も参照してください。

サンプル画面

設定が完了すると以下のような感じでドライブ内のファイルを扱えます。

図 3-1 Google Drive に保存した画像を Codespace 側で参照

ブラウザー上で Google Drive と Codespace を表示し、それぞれで同じ画像ファイルを表示しているスクリーンショット

注意点

必要な権限

コンテナ内から fuse を使ってマウントするには(試した限りでは) --privileged が必要です。--cap-addSYS_ADMIN を指定した場合は fuse: device not found, try 'modprobe fuse' first となりました。

Ubuntu ベース

今回の .devcontainer は Ubuntu ベースのイメージでないと動きません。microsoft/vscode-dev-containers でも typescript-node などは Ubuntu ベースの variant がないのでエラーになります。

できれば対応したかったのですが、「Codespaces のデフォルトが Ubuntu ベースだったので個人用のイメージは Ubuntu に統一しようかな」ということでそのままになってしまいました。

レスポンス

マウントしたディレクトリのファイルを直接編集するような用途では少し厳しい印象です(Codespaces の Region 設定は automatically で試しています)。

おわりに

GitHub Codespaces のコンテナ内から Google Drive をマウントしてみました。

現状では以下のような用途で利用していますが、やはり「入力履歴を永続化できるのは非常に良い」です。

  • .bash_history などの入力履歴の永続化と Codespace 間での共有(別途記事にしました)
  • シークレットなどを含むファイルの配置

この他にもちょっとしたファイルのやりとりなどに利用できそうなので、自分が作るリポジトリでは使っていこうかと考えています。

脚注
  1. 我々は 3 年待ったのだ、とまではいかなくても 2 年近く待ちました。 ↩︎

  2. GitHub Actions のようにマスクなどを考慮する必要はなさそうだったので、ファイルを丸ごと貼り付けて echo で保存しています。 ↩︎ ↩︎

GitHubで編集を提案

Discussion