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) プロジェクトの作成
まず最初にプロジェクトを作成します。(既存のプロジェクトを使うのでも問題ないです)
Google APIコンソールの左上にあるプロジェクトをクリックすると新しいプロジェクトを作成するボタンがでますので、プロジェクト名を決めて新しいプロジェクトを作成します。
b) 認証情報の作成 → oauth同意画面を設定
次に左のメニューの"認証情報"を選択し、"+認証情報を作成"をクリック、"OAuthクライアントID"を選択
- 左のメニューの"認証情報"を選択
- +認証情報を作成"をクリック
- OAuthクライアントID
初回は"OAuth同意画面"の設定に行くことになります。
この画面が出たら、"外部"を選択します。
c) OAuth同意画面の設定
アプリケーション名を入力し、スコープでGoogle Driveを追加する
Google Drive APIをスコープに追加
- Google Drive内のすべてのファイルの表示
- Google Drive内のファイルのメタデータの表示
- Google Driveのファイルのメタデータの表示
d) 認証情報の作成
次に認証情報を作成します。もう一度"+認証情報を作成"をクリックします。
"デスクトップアプリ"を指定します。
e) client ID/ client secret取得
これでClient ID/ Client Secretが取得できました。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 YOURSECRETMOUNTPOINTはマウントしたいディレクトリを指定、-idと-secretは先ほど取得したclient IDとclient secretを指定します。
初回は下記のようにURLが表示されて、verification codeを入力するように求められます。
このURLをコピーし、PCのブラウザからURLを開き認証を実施します。コードが表示されるのでコピーし、入力します。認証がうまく通らない場合はAPIコンソールで登録したアプリケーションの種類などを見直してください。"デスクトップアプリケーション"になっていることが前提です。
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/bashgoogle-drive-ocamlfuseはホームディレクトリの.gdfuseにクレデンシャル情報を書き出します。このディレクトリがDocker停止のたびに消えてしまうと毎回ブラウザの認証が必要になってしまい不便ですので、ホスト側のディレクトリをマウントしておき消えないようにしておきます。
またdocker runに"--privileged"を入れておく必要があります。これがないと"fuse: device not found, try 'modprobe fuse' first"のエラーが出てしまいます。
これでUbuntu上からGoogle Driveがマウントできアクセスできるようになっているはずです。