google driveとAWS S3間にファイルの転送（リモートマシーン）


AWS S3でデータを保存・管理していますが、中身の確認をDirveでやった方がやりやすい場合がありますので、ファイルの転送（もしくは同期化）ができれば色々な使い道があると思って、試してみたことをメモしました。

## やりたいこと
データをS3、Google drive間の相互転送


## 結論
**rclone**を利用して、S3、Google drive間の相互転送ができました。

## 準備するもの
- マシーン：AWS EC2・Amazon Linux2
- AWS S3とS3の操作ができるcredentials情報
- Google drive
- GCP Google Drive APIを利用できるプロジェクトと関連するサービスアカウント
- rclone


## rclone

[公式サイト](https://rclone.org/downloads/)の内容に従って導入する。
Linuxなので、下記のコマンドでインストールする。

```
curl https://rclone.org/install.sh | sudo bash
```

## GCPのプロジェクトとサービスアカウント

GCP Google Drive APIを利用できるプロジェクトをまず準備してください。
普通にGCPのプロジェクトの作成なので、流れのみ記載しますが、詳細を割愛します。

- GCPのプロジェクトの作成
- Google drive APIを有効にする

個人アカウントと関連したくないため、OAuthクライエントIDではなく、**サービス アカウント**を作成して、サービス アカウントのJsonファイルをリモート環境にアップロードします。
今回の場合は`/home/ec2-user/gcloud/xxxxxx.json`に配置しました。

## AWS credentials

今回の場合、AWSのEC2の中にはIAMで作成したユーザーアカウントのcredentials情報が入っていて、このアカウントにもS3の操作権限付いていますので、そのままで使う。（もしなければ、新規ユーザーアカウントを作成して使う。）

```/.aws/credentails
[default]
aws_access_key_id = ************
aws_secret_access_key = ****************
```


## rcloudの環境設定

rcloneの設定コマンドを実行します。

```
rclone config
```

まずはGoogle Driveの設定をします。

```
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config

n/s/q> n
name> gdrive
```
`n`を入力して、名前を`gdrive`にしました。

その後に、storageタイプの一覧が表示されます。 
Google Driveの設定なので、`drive`(数字の`13`でもOK)を入力する。

```
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
...
13 / Google Drive
   \ "drive"
...
Storage> drive
```

サービスアカウントを使いますので、`client_id`と`client_secret`は未入力のままでEnterを押します。

```
client_id>
client_secret>
```

Scopeの部分は、とりあえずフルアクセス権限にするので、`1`を入力します。

```
Scope that rclone should use when requesting access from drive.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Full access all files, excluding Application Data Folder.
   \ "drive"
 2 / Read-only access to file metadata and file contents.
   \ "drive.readonly"
   / Access to files created by rclone only.
 3 | These are visible in the drive website.
   | File authorization is revoked when the user deauthorizes the app.
   \ "drive.file"
   / Allows read and write access to the Application Data folder.
 4 | This is not visible in the drive website.
   \ "drive.appfolder"
   / Allows read-only access to file metadata but
 5 | does not allow any access to read or download file content.
   \ "drive.metadata.readonly"
scope> 1
```

root_folderを設定したい場合、適切のroot_folder_idを入力します。なければ、未入力のままでEnterします。


```
Enter a string value. Press Enter for the default ("").
root_folder_id>
```

サービスアカウントの設定には、**GCPのプロジェクトとサービスアカウント**の時に配置したJsonファイルのパス(`/home/ec2-user/gcloud/xxxxxx.json`)を入力する。


```
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> /home/ec2-user/gcloud/xxxxxx.json
```

advanced configとRemote configの部分は、未入力のままでEnterを押します。
今回はチームドライブを使用しますので、`y`を入力します。

```
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n
Configure this as a team drive?
y) Yes
n) No
y/n> y
```

続いて、内容を確認して、OKでしたら、`y`を入力します。
これでGoogle Driveの設定を完了します。

```
--------------------
[gdrive]
client_id = 
client_secret = 
scope = drive
root_folder_id = 
service_account_file = /home/ec2-user/gcloud/xxxxx.json
team_drive = xxxxxxxxx
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
```

次はS3の設定をします。設定流れは大体一緒なので、重要な部分のみ記載します。
細かいの部分は[こちら](https://rclone.org/s3/)を参照すればOKだと思います。

```

name> awsS3

Storage> s3

provider> 1

env_auth> 2

region> 12

location_constraint> 12

acl> 

server_side_encryption> 2
sse_kms_key_id>

storage_class> 1

```

## rcloneの使用

### ファイル一覧：ls, lsd

ls：指定しているディレクトリのファイルを**全て**リスト表示する

```
rclone ls gdrive:path/to/directory
```

lsd：配下の下一階層のファイルのみをリスト表示する。

```
rclone lsd gdrive:path/to/directory
```


### ファイルのコピー：copy

Google driveとAWS S3間のファイル転送する。

```
# Google driveからAWS S3にファイルをコピーする。
rclone -P copy gdrive:path/to/directory awsS3:/path/to/directory

# AWS S3からGoogle driveにファイルをコピーする。
rclone -P copy awsS3:/path/to/directory　gdrive:path/to/directory 
```

-Pをつけると進捗を表示してくれます。

### ファイルの削除：delete、deleteFile

```
# ディレクトリ配下のファイルの全削除（ディレクトリを削除しません）
rclone delete gdrive:path/to/directory

# 単一ファイルの削除
rclone deletefile gdrive:path/to/file
```

### フォルダーの削除：purge

```
rclone purge gdrive:path/to/directory
```


以上は`rclone`を試してみた結果です。