定时获取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 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
。即可。
对脚本赋权。
添加定时任务
设置定时任务,命令行输入 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
的所以要另外安装。
安装
配置
安装以后要配置密钥,就是 Access Key
和 Secret Key
。
回到根目录,创建配置文件.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>
|
之后就可以使用下面的命令来列举出所有的桶的大小了:
这将比文件大小的递归总和更快地显示大存储区的大小。因为它会获取实际使用的磁盘空间。-H
可以把桶的大小转换成MB GB这种人类易读的单位。
列举桶名:
脚本监控并用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
|
import boto3
aws_access_key_id = '' aws_secret_access_key = ''
region_name = ''
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()
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']
td = datetime.timedelta(days=4, seconds=0, microseconds=0) response = client.get_metric_statistics( Namespace='AWS/S3', MetricName='BucketSizeBytes', Dimensions=[ { 'Name': 'BucketName', 'Value': bucketname }, { 'Name': 'StorageType', 'Value': 'StandardStorage' }, ], StartTime=(datetime.datetime.utcnow() - td).isoformat(), EndTime=datetime.datetime.utcnow().isoformat(), Period=86400, Statistics=[ 'Average', ], Unit='Bytes', ) try: standardstorage_size = response['Datapoints'][0]['Average'] except: continue print(bucketname, '%.2fGB' % (standardstorage_size / 1024 / 1024 / 1024))
|
参考文章:
https://www.howtogeek.com/devops/how-to-get-the-size-of-an-amazon-s3-bucket/