定时开关华为公有云虚拟机方法总结
一些应用会有明显的波峰波谷,这可以通过使用弹性伸缩(Auto Scaling)云服务或者使用CCE里的as插件来实现服务的弹性伸缩,不过在实际进行项目支持的时候,会遇到有些企业只想定时开关机(关机后,在按需付费模式下只收取硬盘费用,内存和计算资源得到释放,不计费),而不是通过AS服务实现的情况。本篇就结果华为云提供的服务,总结下三种实现主机定时开关机的方法。
一、Functiongraph实现
函数工作流 FunctionGraph是华为云服务中serverless的一种,可以通过配置openstack的API调用,实现主机的定时开关机。
这个实现在华为云官网有详细的说明:定时开关华为公有云虚拟机。
这里把实施时的几个关键位置说明下:
创建委托:如果需要Functiongraph实现ECS主机的调用,就需要创建一个Functiongraph有权访问ECS权限的委托,这个委托在官方文档里已进行了说明;
环境变量配置:只需要配置region和projectId两个变量,其他变量都是可选的,查看python实际脚本,会发现有AK/SK的调用,这部分不用配置,Functiongraph可以自动获取到。python关机的代码如下:
1# -*- coding:utf-8 -*-
2
3import ssl
4import time,sys
5from openstack import connection
6from threading import Thread
7
8ssl._create_default_https_context = ssl._create_unverified_context
9
10def handler(event, context):
11 projectId = context.getUserData('projectId', '').strip()
12 region = context.getUserData('region', '').strip()
13 domain= context.getUserData('domain', '').strip()
14 ak = context.getAccessKey().strip()
15 sk = context.getSecretKey().strip()
16 whiteList = context.getUserData('whiteLists', '').strip().split(',')
17 logger = context.getLogger()
18 if not projectId:
19 raise Exception("'projectId' not configured")
20
21 if not region:
22 raise Exception("'region' not configured")
23
24 if not domain:
25 logger.info("domain not configured, use default value:myhuaweicloud.com")
26 domain='myhuaweicloud.com'
27
28 if not ak or not sk:
29 ak = context.getUserData('ak', '').strip()
30 sk = context.getUserData('sk', '').strip()
31 if not ak or not sk:
32 raise Exception("ak/sk empty")
33 _shutdown_ecs(logger, projectId, domain, region, ak, sk, whiteList)
34
35
36def _shutdown_ecs(logger, projectId, domain, region, ak, sk, whiteList):
37 conn = connection.Connection(project_id=projectId, domain=domain, region=region, ak=ak, sk=sk)
38 threads = []
39 servers = conn.compute.servers()
40 for server in servers:
41 if server.name in whiteList:
42 logger.info("skip stopping server '%s' for being in white lists." % (server.name))
43 continue
44 if "ACTIVE" != server.status:
45 logger.info("skip stopping server '%s' for status not active(status: %s)." % (server.name, server.status))
46 continue
47
48 t = Thread(target=_stop_server,args=(conn, server, logger) )
49 t.start()
50 threads.append(t)
51
52 if not threads:
53 logger.info("no servers to be stopped.")
54 return
55
56 logger.info("'%d' server(s) will be stopped.", len(threads))
57
58 for t in threads:
59 t.join()
60
61def _stop_server(conn, server, logger):
62 logger.info("stop server '%s'..." % (server.name))
63 conn.compute.stop_server(server)
64
65 cost = 0
66 interval = 5
67 wait = 600
68 while cost = wait:
69 logger.warn("wait for stopping server '%s' timeout." % (server.name))
70 return 2
71
72 logger.info("stop server '%s' success." % (server.name))
73 return 0
这里特点需要注意的是projectID这项,官方的截图上写错了名字,多了一个下划线,不过在说明表格里的是对的。还有这个值不是default project那个对应为0的id,而是在我的凭证—API凭证处查看到的各region对应的projectid名称,这一部搞通后,后面的操作才可以成功。执行结果如下:
projectid的获取可以参考这里:https://support.huaweicloud.com/intl/zh-cn/usermanual-hcli/hcli_09_002.html
二、API调用
所有的API调用都可以通过https://apiexplorer.developer.intl.huaweicloud.com/apiexplorer/overview 页面进行查看。这里只需要找到对应的云产品,和想要调用的功能项,通过页面调试就可以测试运行结果:
这个产品比较给力,之前还想过通过terraform + huaweicloud provider进行实现,不过有了API-explorer,terraform感觉立马不香了。
同时,这里还给出了CLI的配置命令。
这里使用语言引用的SDK,可以在 https://sdkcenter.developer.intl.huaweicloud.com/?product=ECS 页面查看到。
三、HCloud CLI实现
HCloud CLI是一个命令行下实现云服务操作的工具,不过需要使用到AK/SK,使用比较简单,只有一个绿色免安装的命令文件:https://support.huaweicloud.com/intl/zh-cn/clir-functiongraph/functiongraph_09_0100.html
安装完成后,可以通过初始化配置,在配置文件中配置AK/SK信息,不过也可以在命令行里直接带上AK/SK信息,执行结果如下:
四、总结
从执行结果来看,个人认为的可用性和易用性结果是:apiexplorer > CLI > Functiongraph,因为apiexplorer中除API的调用代码之外,还包含了cli的命令行配置方法,免去了API查询的过程。而Functiongraph执行时,因为调用时长和运行环境的原因,不通保证100%执行成功,不过好处就是免去额外主机的使用。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/crontab-start-shutdown-ecs/6714.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.