使用SDK(go语言)批量删除阿里云快照

post by rocdk890 / 2017-10-9 11:22 Monday linux技术
    阿里云这半年来也开始学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*********"
    ]
}

最后说一句,这个脚本执行了的话,被删除的快照无法恢复的,所以谨慎使用.
夜空- 本站版权
1、本站所有主题由该文章作者发表,该文章作者与夜空享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和夜空的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:blog.slogra.com/post-710.html

标签: 删除 批量 api 快照 阿里云 sdk aliyun go

评论: