Ubuntu DockerからGoogle Driveをマウント

0) はじめに

LightsailでWebサイトを運用していてストレージが不足してきたので、ストレージを追加しようと計画していていろいろ調べていましたが、Lightsailのstorageは割高感があり、S3も調べましたが、料金体系が複雑で、試算しているとけっこういい値段になります。Google Driveは100GBで200円程度で、トラフィック量など複雑なことを考えずにすむので、とりあえず試してみようと思いました。

ここで問題はグラフィックコンソールがあるUbuntu DesktopからGoogle Driveをマウントする方法はたくさん紹介されていますが、Lightsailはheadless(グラフィックコンソル / X端末がない状態)で運用しておりそれらの方法が使えません。ここではheadless(グラフィックコンソル / X端末がない状態)でubuntuからGoogle Driveをマウントする方法を紹介します。
さらに、WebサイトはDockerを使って立ち上げているので、UbuntuのDocker ImageからGoogle Driveをマウントする方法を紹介します。

1) Google API設定  Client ID / Client Secretの取得

UbuntuからGoogle Driveをマウントするには"google-drive-ocamlfuse"を使用しますが、"google-drive-ocamlfuse"をheadless/グラフィック端末無しで使用するには通常のGoogle Accountによる認証ではなく、Google APIのclient ID/client secretを用意する必要があり、これらを初めて使う人には少し複雑な作業です。

Google APIのclient ID / client secretはGoogle Developer Consoleから取得可能で、このページにGoogleアカウントを使用してログインします。

a) プロジェクトの作成

no title

まず最初にプロジェクトを作成します。(既存のプロジェクトを使うのでも問題ないです)
Google APIコンソールの左上にあるプロジェクトをクリックすると新しいプロジェクトを作成するボタンがでますので、プロジェクト名を決めて新しいプロジェクトを作成します。

b) 認証情報の作成 → oauth同意画面を設定

1
次に左のメニューの"認証情報"を選択し、"+認証情報を作成"をクリック、"OAuthクライアントID"を選択
  1. 左のメニューの"認証情報"を選択
  2. +認証情報を作成"をクリック
  3. OAuthクライアントID
2
初回は"OAuth同意画面"の設定に行くことになります。
3
この画面が出たら、"外部"を選択します。

c) OAuth同意画面の設定

4
アプリケーション名を入力し、スコープでGoogle Driveを追加する
5

Google Drive APIをスコープに追加
6



  • Google Drive内のすべてのファイルの表示
  • Google Drive内のファイルのメタデータの表示
  • Google Driveのファイルのメタデータの表示
をチェックし、Scopeに追加します。

d) 認証情報の作成 

7
次に認証情報を作成します。もう一度"+認証情報を作成"をクリックします。

8
"デスクトップアプリ"を指定します。

e) client ID/ client secret取得

これでClient ID/ Client Secretが取得できました。

9

2) "google-drive-ocamlfuse"でマウント

a) google-drive-ocamlfuseのインストール

まず最初に下記コマンドを実施し、必要なモジュールをインストールします。
sudo apt-get -y install software-properties-common
sudo add-apt-repository ppa:alessandro-strada/ppa
sudo apt update
sudo apt -y install google-drive-ocamlfuse

b) google-drive-ocamlfuseの実行

インストールができたら下記のようにコマンドを実行しGoogle Driveをマウントします。
google-drive-ocamlfuse /MOUNTPOINT -headless -id YOURID.apps.googleusercontent.com -secret YOURSECRET
MOUNTPOINTはマウントしたいディレクトリを指定、-idと-secretは先ほど取得したclient IDとclient secretを指定します。

初回は下記のようにURLが表示されて、verification codeを入力するように求められます。
10
このURLをコピーし、PCのブラウザからURLを開き認証を実施します。コードが表示されるのでコピーし、入力します。認証がうまく通らない場合はAPIコンソールで登録したアプリケーションの種類などを見直してください。"デスクトップアプリケーション"になっていることが前提です。
11

3) DockerからGoogle Driveをマウント

通常のUbuntuでGoogle Driveをマウントできるようになったので、次にDockerからGoogle Driveをマウントさせてみます。下記のDockerfileでDockerを生成します。
Dockerfile
FROM ubuntu:latest

RUN apt-get update
RUN apt-get install python3 python3-pip -y


ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get -y install software-properties-common
RUN add-apt-repository ppa:alessandro-strada/ppa
RUN apt update
RUN apt -y install google-drive-ocamlfuse
RUN mkdir /googledrive
ここでのポイントはDockerfileないでTime Zone設定を実施しておくこと、これをやってないとこの問題にはまります。マウントポイントのディレクトリは/googledriveとしていますが、ここは自由に変更できます。

次にDockerを起動させます。
sudo docker run  -it --rm --privileged -v $(pwd)/vol:/root/.gdfuse google-drive /bin/bash
google-drive-ocamlfuseはホームディレクトリの.gdfuseにクレデンシャル情報を書き出します。このディレクトリがDocker停止のたびに消えてしまうと毎回ブラウザの認証が必要になってしまい不便ですので、ホスト側のディレクトリをマウントしておき消えないようにしておきます。

またdocker runに"--privileged"を入れておく必要があります。これがないと"fuse: device not found, try 'modprobe fuse' first"のエラーが出てしまいます。

これでUbuntu上からGoogle Driveがマウントできアクセスできるようになっているはずです。
12

13