定时开关华为公有云虚拟机方法总结

一些应用会有明显的波峰波谷,这可以通过使用弹性伸缩(Auto Scaling)云服务或者使用CCE里的as插件来实现服务的弹性伸缩,不过在实际进行项目支持的时候,会遇到有些企业只想定时开关机(关机后,在按需付费模式下只收取硬盘费用,内存和计算资源得到释放,不计费),而不是通过AS服务实现的情况。本篇就结果华为云提供的服务,总结下三种实现主机定时开关机的方法。

一、Functiongraph实现

函数工作流 FunctionGraph是华为云服务中serverless的一种,可以通过配置openstack的API调用,实现主机的定时开关机。
这个实现在华为云官网有详细的说明:定时开关华为公有云虚拟机
这里把实施时的几个关键位置说明下:
创建委托:如果需要Functiongraph实现ECS主机的调用,就需要创建一个Functiongraph有权访问ECS权限的委托,这个委托在官方文档里已进行了说明;
环境变量配置:只需要配置region和projectId两个变量,其他变量都是可选的,查看python实际脚本,会发现有AK/SK的调用,这部分不用配置,Functiongraph可以自动获取到。python关机的代码如下:

# -*- coding:utf-8 -*-
import ssl
import time,sys
from openstack import connection
from threading import Thread
ssl._create_default_https_context = ssl._create_unverified_context
def handler(event, context):
    projectId = context.getUserData('projectId', '').strip()
    region = context.getUserData('region', '').strip()
    domain= context.getUserData('domain', '').strip()
    ak = context.getAccessKey().strip()
    sk = context.getSecretKey().strip()
    whiteList = context.getUserData('whiteLists', '').strip().split(',')
    logger = context.getLogger()
    if not projectId:
        raise Exception("'projectId' not configured")
    if not region:
        raise Exception("'region' not configured")
    if not domain:
        logger.info("domain not configured, use default value:myhuaweicloud.com")
        domain='myhuaweicloud.com'
    if not ak or not sk:
        ak = context.getUserData('ak', '').strip()
        sk = context.getUserData('sk', '').strip()
        if not ak or not sk:
            raise Exception("ak/sk empty")
    _shutdown_ecs(logger, projectId, domain, region, ak, sk, whiteList)
def _shutdown_ecs(logger, projectId, domain, region, ak, sk, whiteList):
    conn = connection.Connection(project_id=projectId, domain=domain, region=region, ak=ak, sk=sk)
    threads = []
    servers = conn.compute.servers()
    for server in servers:
        if server.name in whiteList:
            logger.info("skip stopping server '%s' for being in white lists." % (server.name))
            continue
        if "ACTIVE" != server.status:
            logger.info("skip stopping server '%s' for status not active(status: %s)." % (server.name, server.status))
            continue
        t = Thread(target=_stop_server,args=(conn, server, logger) )
        t.start()
        threads.append(t)
    if not threads:
        logger.info("no servers to be stopped.")
        return
    logger.info("'%d' server(s) will be stopped.", len(threads))
    for t in threads:
        t.join()
def _stop_server(conn, server, logger):
    logger.info("stop server '%s'..." % (server.name))
    conn.compute.stop_server(server)
    cost = 0
    interval = 5
    wait = 600
    while cost < wait:
        temp = conn.compute.find_server(server.id)
        if temp and "SHUTOFF" != temp.status:
            time.sleep(interval)
            cost += interval
        else:
            break
    #conn.compute.wait_for_server(server, status="SHUTOFF", interval=5, wait=600)
    if cost >= wait:
        logger.warn("wait for stopping server '%s' timeout." % (server.name))
        return 2
    logger.info("stop server '%s' success." % (server.name))
    return 0

这里特点需要注意的是projectID这项,官方的截图上写错了名字,多了一个下划线,不过在说明表格里的是对的。还有这个值不是default project那个对应为0的id,而是在我的凭证—API凭证处查看到的各region对应的projectid名称,这一部搞通后,后面的操作才可以成功。执行结果如下:
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
这个产品比较给力,之前还想过通过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.

四、总结

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

发表评论

您的电子邮箱地址不会被公开。