Voici comment créer des Service Accounts (SA) pour outre-passer la limite d’upload de 750GB/24h sur un TeamDrive (ShareDrive).
Attention, en abuser peut avoir des conséquences pour votre compte Workspace (comme ils ont fermé des milliers de comptes GSuite EDU et/ou vendus sur EBay fin 2019).
Je détaille mon tutoriel mais ne le fais pas en mode [NOOB] volontairement. C’est pas compliqué sauf si on débarque dans rClone et Linux ; si vous voulez vraiment abuser de Google, faut se relever un peu les manches 😛
Le principe est simple :
- On fait 3 Service Accounts
- rClone (ou un fork comme gClone) utilise ces comptes pour uploader les données sur un TeamDrive
- Chaque fois qu’un compte arrive à 750GB d’upload, la limite en 24h, rClone change de compte
Les SA sont des comptes e-mails auxquels ont donne un accès à un projet Google. On peut ensuite rattacher ces e-mails à un ou des TeamDrive.s pour qu’ils puissent en gérer le contenu, dans notre cas y envoyer des données.
Pour ce test je pars sur un CT Proxmox sous Ubuntu 20.04 et toujours rClone BETA.
Générer les SA
On peut créer des SA à la main via la console développeurs de Google (et leurs clés) mais passer par un script simplifie la chose ça fait geek !
On va se servir du script sa-gen et de gcloud. Avant d’utiliser sa-gen on a besoin de configurer gcloud avec les informations du compte Workspace qu’on voudra utiliser : gcloud auth login
Comme d’habitude, on colle l’URL dans un navigateur, on sélectionne son compte, on autorise et on vient remettre le code obtenu.
root@sagen:~# gcloud auth login
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/ ... _account
Enter verification code: 4/...
You are now logged in as [[email protected]].
On doit ensuite configurer sa-gen, que j’ai enregistré sous sagen.sh. Voici un exemple :
KEYS_DIR=/home/aerya/satest
ORGANIZATION_ID="aaaaa"
GROUP_NAME="[email protected]"
PROJECT_BASE_NAME="upandclear"
FIRST_PROJECT_NUM=1
LAST_PROJECT_NUM=1
SA_EMAIL_BASE_NAME="satest"
FIRST_SA_NUM=1
NUM_SAS_PER_PROJECT=3
- KEYS_DIR : l’endroit où on veut stocker nos SA
- ORGANIZATION_ID : l’ID de notre organisation, qu’on a sur la console dév. de Google
- PROJECT_BASE_NAME : le projet qu’on veut utiliser
- SA_EMAIL_BASE_NAME : le base de l’e-mail qu’on veut utiliser
- NUM_SAS_PER_PROJECT : le nom de SA qu’on veut créer par projet. Et c’est là qu’il ne faut pas abuser… Dans mon exemple je pourrai envoyer 3x750GB par 24h
Une fois qu’on a tout configuré on peut lancer le script : ./sagen.sh
root@sagen:~# ./sagen.sh
Total SA json keys before running sa-gen = 0
Creating project = upandclear1
++ gcloud projects create upandclear1 --organization=aaaaa
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/upandclear1].
Waiting for [operations/cp.xxxx] to finish...done.
Enabling service [cloudapis.googleapis.com] on project [upandclear1]...
Operation "operations/acf.xxxx" finished successfully.
++ set +x
Enabling apis for project = upandclear1
++ gcloud config set project upandclear1
Updated property [core/project].
++ gcloud services enable drive.googleapis.com sheets.googleapis.com admin.googleapis.com cloudresourcemanager.googleapis.com servicemanagement.googleapis.com
Operation "operations/acf.xxx" finished successfully.
++ set +x
++ gcloud config set project upandclear1
Updated property [core/project].
++ set +x
Create service accounts for project = upandclear1
Creating service account number 1 in project = upandclear1 ==> satest1@upandclear1
++ gcloud iam service-accounts create satest1 --display-name=satest1
Created service account [satest1].
++ set +x
Creating service account number 2 in project = upandclear1 ==> satest@upandclear1
++ gcloud iam service-accounts create satest2 --display-name=satest
Created service account [satest2].
++ set +x
[...]
create json keys for upandclear1
Creating json key 1.json in project = upandclear1 for service account = satest1@upandclear1
++ gcloud iam service-accounts keys create /home/aerya/satest/1.json [email protected]
created key [xxx] of type [json] as [/home/aerya/satest/1.json] for [[email protected]]
++ set +x
[email protected],[email protected],USER,MEMBER
Creating json key 2.json in project = upandclear1 for service account = satest2@upandclear1
++ gcloud iam service-accounts keys create /home/aerya/satest/2.json [email protected]
created key [xxx] of type [json] as [/home/aerya/satest/2.json] for [[email protected]]
++ set +x
[email protected],[email protected],USER,MEMBER
[...]
Number of service accounts in members.csv = 3
Total SA json keys created for project upandclear1 = 3
Total SA json keys BEFORE running sa-gen = 0
Total SA json keys AFTER running sa-gen = 3
Total SA jsons CREATED = 3
A la fin on a bien tous nos fichiers dans /home/aerya/satest
root@sagen:/home/aerya/satest# ls
1.json 4.json 6.json 8.json allmembers.csv
-rw------- 1 root root 2312 Oct 23 08:58 1.json
-rw------- 1 root root 2312 Oct 23 08:58 2.json
-rw------- 1 root root 2312 Oct 23 08:58 3.json
-rw-r--r-- 1 root root 1611 Oct 23 08:58 allmembers.csv
-rw-r--r-- 1 root root 1671 Oct 23 08:58 members.csv
# oui... je suis en root... osef.
Et on a la récap. dans les fichiers .csv :
root@sagen:/home/aerya/satest# cat members.csv
Group Email [Required],Member Email,Member Type,Member Role
[email protected],[email protected],USER,MEMBER
[email protected],[email protected],USER,MEMBER
[email protected],[email protected],USER,MEMBER
Autoriser les SA sur un TeamDrive
Là c’est la partie “coolups” du tutoriel : on copie les lignes d’un des .csv et on les colle dans les accès à un TeamDrive 🙂
On se rend sur son GDrive et on ajoute ou sélectionne le TeamDrive voulu.

