
DropboxからGoogle Driveへの移行作業
2年近く使ったDropboxを解約するという話になり、さてどうしたもんかなぁ(だいたいの見当はできてるけど)という感じで移行作業をやってます。
カシマです。
まあ方法案としては三つあったんですよね。
- オンプレでCLIから殺(ヤ)る(自社内サーバ利用者)
- EC2でCLIから殺(ヤ)る(EC2利用)
- 外部サービスに任せる
方法としては3が一番楽そうだったのですが、どのサービスもDropbox BusinessとGoogle Drive Enterpriseに非対応で
「そうかぁー個人レベルなら使っていいけど企業レベルでは使えねぇかぁ自力かーやだなぁー」
となってました。
案件片手間で実施するため案件側の対応しながらなんとか漕ぎ着けたのでまとめて行きます。
2週間近く色々試行したかな?
ちなみに1はサーバの容量チェックしたら500GBもないので断念せざる得ませんでした_(┐「ε:)_
今とりあえず自部門のデータをお試し移行中です。
移行にあたってのおすすめ環境
ところでこの記事を読まれた方向けにGoogle Driveの制約があるので記載しておこうと思います。
マイドライブという自分専用のドライブと共有ドライブというチームで使うドライブがそれぞれあるのですが、それぞれに制約があるためご注意ください。
詳しい制約はこちらに記載がありますが、主に気をつけたい制約はこれだと思います。
マイドライブの制限
- 自分の使用できるストレージに限界がある(追加ボリュームは有料)
- 共有に制限はないが、共有する側、共有された側共にストレージを消費する
共有ドライブの制限
- 1日あたり750GBまでのアップロード制限
- 1ドライブあたり400,000オブジェクトまで
- 1ファイルあたりの共有できる最多グループ数が100グループまで
ぼくはむしろこの制限がギリギリだからちょっと頭抱えてるんですけど、なんとかなるかな?
ダメだったらダメだったで誰かがなんとかしてくれる( ^ω^ )よね?
OSとミドルウェア
ubuntu 20.04 (OSのバージョンは問わないけど比較的新しめがおすすめ)
python3 (20.04ならそのまま使える)
dbxcli
dropboxd
dropbox.py
google-drive-ocamlfuse
ディスクサイズ
EBSで1.5TBを念のため用意しました
実際は1TBあれば十分だったっぽいですが、何がどうなるかわからんので。
EBSなら後からオンライン拡張が可能ですので500GBぐらいからでも良かったかもしれません。
事前準備
必要なミドルウェアのインストール
素のubuntuに以下のライブラリをインストールでdropboxdが動くようになりますので先に入れておきます。
$ sudo apt install libglapi-mesa libxdamage-dev libxcb-glx0-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev libxshmfence-dev libxxf86vm-dev
dbxcliを先に準備する
まずはdropbox関連をcliで操作できるようにします。
GUIなんかでやるのはだるいのでやりません。
ubuntuユーザでもrootユーザでもユーザ問わず、適当なディレクトリにdbxcliを用意します。
$ mkdir dropbox && cd dropbox
$ wget https://github.com/dropbox/dbxcli/releases/download/v3.0.0/dbxcli-linux-amd64
$ mv dbxcli-linux-amd64 dbxcli
$ chmod +x dbxcli
コマンドの使い方はgithubに記載がありますが、使うコマンドのオプションはaccountのみです。
accountオプションを使うと以下のように表示されるので自分の手元のマシンのブラウザから認証します。
$ dbxcli account
1. Go to https://www.dropbox.com/1/oauth2/authorize?client_id=AAAAAAAAAAAAAAAA&response_type=code&state=state
2. Click "Allow" (you might have to log in first).
3. Copy the authorization code.
Enter the authorization code here:
1.でURLにアクセスし、2の通りAllowします。
そしてブラウザに3に入力するためのauthorization codeが表示されるので貼り付けてenterを押します。
$ dbxcli account
1. Go to https://www.dropbox.com/1/oauth2/authorize?client_id=AAAAAAAAAAAAAAAA&response_type=code&state=state
2. Click "Allow" (you might have to log in first).
3. Copy the authorization code.
Enter the authorization code here: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Logged in as {ログインユーザ名} <ユーザ名@ドメイン>
Account Id: dbid:{固有の値}
Account Type: business
Locale: ja
Referral Link: https://www.dropbox.com/referrals/{Referral link id}
Profile Photo Url:
Paired Account: false
Team:
Name: {会社名}
Id: dbtid:{チームID}
Member Id: dbmid:{メンバーID}
dropboxdとdropbox.pyを準備する
ここまでできたら今度はdropboxdとdropbox.pyを用意します。
$ cd ~ && wget -O - http://www.dropbox.com/download?plat=lnx.x86_64 | tar xzf -
$ cd dropbox && wget https://www.dropbox.com/download?dl=packages/dropbox.py -O dropbox.py
dropboxdはデーモンとして動いてくれるdropboxの同期アプリです
dropbox.pyはdropboxdをラップしてコントロールできるようにするためのpythonプログラムです。
使い方としては以下のような感じですが、先にdropboxdやdropbox.pyを動かそうとしても2FAなどの認証が通らないので先に2FAを通す意味合いでdbxcliを使用します。
$python3 dropbox/dropbox.py start
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=********************************&cl=en_US to link this machine.
メッセージが違うかもしれませんが、だいたいこんな感じのメッセージが表示されるのでアクセスし、認証します。
余談
ぼくが環境移行する時に最初Amazon Linux2で実施していたのですが、Amazon Linux2からubuntuに変更する時、どうやって実施したかを忘れてしまっていたこともあり、「dropboxdが起動できないぞ!?」と思っていたところ、そういえばdbxcli使ったかも、と考えを改めて動かし直して絶句してました。
statusコマンドで同期実行の確認が取れます。
$python3 dropbox/dropbox.py status
Syncing...
終わっていれば
$python3 dropbox/dropbox.py status
Up to date
と表示されます。
同期中は何ファイル同期予定か使用している回線速度がどれぐらいかも表示されます
企業のデータだけあって500kbps前後の速度だと丸二日かかるようで同期は時間がかかるものと改めて認識しました。
インスタンスタイプによっては処理速度が上がるので1日かからず終えられる場合もあります。
Dropboxは元々ぼく自身が過去に試していたこともあり、存在を知っていたので悩まずに済みました。
問題はGoogle Driveですが、Google Driveを使おうと思ったのは今の会社からですのでGoogle DriveってそもそもCLIで動くのか?と思いながら構築してましたが、 ubuntu 20.04 なら動きました。
この記事作成段階のAmazon Linux2ではSQLite Errorでうんともすんとも言わないこともあり、どういう手段でも達成できませんのでご注意ください。
(libsqlite3のライブラリ変えてもダメだったし、ビルドしてもダメだったし、pip3からgoogle drive関連入れてもyumで入れても何やってもダメでした……Googleてめぇ……)
google-drive-ocamlfuseをインストールする
google-drive-ocamlfuseはopamから入れることもできるのですが、ubuntu 20.04を使うとaptで直接入れることができるので非常に楽に環境構築ができました。
以下の手順で作業を進めます
$ vim firefox
$ chmod 755 firefox
$ chown root:root firefox
$ sudo mv firefox /usr/local/bin/
$ sudo apt install google-drive-ocamlfuse
$ google-drive-ocamlfuse
firefoxの中身ですが、こんな感じです
#! /bin/sh
echo $* > /dev/stderr
google-drive-ocamlfuseを実行した際に表示されるリンクにアクセスし、手元のマシンのブラウザからログインします。
https://accounts.google.com/o/oauth2/auth?client_id=5xxxxxxxx.apps.googleusercontent.com&xxxxxxxxxxxxxxxxxxxxxxxxxxxx
ログインが完了するとこうなります。
https://accounts.google.com/o/oauth2/auth?client_id=5xxxxxxxx.apps.googleusercontent.com&xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Access token retrieved correctly.
ここまで完了すれば概ね完了です。
あとはDropboxからのダウンロード状況次第ですが、Google Driveのマウント作業、実際の移行はさくっと終わります。
Google Driveのマウント作業
ログインしたユーザのマイドライブをLinuxのCLIでマウントするのはそんなに難しくありません。
空ディレクトリを作成した上で作成した空ディレクトリをgoogle-drive-ocamlfuseの引数として指定するだけになります。
$ mkdir -p googledrive/mydrive
$ google-drive-ocamldrive googledrive/mydrive
共有ドライブをマウントすることも可能ですが、ラベルという考え方で分けてマウントすることになります。
下準備としてこんな感じです。
まずは事前にブラウザからGoogle Driveにアクセスし、共有ドライブを右クリックしてドライブを作成します。
この時、仮にteamAとします。
するとteamAにアクセスするとこんな感じでブラウザのURLアドレスに表示されます。
https://drive.google.com/drive/folders/{共有ドライブチームAの固有ID}
{共有ドライブチームAの固有ID}部分はconfigに設定しますのでそのままブラウザを放置してください。
以下はCLIで作業します。
$ mkdir -p googledrive/teamA
$ cp -r .gdfuse/default/ .gdfuse/teamA
$ vim .gdfuse/teamA/config
$ google-drive-ocamldrive -label teamA googledrive/teamA
.gdfuse/teamA/configの中身で書き換える場所
team_drive_id={共有ドライブチームAの固有ID}
この一連の流れでただのフォルダであるgoogledrive/teamAは共有ドライブのteamAをマウントできたことになります。
touchしたファイルを試しに置いてみたり、ブラウザをリロードするとアップロードされていることがわかるはずです。
最後の移行作業
Linuxでここまでの作業ができたらあとはコマンドでrsyncやcpコマンドなどお好きな方法でDropboxからGoogle Driveへ、Google DriveからDropboxへの移行も可能になっているはずです。
個人的にはrsyncで実施したほうが手っ取り早いと感じてます。
Dropboxはほぼ制限がないから便利だけどGoogle Driveの制限は取り扱いづらそうだなぁ…
まあなんとかなるさ。
以上、現場(自宅)からでした