定时获取Scaleway的存储桶大小,并通过Bark每日推送到iPhone

本文最后更新于:2022年10月13日 晚上

定时获取Scaleway的存储桶大小,并通过Bark每日推送到iPhone端。在存储桶过大的时候报警

现学的sh,能用就行。
获取存储桶大小,并进行每日通知。

通过awscli

获取存储桶大小

awscli 安装和配置见另一篇文章:https://pawswrite.xyz/posts/40965.html

awscli 有条简单的命令是:

1
aws s3 ls s3://桶名 --endpoint-url=https://s3.桶的地区如nl-ams.scw.cloud --recursive --human-readable --summarize | tail -2

输出:

1
2
Total Objects: 107355
Total Size: 19.5 GiB

这将遍历存储桶中的每个项目,并在最后打印项目总数和总大小,但我们其实只需要知道总大小就行,所以加上 tail -2 只打印最后两行。但有个缺点是这样很慢,会遍历所有的项目。

我自己大概 20GB ,十万个文件,大概耗时4分钟

脚本监控并用Bark通知

可以自己搭建bark-server,确保了数据的安全。也可以使用Bark作者提供的服务端,https://api.day.app,但数据会保留在服务器端的数据库。所以怎么取舍可以看自己。

创建脚本:

1
vim Scaleway.sh

复制以下内容,对相应的地方进行更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
date "+%Y-%m-%d %H:%M:%S"

media_size=$(aws s3 ls s3://你的桶名 --endpoint-url=https://s3.桶的地区如nl-ams.scw.cloud --recursive --human-readable --summarize | tail -2)
echo "Size calculation done"
echo $media_size

bark_server="你的bark server"
device_key="你的bark客户端的device key"
bark_url=$bark_server"/push"
echo $bark_url

curl -X "POST" $bark_url \
-H 'Content-Type: application/json; charset=utf-8' \
-d "{
\"body\": \"$media_size\",
\"device_key\": \"$device_key\",
\"title\": \"Scaleway Object Storage Size\",
\"badge\": 1,
\"isArchive\": 1,
\"category\": \"Scaleway\",
\"sound\": \"minuet.caf\",
\"icon\": \"https://avatars.githubusercontent.com/u/5185491?s=200&v=4\",
\"group\": \"Scaleway\",
\"url\": \"https://console.scaleway.com/object-storage/buckets\"
}"

一共需要更改四处,你的桶名,桶的地区(三个,分别是Amsterdam The Netherlands就是nl-ams,Paris就是 fr-pa,Warsaw, Poland就是 pl-waw)
然后是 你的bark server你的bark客户端的device key 。这个打开自己iPhone的Bark App看一下首页都有。

Device Key:
打开bark,在界面点击☁云朵图案。
然后点击要用的服务器,点击 Copy address and key。即可。

对脚本赋权。

1
chmod +x Scaleway.sh

添加定时任务

设置定时任务,命令行输入 crontab -e,之后在文件中输入下面命令。

1
00 22 * * * /home/mastodon/scripts/Scaleway.sh >> /home/mastodon/log/Scaleway.log 2>&1

每天22点执行。记得把脚本路径和日志文件路径改成你自己的。

效果

效果如下:

通过s3cmd【推荐】

github:
https://github.com/s3tools/s3cmd
文档
https://s3tools.org/s3_about

更简单的方法是安装 s3cmd ,它不是 awscli 的所以要另外安装。

安装

1
pip install s3cmd

配置

安装以后要配置密钥,就是 Access KeySecret Key
回到根目录,创建配置文件.s3cfg

1
2
cd $HOME
touch .s3cfg

输入以下内容吗,记得修改 host_base host_bucket bucket_location access_key secret_key :

1
2
3
4
5
6
7
8
9
10
11
12
[default]
# Object Storage Region NL-AMS

host_base = s3.nl-ams.scw.cloud
host_bucket = %(bucket)s.s3.nl-ams.scw.cloud
bucket_location = nl-ams
use_https = True

# Login credentials

access_key = <ACCESS_KEY>
secret_key = <SECRET_KEY>

之后就可以使用下面的命令来列举出所有的桶的大小了:

1
s3cmd du -H

这将比文件大小的递归总和更快地显示大存储区的大小。因为它会获取实际使用的磁盘空间。-H 可以把桶的大小转换成MB GB这种人类易读的单位。
列举桶名:

1
s3cmd ls

