一些应用会有明显的波峰波谷,这可以通过使用弹性伸缩(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名称,这一部搞通后,后面的操作才可以成功。执行结果如下:

functiongraph
functiongraph

projectid的获取可以参考这里:https://support.huaweicloud.com/intl/zh-cn/usermanual-hcli/hcli_09_002.html

二、API调用

所有的API调用都可以通过https://apiexplorer.developer.intl.huaweicloud.com/apiexplorer/overview 页面进行查看。这里只需要找到对应的云产品,和想要调用的功能项,通过页面调试就可以测试运行结果:

api-explorer
api-explorer

这个产品比较给力,之前还想过通过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信息,执行结果如下:

hcloud-cli.
hcloud-cli.

四、总结

从执行结果来看,个人认为的可用性和易用性结果是:apiexplorer > CLI > Functiongraph,因为apiexplorer中除API的调用代码之外,还包含了cli的命令行配置方法,免去了API查询的过程。而Functiongraph执行时,因为调用时长和运行环境的原因,不通保证100%执行成功,不过好处就是免去额外主机的使用。