rcloneでOSSへバックアップ #2 GCP編

今回はrcloneを使ってAlibaba CloudのOSSとGoogle Cloud Storageを同期してみます。

”rclone”のことを知りたい場合は以下記事を確認してみてください。 rcloneの概要紹介とLinux OSへのインストール手順を紹介しています。

1. システム構成

  • Google Cloud Storageのバケットを準備
  • Alibaba Cloud OSSのバケットを準備
  • Alibaba Cloud ECSのAliyun Linuxにrcloneをインストール
  • Alibaba Cloud OSSのデータとGoogle Cloud Storageのデータを同期

2. Google Cloud Storageの構成

まずはCloud Storageにアクセスするための認証情報を作成します。

今回はウィザードで設定します。

使用するAPIに”Google Cloud Storage JSON API”を指定します。

サービスアカウントを作成します。 役割は”ストレージのオブジェクト管理者”にします。

キーを大事に保管しましょう。

次にGCPのCloud Storgeでバケットを作成します。

以下を設定します。

  • ”名前”・・・任意の名前
  • ”デフォルトのストレージクラス”・・・今回はRegionalにします。
  • ”場所”・・・東京(asia-northeast1)を指定します。

Cloud Storageのバケットの設定の”権限”からメンバーを追加します。

サービスアカウントを追加します。

3. rcloneの設定

rcloneでGCPのCloud Storageに接続する設定を作成します。

rclone動作の事前確認

rcloneをインストールしたAliyun Linuxにログインし、まずは、Alibaba Cloud OSSにアクセスできることを確認しておきます。 テスト用のファイルとして”aliyun_assist.rpm”が存在することが確認出来ます。

[root@sun ~]# rclone ls oss:rclone-bigriver
14373011 aliyun_assist.rpm

Alibaba Cloudのコンソールから見ると以下の感じです。

Google Cloud Storageのためのrclone設定

”rclone config”を実行し、Cloud Storageの接続の定義を作成します。

rcloneの公式マニュアルも参考に作業を進めます。

URLはこちら

また、事前にサービスアカウントのjsonファイルをLinux上に保管しておきます。今回は/root/gcs/gcs.jsonです。 rclone configの中でPathを指定します。

[root@sun ~]# rclone config
Current remotes:
Name Type
==== ====
oss s3
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n
name> gcs
Type of storage to configure.
Enter a string value. Press Enter for the default (“”).
Choose a number from below, or type in your own value
1 / A stackable unification remote, which can appear to merge the contents of several remotes
\ “union”
2 / Alias for a existing remote
\ “alias”
3 / Amazon Drive
\ “amazon cloud drive”
4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
\ “s3”
5 / Backblaze B2
\ “b2”
6 / Box
\ “box”
7 / Cache a remote
\ “cache”
8 / Dropbox
\ “dropbox”
9 / Encrypt/Decrypt a remote
\ “crypt”
10 / FTP Connection
\ “ftp”
11 / Google Cloud Storage (this is not Google Drive)
\ “google cloud storage”
12 / Google Drive
\ “drive”
13 / Hubic
\ “hubic”
14 / JottaCloud
\ “jottacloud”
15 / Local Disk
\ “local”
16 / Mega
\ “mega”
17 / Microsoft Azure Blob Storage
\ “azureblob”
18 / Microsoft OneDrive
\ “onedrive”
19 / OpenDrive
\ “opendrive”
20 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
\ “swift”
21 / Pcloud
\ “pcloud”
22 / QingCloud Object Storage
\ “qingstor”
23 / SSH/SFTP Connection
\ “sftp”
24 / Webdav
\ “webdav”
25 / Yandex Disk
\ “yandex”
26 / http Connection
\ “http”
Storage> 11
** See help for google cloud storage backend at: https://rclone.org/googlecloudstorage/ **
Google Application Client Id
Leave blank normally.
Enter a string value. Press Enter for the default (“”).
client_id>
Google Application Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default (“”).
client_secret>
Project number.
Optional – needed only for list/create/delete buckets – see your developer console.
Enter a string value. Press Enter for the default (“”).
project_number> named-tube-233518
Service Account Credentials JSON file path
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Enter a string value. Press Enter for the default (“”).
service_account_file> /root/gcs/gcs.json
Service Account Credentials JSON blob
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Enter a string value. Press Enter for the default (“”).
service_account_credentials>
Access Control List for new objects.
Enter a string value. Press Enter for the default (“”).
Choose a number from below, or type in your own value
1 / Object owner gets OWNER access, and all Authenticated Users get READER access.
\ “authenticatedRead”
2 / Object owner gets OWNER access, and project team owners get OWNER access.
\ “bucketOwnerFullControl”
3 / Object owner gets OWNER access, and project team owners get READER access.
\ “bucketOwnerRead”
4 / Object owner gets OWNER access [default if left blank].
\ “private”
5 / Object owner gets OWNER access, and project team members get access according to their roles.
\ “projectPrivate”
6 / Object owner gets OWNER access, and all Users get READER access.
\ “publicRead”
object_acl> 4
Access Control List for new buckets.
Enter a string value. Press Enter for the default (“”).
Choose a number from below, or type in your own value
1 / Project team owners get OWNER access, and all Authenticated Users get READER access.
\ “authenticatedRead”
2 / Project team owners get OWNER access [default if left blank].
\ “private”
3 / Project team members get access according to their roles.
\ “projectPrivate”
4 / Project team owners get OWNER access, and all Users get READER access.
\ “publicRead”
5 / Project team owners get OWNER access, and all Users get WRITER access.
\ “publicReadWrite”
bucket_acl> 3
Location for the newly created buckets.
Enter a string value. Press Enter for the default (“”).
Choose a number from below, or type in your own value
1 / Empty for default location (US).
\ “”
2 / Multi-regional location for Asia.
\ “asia”
3 / Multi-regional location for Europe.
\ “eu”
4 / Multi-regional location for United States.
\ “us”
5 / Taiwan.
\ “asia-east1”
6 / Hong Kong.
\ “asia-east2”
7 / Tokyo.
\ “asia-northeast1”
8 / Mumbai.
\ “asia-south1”
9 / Singapore.
\ “asia-southeast1”
10 / Sydney.
\ “australia-southeast1”
11 / Finland.
\ “europe-north1”
12 / Belgium.
\ “europe-west1”
13 / London.
\ “europe-west2”
14 / Frankfurt.
\ “europe-west3”
15 / Netherlands.
\ “europe-west4”
16 / Iowa.
\ “us-central1”
17 / South Carolina.
\ “us-east1”
18 / Northern Virginia.
\ “us-east4”
19 / Oregon.
\ “us-west1”
20 / California.
\ “us-west2”
location> 7
The storage class to use when storing objects in Google Cloud Storage.
Enter a string value. Press Enter for the default (“”).
Choose a number from below, or type in your own value
1 / Default
\ “”
2 / Multi-regional storage class
\ “MULTI_REGIONAL”
3 / Regional storage class
\ “REGIONAL”
4 / Nearline storage class
\ “NEARLINE”
5 / Coldline storage class
\ “COLDLINE”
6 / Durable reduced availability storage class
\ “DURABLE_REDUCED_AVAILABILITY”
storage_class> 3
Remote config
[gcs]
type = google cloud storage
project_number = named-tube-233518
service_account_file = /root/gcs/gcs.json
object_acl = private
bucket_acl = projectPrivate
location = asia-northeast1
storage_class = REGIONAL
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
gcs google cloud storage
oss s3
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Google Cloud Storageへのコピーテスト

rcloneの設定が出来ましたのでCloud Storageにアクセスしてみます。

まずはテスト目的で適当なファイル(install.sh)をコピーしてみます。成功している場合は特にメッセージは表示されません。

[root@sun src]# rclone copy install.sh gcs:bigriver20190307
[root@sun src]#

次にrcloneの”ls”で確認してみます。 ”install.sh”がCloud Storage上に存在することを確認出来ました。

[root@sun src]# rclone ls gcs:bigriver20190307
4276 install.sh

参考までにサービスアカウントに適切な権限が無い場合は以下のようにエラーが出ます。このときはサービスアカウントに対して”ストレージのオブジェクト作成者”のみを付与しています。 3回リトライして失敗となっています。

[root@sun src]# rclone copy install.sh gcs:bigriver20190307
2019/03/07 20:20:53 ERROR : Attempt 1/3 failed with 0 errors and: googleapi: Error 403: bigriver20190307@named-tube-233518.iam.gserviceaccount.com does not have storage.objects.get access to bigriver20190307/install.sh., forbidden
2019/03/07 20:20:53 ERROR : Attempt 2/3 failed with 0 errors and: googleapi: Error 403: bigriver20190307@named-tube-233518.iam.gserviceaccount.com does not have storage.objects.get access to bigriver20190307/install.sh., forbidden
2019/03/07 20:20:53 ERROR : Attempt 3/3 failed with 0 errors and: googleapi: Error 403: bigriver20190307@named-tube-233518.iam.gserviceaccount.com does not have storage.objects.get access to bigriver20190307/install.sh., forbidden
2019/03/07 20:20:53 Failed to copy: googleapi: Error 403: bigriver20190307@named-tube-233518.iam.gserviceaccount.com does not have storage.objects.get access to bigriver20190307/install.sh., forbidden

4. OSSとCloud Storageの同期テスト

それではAlibaba Cloud OSSとGoogle Cloud Storageを同期するテストを行います。

まずはAlibaba Cloud OSSにテスト用のデータをコピーします。

[root@sun local]# pwd
/usr/local

[root@sun local]# ls
aegis bin etc games include lib lib64 libexec pkg sbin share src

[root@sun local]# rclone copy bin oss:rclone-bigriver

[root@sun local]# rclone ls oss:rclone-bigriver
25539909 aliyun
14373011 aliyun_assist.rpm
2772750 go-bindata

それではOSSからGoogle Cloud Storageに同期してみます。OSSにある3つのファイル(aliyun,aliyun_assist.rpm,go-bindata)がCloud Storageのバケットにも同期されました。 

[root@sun local]# rclone sync oss:rclone-bigriver gcs:bigriver20190307

[root@sun local]# rclone ls gcs:bigriver20190307
25539909 aliyun
14373011 aliyun_assist.rpm
2772750 go-bindata

このとき、Cloud Storageのrclone設定時にテストでコピーしたファイル(install.sh)は削除されました。これはOSSをオリジナルとして同期されたためで正しい動作です。

5. まとめ

rcloneを利用しAlibaba Cloud OSSとGoogle Cloud Storage間でデータを同期できることが確認出来ました。

良くも悪くもパブリッククラウドにおいてデータ保護の責任は使用者にあります。 最悪の事態を想定し、異なるクラウドにデータをバックアップすることには十分な意味があると考えます。 rcloneを利用することでAlibaba Cloud OSSのデータのバックアップを他のクラウドに保持出来ます。逆もまたしかりでGoogleだけではなくAWSやAzure上のデータをAlibaba Cloud側に2次バックアップとして保管することも可能になります。

Alibaba Cloudであればossutil、Google Cloudであればgsutilなど各クラウドプロバイダーが標準提供しているCUIを利用し、シェルスクリプトを構成することで同様な処理を実現できるとは思います。 しかし、copyだけではなくsync出来ること、その他様々な豊富なオプション、沢山の対応サービスを考えるとrcloneは非常に有用なツールだと思いました。