UUUM攻殻機動隊(エンジニアブログ)

UUUMのエンジニアによる技術ブログです

Google Drive のデータを Google Drive にバックアップするツール(gdsync)を作った

おはこんばんちは。 尾藤 a.k.a. BTO です。

前回からだいぶ時間がたってしまいましたが、Google Driveのデータを Google Drive にバックアップする話です。

結論から言うと、Google Drive to Google Drive でバックアップするツール gdsync を作りました。 公開しているので、よかったら使ってみてください。

pypi.python.org

インストール

Pythonユーザーなら、使い方は簡単で、pip install gdsync するだけです。 すると、gdsync というコマンドがインストールされます。

pip install gdsync

client_secrets.json を取得する

gdsync で Google Drive のデータをバックアップするには、Google Drive へのアクセス権が必要です。 そのために、Google Drive API にアクセスできるようにするための client_secrets.json ファイルを作りましょう。

こちらの Step.1 を参考に、client_secrets.json をダウンロードします。

Python Quickstart  |  Drive REST API  |  Google Developers

作成した client_secrets.json を ~/.gdsync に置きます。

mkdir ~/.gdsync
cp client_secrets.json ~/.gdsync

使い方

コピー元とコピー先の Google Drive のフォルダIDを指定するだけです。

gdsync xxxxxx yyyyyy

xxxxxx のフォルダの中身が、全て yyyyyy にコピーされます。

最初実行した時は、まだ credential ファイルがないので、Google 認証が必要です。 ブラウザの認証画面が表示されますので、そのまま必要な権限を持つアカウントで認証してください。

f:id:masatobito:20160411162200p:plain

認証が成功すると、~/.gdsync/credentials.json に認証情報が保存されます。 2回目移行は認証の必要はありません。

レジューム機能

ファイル数が多くなると、実行している途中で失敗することがよくあります。 そのためにレジューム機能を用意しています。 --resume オプションをつけると、レジューム機能が有効になります。

gdsync --resume xxxxxx yyyyyy

同期が終了したフォルダの情報が、~/.gdsync/gdsync.db にたまっていきます。 次回以降は、既に同期が終了したフォルダは処理がスキップされるようになります。

新しく始めるときは、~/.gdsync/gdsync.db を削除してください。 そうしないと、一度同期が終わったフォルダはずっと同期がされないままになってしまいますので。

gdsync をライブラリとして使用する

gdsync はコマンドラインツールとしてだけではなく、ライブラリとしても使用できます。

例えば、UUUM では、Google Drive の個人用フォルダに、作業用という名前のフォルダがあると、自動的にバックアップをとるような仕組みを導入しています。 この仕組みを使って、クリエイティブユニットが制作している動画のデータを自動的にバックアップするようなシステムを運用しています。

こんな感じプログラム(抜粋)で処理しています。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from uuum.job.common import JobCommon

from gdsync.google.sync import Sync


class Job(JobCommon):
    def execute(self):
        src_folder = self.drive.open(self.config['source_id'])
        dest_folder = self.drive.open(self.config['destination_id'])

        for res in src_folder.list():
            self._sync(res, dest_folder)

    def _sync(self, src_folder, dest_folder):
        if not src_folder.is_folder():
            return

        work_folder = src_folder.find_folder('作業用')
        if work_folder is None:
            return
        print('%s/%s' % (src_folder.name, work_folder.name))

        Sync(
            work_folder,
            dest_folder.create_folder(src_folder.name),
            **self._create_sync_kwargs()
        ).sync()

UUUM での使用例

UUUM では社員で共有しているファイルのバックアップに使用しています。 これで誰かが誤ってデータを削除してしまっても、いつでもバックアップ先からコピーして戻すことができるようになります。

UUUM では事業の特性上、動画データを多く扱います。 Google Drive であれば無制限のライセンスを購入すれば、いくらでもアップロードできますので、大量のデータをバックアップしても大丈夫です。

まとめ

スギ花粉が想像よりも早く終わったので、快適に仕事ができます。