Rclone を利用して S3 から Googleドライブにファイルを転送する

2023.11.08

アノテーション インフラチーム所属の髙橋隆太です。

以前 Jira Cloud のバックアップを自動で取得し S3 に転送できようにしました。

詳細: Jira サービスのバックアップをCUI で実行して自動化を考える

こちらのバックアップを S3 から Google ドライブに転送する必要があったので、本記事で紹介します。

Rclone

Rclone とは簡単に言えば Linux と同じような感覚でローカル PC はもちろん、他に Google Drive、Amazon S3、Dropbox、OneDrive などの大手クラウドサービス内のファイルをコピーしたり、移動したり、同期したりすることができます。

方法

実行環境としては以下を利用しました

  •  OS: Amazon Linux 2023
  •  AMI : amazon/al2023-ami-2023.0.20230517.1-kernel-6.1-x86_64
  •  インスタンスタイプ : t3.micro

準備する

Rclone用意

  1. rclone をインストールする
    #インストールする
    $ curl https://rclone.org/install.sh | sudo bash
    
    #実際にインストールできたか確認する
    $ rclone --version
    rclone v1.63.1
    - os/version: amazon 2023 (64 bit)
    - os/kernel: 6.1.27-43.48.amzn2023.x86_64 (x86_64)
    - os/type: linux
    - os/arch: amd64
    - go/version: go1.20.6
    - go/linking: static
    - go/tags: none
    
    # 設定ファイルのパスを確認する
    $ rclone config file
    Configuration file is stored at: /root/.config/rclone/rclone.conf

Rclone の config ファイルを設定する

  1. Google Cloud から API を利用するために Drive のアクセス権限をもった client_id と client_secret を用意しておく

  2. 下記コマンドで S3 と Google ドライブの設定をそれぞれ作成する (対話型なので聞かれた内容を入力するだけで大丈夫です!)

    # Google ドライブの設定
    $ rclone config
    # S3 の設定
    $ rclone config
  3. 設定ファイル(.config/rclone/rclone.conf) を確認する
    [gdrive]
    type = drive
    client_id = your_client_id
    client_secret = your_client_secret
    scope = drive
    token = {"access_token":"your_access_token","token_type":"Bearer","refresh_token":"your_refresh_token","expiry":"your_expiry"}
    team_drive = your_team_drive
    root_folder_id = your_root_folder_id
    
    [s3]
    type = s3
    provider = AWS
    region = ap-northeast-1
    # 以下 IAM ロールを使わない場合は設定
    #access_key_id = AWS_ACCESS_KEY
    #secret_access_key = AWS_SECRET_KEY

実行する

S3 から Google ドライブに転送するときは以下のコマンドで転送することができます。

bucket_name="test_bucket"
sample_file="jira_backup.zip"

$ rclone copy s3:"${bucket_name}"/"${sample_file}" gdrive:/

今回は Jira のバックアップとなりますので容量が大きいと思われます。

私の場合は 12GB ほどありました・・・

上記のコマンドで実施した時 429エラー(Too Many Requests) が発生しました。 そのため以下の オプションを利用して帯域幅や転送内容を制限することで可能でした。

なぜ以下の値の場合は、問題なく転送できるかは現状では不明な状態となります・・・ インスタンスタイプなどのネットワークの問題ですかね・・ 下記のコマンドなら低スペックインスタンスでも動作可能です。

bucket_name="test_bucket"
sample_file="jira_backup.zip"

rclone copy s3:"${bucket_name}"/"${sample_file}" gdrive:/ --tpslimit 10 --bwlimit 2M

まとめ

Rclone を利用することで S3 から Googleドライブ への転送を簡単に送ることができました!

Rclone を見つける前は Python や Node.js と AWS CLI 等のマニュアルを深く読む必要があるかと思いましたが楽に転送できてよかったです。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。