会社のブログで新年早々にトラブルの顛末を書いた話で、利用してみたツールの紹介です。
社内のストレージサーバーが一時的に利用できなくなったものの、データ自体は問題なく、体制も維持できました(現在は完全復旧済み)。しかし、ストレージサーバーに依存していた社内のチャットボットサービスが動作しなくなってしまいました。
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でGoogleドライブを使用するための設定:Rclone - Google Drive
- Rcloneの
mount
コマンドの詳細:Rclone - mount
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絵とき入門 | |
![]() |
ASIN : B0CSFF6QYD こちらはAmazonアソシエイトプログラム参加リンクです |
Docker実践ガイド 第3版 impress top gearシリーズ | |
![]() |
ASIN : B0BV8VCCYX こちらはAmazonアソシエイトプログラム参加リンクです |
技術書典でみたDockerの漫画本もおすすめです。
#マンガでわかるDocker ① 〜概念・基本コマンド編〜 【ダウンロード版】 #技術書典 - 湊川あいの、わかば家。 #技術書典 #わかばちゃんと学ぶ シリーズ - BOOTH