脚本监控并用Bark通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
date "+%Y-%m-%d %H:%M:%S Starting monitering"

media_size=$(s3cmd du -H)
echo "Size calculation done"
echo $media_size

bark_server="你的bark server"
device_key="你的bark客户端的device key"
bark_url=$bark_server"/push"
echo $bark_url

curl -X "POST" $bark_url \
-H 'Content-Type: application/json; charset=utf-8' \
-d "{
\"body\": \"$media_size\",
\"device_key\": \"$device_key\",
\"title\": \"Scaleway Object Storage Size\",
\"badge\": 1,
\"isArchive\": 1,
\"category\": \"Scaleway\",
\"sound\": \"minuet.caf\",
\"icon\": \"https://avatars.githubusercontent.com/u/5185491?s=200&v=4\",
\"group\": \"Scaleway\",
\"url\": \"https://console.scaleway.com/object-storage/buckets\"
}"

如果你的s3cmd安装在虚拟环境里, media_size 改成下面这样:

1
media_size=$(source ~/miniconda3/bin/activate 你的虚拟环境名;s3cmd du -H)

通过boto3 调用 s3 列举所有【失败】

居然有 Maxkeys 的限制啊。默认 Maxkeys 是1000,但是对于动辄六位数的媒体文件,太少了。超过这个数字就贼慢,数字稍微大一点就会报错412 Precondition Failed。没救了,重点是很慢。

存一下代码:

1
2
3
4
5
6
7
8
9
10
# 获取区域内所有桶名称
client = boto3.client('s3', aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name, endpoint_url=ENDPOINT, )
response = client.list_buckets()
for bucket in response['Buckets']:
bucket_name = bucket['Name']
bucket_content = client.list_objects(Bucket=bucket_name, MaxKeys=10000, )['Contents']
bucket_size = sum(obj['Size'] for obj in bucket_content)
print(bucket_name, bucket_size)

通过boto3 调用 CloudWatch【失败】

尝试了一下,Scaleway不支持CLoudwatch,哭哭。

1
aws cloudwatch list-dashboards

报错

1
An error occurred (Unknown) when calling the ListDashboards operation: Unknown

python代码也是报一样的错误,去看了Scaleway的文档也是没提到支持CloudWatch,是我太天真。
但还是放一下python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python3
# coding=utf-8
import boto3

# key填写账户生成的,可以去用户账户里面生成
aws_access_key_id = ''
aws_secret_access_key = ''
# 桶所在区域
region_name = ''
# endpoint
ENDPOINT = ''
# 获取区域内所有桶名称
client = boto3.client('s3', aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name, endpoint_url=ENDPOINT,)
response = client.list_buckets()
# 查看桶的大小要调CloudWatch的接口
client = boto3.client('cloudwatch',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name, endpoint_url=ENDPOINT,
)
for name in response['Buckets']:
bucketname = name['Name']

# 看了下监控CloudWatch监控的是2天前的数据,这里可以取大点时间范围
td = datetime.timedelta(days=4, seconds=0, microseconds=0)
response = client.get_metric_statistics(
Namespace='AWS/S3',
MetricName='BucketSizeBytes',
# 文档参考https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/cloudwatch-monitoring-accessing.html
# 接口格式参考https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html#CloudWatch.Client.get_metric_statistics
Dimensions=[
{
'Name': 'BucketName',
'Value': bucketname
},
{
'Name': 'StorageType',
'Value': 'StandardStorage'
},
],
StartTime=(datetime.datetime.utcnow() - td).isoformat(),
EndTime=datetime.datetime.utcnow().isoformat(),
# 这个是间隔时间 默认单位是S 86400是取1天
Period=86400,
Statistics=[
'Average',
],
Unit='Bytes',
)
# bytes换成GB TB查看 有的桶太小了就直接过滤了懒的看了
try:
standardstorage_size = response['Datapoints'][0]['Average']
except:
continue
# print(bucketname,'%.2fTB'%(standardstorage_size/1024/1024/1024/1024))
print(bucketname, '%.2fGB' % (standardstorage_size / 1024 / 1024 / 1024))

参考文章:
https://www.howtogeek.com/devops/how-to-get-the-size-of-an-amazon-s3-bucket/


定时获取Scaleway的存储桶大小,并通过Bark每日推送到iPhone
https://pawswrite.xyz/posts/26855.html
作者
Rainbow
发布于
2022年5月18日
许可协议