Rcloneを使ってDockerのボリュームにクラウドストレージサービスをマウントさせてみた

Rcloneを使ってDockerのボリュームにクラウドストレージサービスをマウントさせてみた


会社のブログで新年早々にトラブルの顛末を書いた話で、利用してみたツールの紹介です。

社内のストレージサーバーが一時的に利用できなくなったものの、データ自体は問題なく、体制も維持できました(現在は完全復旧済み)。しかし、ストレージサーバーに依存していた社内のチャットボットサービスが動作しなくなってしまいました。

DX環境の業務を止めない!新年早々のストレージトラブルの対応と教訓 - 株式会社佐野設計事務所

このチャットボットは docker-compose で動作しており、DockerのボリュームマウントをNFS経由で行っていました。そのため、ファイルシステムにアクセスできなくなると、Dockerでの運用が難しくなります。

社内のデータはバックアップ体制に切り替える際にGoogleドライブを利用していました。そこで、チャットボット側もGoogleドライブにアクセスする変更を検討しました。

一般的な方法としてGoogle Drive API経由でのアクセスが考えられますが、体制が復旧した際には社内ストレージ + NFSマウントに戻す予定だったため、Googleドライブをファイルシステムとして扱える方法を探しました。その結果、Rclone を利用できそうだったので試してみました。

Rcloneでクラウドストレージをマウントする

Rclone は、クラウドストレージサービス向けに rsync のようなファイルのコピー、ミラーリング、同期を行うコマンドラインツールです。記事公開時点で対応しているクラウドストレージサービスは70以上あります。(一覧: Rclone - providers

RcloneにはFUSEを利用したファイルシステムへのマウント機能があり、rclone mount コマンドを使用してクラウドストレージをローカルのファイルシステムにマウントできます。Googleドライブも対応しており、Google Workspaceのマイドライブや、Business Standard以上のプランから利用できる共有ドライブのマウントも可能です。

インストールも簡単です。今回稼働しているサーバーはUbuntu Serverなのでaptでインストールしました。

sudo apt install rclone

設定方法

設定方法もドキュメントに記載されているので、詳しくは以下のリンクから。終盤にGoogleのoAuth認証が必要です。この作業の前に、Google Cloudで作成できるGoogle Drive API向けのoAuth2認証用のクライアントIDとクライアントシークレットがあると、APIの制限が緩和されるそうです。(これもドキュメントに言及あり

Rcloneのインストール後に rclone config コマンドで設定を行います。ここで設定するnameを後で使います。

$ rclone config
# 設定に従って操作して情報をいれる

##設定後、該当のGoogleドライブへアクセスできているかは `rclone lsd`や`rclone ls`コマンドで確認する。
$ rclone lsd <name>:/
$ rclone ls <name>:/

# 設定一覧を確認する
$ clone config show

rclone mount コマンドでマウントすることができます。<path> はGoogleドライブのパスを指定します。<mountpoint> はマウントするディレクトリを指定します。

$ rclone mount <name>:<path> <mountpoint>

# マウント解除
$ umount <mountpoint>

Googleドライブのようなクラウドストレージでは、キャッシュオプションを設定しておくと良いそうです。--vfs-cache-mode オプションで設定できます。(こちらもドキュメントが詳しいです)

Docker + Rclone + Googleドライブを組み合わせる

Docker環境でRcloneを使用してGoogleドライブをマウントする方法を試しました。まずは失敗例として、ホスト上でGoogleドライブをマウントし、そのディレクトリを docker-compose.yml のボリュームとして指定してみました。

rclone mount <name>:<path> /path/to/google-drive-mountpoint
# compose.ymlの例です。
services:
  chatbot:
    image: chatbot:latest
    volumes:
      - /path/to/google-drive-mountpoint:/app/data

しかし以下のエラーが発生しました。

Error response from daemon: error while creating mount source path '/path/to/google-drive-mountpoint': mkdir /path/to/google-drive-mountpoint: file exists

調べてみたものの、RcloneとLinux環境の仕組みとしてFUSEを使ってマウントしているため、そのあたりが原因かと思われます。(なので解決はできそうな気もするがここでは深く追わず。--allow-otherのオプションが使えるかも -> 参考:https://commis.hatenablog.com/entry/2018/11/01/171829)

Rcloneで用意されているDocker Volume Pluginを使う

Rcloneには dockerボリュームとして使えるプラグインがあります。docker環境にインストールすることでRcloneで設定したクラウドストレージをdockerのボリュームとして使えるようになります。インストールもドキュメントに従って操作していきます。設定もドキュメントに沿って行います。

# compose.ymlの例です。
services:
  chatbot:
    image: chatbot:latest
    volumes:
      - google-drive:/app/data

volumes:
  google-drive:
    driver: rclone
    driver_opts:
      config: <name>:<path>
      # Googleドライブ向けのオプションは https://rclone.org/drive/#standard-options で確認できます。
      vfs_cache_mode: writes
      # VSFキャッシュオプションは,vfs_read_chunk_size や vfs_read_chunk_size_limit: off など。https://rclone.org/commands/rclone_mount/#vfs-file-caching で確認できます。

オプション引数の渡し方はyamlの記法に従うのですがほとんどコマンドでの起動と変わりません。一部オプションが通せないものがあったものの、問題なく利用できました。

まとめ

Rcloneを使ってクラウドストレージのGoogleドライブをDockerのボリュームとして扱う方法を紹介しました。

正直、クラウドストレージ(というかGoogleドライブ)はストレージ速度としてはかなり遅い方なので、ローカルネットワークのストレージサーバーと同じような使い方は難しいです。書き込みでタイムアウトを起こすことが何回かあったりして、リトライの仕組みも必要になりそうです。また、Googleドライブのレート制限にも注意が必要です。

緊急なときや、低速を前提とした設計で考えるほうが良さそうです。特殊な方法かなと思ってますが、知っていると助かる話もあると思うので、シェアでした!!


開発系エンジニアのためのDocker絵とき入門
B0CSFF6QYD

ASIN : B0CSFF6QYD
Amazonで詳しく見る
Powered by Amazon Quick Affiliate (JP)

こちらはAmazonアソシエイトプログラム参加リンクです

Docker実践ガイド 第3版 impress top gearシリーズ
B0BV8VCCYX

ASIN : B0BV8VCCYX
Amazonで詳しく見る
Powered by Amazon Quick Affiliate (JP)

こちらはAmazonアソシエイトプログラム参加リンクです

技術書典でみたDockerの漫画本もおすすめです。

#マンガでわかるDocker ① 〜概念・基本コマンド編〜 【ダウンロード版】 #技術書典 - 湊川あいの、わかば家。 #技術書典 #わかばちゃんと学ぶ シリーズ - BOOTH