Puis Manage Members et là on colle ligne par ligne nos nouveaux “membres” : [email protected], [email protected] etc
Sur le screen vous voyez une erreur, c’est parce qu’évidemment [email protected] n’existe pas, j’ai modifié tous les noms dans mes exemples 😉

Uploader avec les SA
J’ai cherché un truc simple pendant des semaines. Enfin… soyons franc… “un truc qui m’évite d’écrire un script moi-même”. Flemmard c’est un métier !
J’ai jeté mon dévolu sur un code en Python de Rhilip. C’est simple et efficace. Voici un exemple de configuration :
# ------------配置项开始------------------
# Account目录
sa_json_folder = r'/home/aerya/outils/safiles' # 绝对目录,最后没有 '/',路径中不要有空格
# Rclone运行命令
# 1. 填你正在用/想要用的,这里写的是move,也可以是copy/sync ......
# 2. 建议加上 `--rc` ,不加也没事,后面脚本会自动加上的
# 3. 因为不起screen,如果你希望关注rclone运行的状态,请一定要用 `--log-file` 将rclone输出重定向到文件
cmd_rclone = 'rclone move -vP /home/aerya/mnt/move TDcrypt: --fast-list --transfers=10 --checkers=10 --stats 5s --log-file /home/aerya/outils/logs/rclone.log'
# 检查rclone间隔 (s)
check_after_start = 60 # 在拉起rclone进程后,休息xxs后才开始检查rclone状态,防止 rclone rc core/stats 报错退出
check_interval = 10 # 主进程每次进行rclone rc core/stats检查的间隔
# rclone帐号更换监测条件
switch_sa_level = 3 # 需要满足的规则条数,数字越大切换条件越严格,一定小于下面True(即启用)的数量,即 1 - 4(max)
switch_sa_rules = {
'up_than_750': True, # 当前帐号已经传过750G
'error_user_rate_limit': True, # Rclone 直接提示rate limit错误
'zero_transferred_between_check_interval': True, # 100次检查间隔期间rclone传输的量为0
'all_transfers_in_zero': False, # 当前所有transfers传输size均为0
}
# rclone帐号切换方法 (runtime or config)
# runtime 是修改启动rclone时附加的 `--drive-service-account-file` 参数
# config 是修改rclone的配置文件 `$HOME/.config/rclone/rclone.conf` ,此时你需要指定后面的rclone配置参数参数
switch_sa_way = 'runtime'
# rclone配置参数 (当且仅当 switch_sa_way 为 `config` 时使用,且需要修改)
rclone_config_path = '/root/.config/rclone/rclone.conf' # Rclone 配置文件位置
rclone_dest_name = 'TDcrypt' # Rclone目的地名称(与cmd_rclone中对应相同,并保证SA均已添加)
# 本脚本临时文件
instance_lock_path = r'/tmp/autorclone.lock'
instance_config_path = r'/tmp/autorclone.conf'
# 本脚本运行日志
script_log_file = r'/home/aerya/outils/logs/autorclone.log'
logging_datefmt = "%m/%d/%Y %I:%M:%S %p"
logging_format = "%(asctime)s - %(levelname)s - %(funcName)s - %(message)s"
# ------------配置项结束------------------
On le lance et la magie opère 🙂
cat pymove.service
[Unit]
Description=Move Service Daemon
After=multi-user.target
[Service]
Type=simple
User=0
Group=0
ExecStart=/usr/bin/python3 /home/aerya/outils/scripts/move.py
TimeoutStopSec=20
KillMode=process
RemainAfterExit=yes
Restart=always
[Install]
WantedBy=multi-user.target
10/28/2020 11:40:41 AM - INFO - <module> - Transfer Status - Upload: 1453.5467641036958 GiB, Avg upspeed: 24.707490997679784 MiB/s, Transfered: 32.