📖

Google DriveからGCSへの同期をCloud Run Jobsで実装する方法

に公開

概要

Google DriveからGoogle Cloud Storage(GCS)への自動同期システムをrcloneとCloud Run Jobsで実装したのでメモ。

特徴:

  • rcloneによる直接同期実行
  • 並行処理による高速化
  • Cloud Run Jobsでの定期実行
  • Google Workspace形式の自動変換

システム構成

今回実装するシステムの構成:

  • 同期ツール: rclone
  • 実行環境: Cloud Run Jobs
  • ストレージ: Google Cloud Storage
  • 認証: サービスアカウント
  • マウント: Cloud Storage FUSE

複雑な自作ロジックではなく、実績のあるrcloneを使用することで安定性を確保します。

Dockerコンテナの構成

シンプルなDockerfileでrcloneを実行します。

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y rclone
COPY config/rclone.conf /root/.config/rclone/rclone.conf
CMD ["/sync.sh"]

静的設定ファイルを使用し、コンテナ起動時に並行同期を実行します。

設定ファイル作成

ローカルでrclone configを実行して対話的に設定作成。
その後、サービスアカウントファイルパスを手動で変更。サービスアカウントID(メールアドレスっぽいやつ)を共有ドライブの閲覧者に含める。Google Drive APIみたいに自分のアカウントを委任して使いたかったけどダメみたい。これのせいで、共有ドライブ内のファイル・フォルダを組織(ドメイン外)の人に共有できなくする設定を外した。ちょと怖い。

[company-drive-main]
type = drive
scope = drive.readonly
service_account_file = /secrets/service-account-key.json
team_drive = <ドライブのID①>
root_folder_id = 

[company-drive-public]
type = drive
scope = drive.readonly
service_account_file = /secrets/service-account-key.json
team_drive = <ドライブのID②>
root_folder_id =

rclone configの出力をそのまま使えるのが便利。

参考

https://dev.classmethod.jp/articles/rclone-backup/#%25E8%25A8%25AD%25E5%25AE%259A%25E3%2583%2595%25E3%2582%25A1%25E3%2582%25A4%25E3%2583%25AB%25E3%2581%25AE%25E4%25BD%259C%25E6%2588%2590%25E2%2591%25A0(Amazon%2520S3)

並行処理の実装

2つの共有ドライブを同時に同期。

#!/bin/bash
set -e

rclone sync company-drive-main: /mnt/gcs/drive/メイン \
  --drive-export-formats docx,xlsx,pptx,png \
  --log-level INFO \
  --stats 30s \
  --stats-one-line \
  --progress \
  --delete-during \
  --fast-list \
  --checkers 8 \
  --transfers 4 &

rclone sync company-drive-public: /mnt/gcs/drive/パブリック \
  --drive-export-formats docx,xlsx,pptx,png \
  --log-level INFO \
  --stats 30s \
  --stats-one-line \
  --progress \
  --delete-during \
  --fast-list \
  --checkers 8 \
  --transfers 4 &

wait

バックグラウンドで並行実行してwaitで待機。

Google Workspace変換

rcloneの--drive-export-formatsでいける。

  • Google Docs → .docx
  • Google Sheets → .xlsx
  • Google Slides → .pptx
  • Google Drawings → .png

パフォーマンス調整

rcloneのデフォルトより攻めとく。

--fast-list        # 高速リスト取得
--checkers 8       # 8並列チェック
--transfers 4      # 4並列転送
--delete-during    # 転送中に削除実行
--stats 30s        # 30秒ごとに統計表示

実行環境

Cloud Storage FUSEでGCSをマウント。
Secret Managerでサービスアカウントキーをマウント

Cloud Run Jobs with:

  • Ubuntu 22.04
  • 32GB RAM
  • 8 CPU
  • 7200秒タイムアウト

GitHub Actionsでのデプロイ自動化:

  • プルリクエスト: プレビュー環境へのデプロイ
  • main branch マージ: 本番環境へのデプロイ
  • Workload Identity Federationによる認証

結果

  • シンプルな構成: 複雑なPythonロジック不要
  • 高速な同期: 並行処理により2つのドライブを同時同期
  • 安定性: rcloneの実績ある機能を活用
  • 自動化: GitHub Actionsによる完全自動デプロイ
  • 運用コスト: 大幅削減(Cloud Run Jobsの従量課金)

学び

元はDrive APIで四苦八苦してたので車輪の再開発定期便でした。

rcloneの利点:

  • Google Drive APIの複雑な認証処理を隠蔽
  • Google Workspace形式の自動変換
  • 豊富なパフォーマンス最適化オプション
  • 信頼性の高い差分同期

Cloud Run Jobsの利点:

  • 実行時のみ課金
  • 豊富なリソース(CPU/メモリ)
  • 自動スケーリング
  • ログ監視の統合

まとめ

Drive APIでやってたときは1時間かかってたやつが全ファイル転送でも5分に。同じリージョンだと速いとかありそう。正直謎ではある。Cloud Run Jobsは秒課金なので助かるび。

Discussion