使用SDK(go语言)批量删除阿里云快照
阿里云这半年来也开始学AWS对各种服务进行收费了,如之前的waf收费也就算了,本来安全这些也不能完全让运营商去搞,居然连快照也要收费,收费也就算了,我不用总行了吧,没想到我停快照一个月后又给我发个短信说因我们买了oss服务免费用我们使用一年的快照,好嘛,我又开启快照,没想到最近我无意检查的时候,发现快照还是在扣费,你妹哦,说的免费用一年呢?把我们当猴耍,一气之下,停快照,删之之前的快照,但几千个快照我手动要删到何年何月,而且删上20个左右又要短信验证,你妹哦,因之前有用sdk来操作的经验,去翻了翻阿里对快照管理的sdk,才有了这篇文章.
阿里云快照sdk(go语言)代码:
package main
import (
"encoding/json"
"fmt"
"github.com/denverdino/aliyungo/common"
"github.com/denverdino/aliyungo/ecs"
"io/ioutil"
"os"
)
var (
cli *ecs.Client = nil
config *Config = new(Config)
)
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
var err error
if len(os.Args) < 2 {
panic("need config file")
}
filename := os.Args[1]
resBytes, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
if err := json.Unmarshal(resBytes, config); err != nil {
panic(err)
}
cli = ecs.NewClient(config.AccessKeyId, config.AccessKeySecret)
delete()
fmt.Println("success")
}
func deleteSnapshot(snapshotId string) {
fmt.Print(snapshotId, "正在删除...", "")
if err := cli.DeleteSnapshot(snapshotId); err != nil {
panic(err)
}
fmt.Println(" 删除成功!")
}
func delete() {
param := &ecs.DescribeSnapshotsArgs{
RegionId: common.Region("cn-hangzhou"),
Pagination: common.Pagination{
PageNumber: 1,
PageSize: 50,
},
}
exceptids := map[string]bool{}
for _, exceptid := range config.ExceptIds {
exceptids[exceptid] = true
}
snapshotIds := getAllSnapshotIds(param, exceptids)
fmt.Println("忽略的快照:", config.ExceptIds)
fmt.Println("待删除快照总计:", len(snapshotIds), "个")
for _, i := range snapshotIds {
deleteSnapshot(i)
}
}
func getAllSnapshotIds(param *ecs.DescribeSnapshotsArgs, exceptids map[string]bool) []string {
snapshotIds := []string{}
snapshots, pagination, err := cli.DescribeSnapshots(param)
if err != nil {
panic(err)
}
for _, r := range snapshots {
if _, ok := exceptids[r.SnapshotId]; !ok {
snapshotIds = append(snapshotIds, r.SnapshotId)
}
}
if p := pagination.NextPage(); p != nil {
param.Pagination = *p
sids := getAllSnapshotIds(param, exceptids)
snapshotIds = append(snapshotIds, sids...)
}
return snapshotIds
}
type Config struct {
AccessKeyId string `json:"accesskeyid"`
AccessKeySecret string `json:"accesskeysecret"`
Action string `json:"action"`
SnapshotId string `json:"snapshotid"`
ExceptIds []string `json:"exceptids"`
}
编译好的sdk下载地址如下:
使用示例:
./snapshot-linux ./config.json
config.json里的说明:
{
"accesskeyid" :"LTAIE********", #填你自己的
"accesskeysecret" :"ya**********", #填你自己的
"exceptids" : [
"s-bp*********", #这里写你不想删除的快照
"s-bp*********",
"s-bp*********",
"s-bp*********",
"s-bp*********"
]
}
最后说一句,这个脚本执行了的话,被删除的快照无法恢复的,所以谨慎使用.


评论: