[GCP] GCEのインスタンスにGoogle Cloud Storage(GCS)のバケットをつないでデータを保存する

クラウドサーバー上のデータをどうやって管理しようかな?と悩んでいたところ、Google Cloud Storage(GCS)のバケットは、インスタンスにマウントできるということだったので、試してみました。

GCSFUSEをインストール

GCSのバケットをGCSにマウントするには、GCSFUSEが必要なので、GCEのインスタンスにインストールします。公式Githubのガイドの通りです。

参考:gcsfuse/docs/installing.md

export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install gcsfuse

Ubuntu 15.10以前のOSの場合は、ユーザーをFUSEグループに追加する必要があるそうです。

sudo usermod -a -G fuse $USER
exit

Google Cloud Storage JSON APIを有効化

GCEのインスタンスからGoogle Cloud Storageをマウントするには、Google Cloud Storage JSON APIが有効になっている必要があるので、こちらのページの「ENABLE API」をクリックして、ガイドに従ってAPIを有効化します。

ちなみに、ガイドで「GCEまたはGAEで使う」という質問にチェックをすれば、GCEで使う場合には認証を作成しないでもマウントできるようです。

インスタンスでログイン

GCEのインスタンスで、Google Cloudにログインします。

gcloud auth login
You are running on a Google Compute Engine virtual machine.
It is recommended that you use service accounts for authentication.

You can run:

  $ gcloud config set account `ACCOUNT`

to switch accounts if necessary.

Your credentials may be visible to others with access to this
virtual machine. Are you sure you want to authenticate with
your personal account?

Do you want to continue (Y/n)?  

何か出てきました。要約すると「クレデンシャル情報が外部からアクセスした他人に見えてしまうかもしれないから、gcloud configを推奨しているよ」ということでしょうか。素直にガイドに従います。

一度、先ほどのコマンドをキャンセルして、下記を実行します。

gcloud config set account Googleアカウント

Updated property [core/account].

設定できたようです。

マウントする

今回は、Gitbucket用の保存ストレージとして使いたいので、「gitbucket-storage-test」というバケットを作成しました。

マウント先は、/mnt/gcs/とするので、先にディレクトリを作成しておきます。

sudo mkdir /mnt/gcs/

実際にマウントしてみます。

sudo gcsfuse gitbucket-storage /mnt/gcs/

Using mount point: /mnt/gcs
Opening GCS connection...
Opening bucket...
Mounting file system...
File system has been successfully mounted.

マウントできたようです。確認してみます。

コピーしてみる

cp test.txt /mnt/gcs 

cp: cannot create regular file '/mnt/gcs/test.txt': Input/output error

エラーがでました。

ここによると、インスタンスにGCSへの「storage-full access scope」がないとダメなようです。

Google Cloud Consoleから対象インスタンスのCloud APIスコープを見てみると、たしかに「ストレージ:読み取りのみ」となっていました。

インスタンスにCloud Storeへのフルアクセス権を与える

Google Cloud Consoleから対象インスタンスを一度停止します。

インスタンスが停止したら、編集メニューから「アクセス範囲」を「各APIにアクセス権を設定」をクリックすると、下記のような一覧が出てくるので、「ストレージ」を「フル」にします。

各APIにアクセス権を設定の一覧

保存したら再度インスタンスを起動して、コピーをしてみます。

cp test.txt /mnt/gcs 

今度はエラーがでませんでした。

Cloud Console上で確認してみると、

きちんとファイルが追加されていました。


gsutilも使うことができるので、サーバー上のファイルをローカルで同期したり、いろいろと使えそうですね。