需求
在公有云开了测试或开发服务器,但是到了晚上下班后,或周末就不用了,有时候忘记关机,导致资源浪费。 因此考虑通过函数服务调用华为云ECS接口,定时到点就关闭虚拟机。
实现
华为公有云基础设施基于Openstack构建,也暴露了Openstack原生接口,因此可以试用Openstack的Python SDK来实现。
1. SDK 安装与打包上传
当前函数服务还未集成Python SDK,因此需要在本地安装SDK,并打包为一个zip包,上传到华为云对象存储,作为一个依赖包。 参考SDK安装方法在本地安装SDK,为了方便打包,建议指定目录,将依赖包安装到特定目录下。
# 假设安装目录为 /your/prefix/path
# 安装依赖包
sudo pip install --install-option="--prefix=/your/prefix/path" -r requirements.txt
# 安装SDK
sudo python setup.py --home="/your/prefix/path"
# 将系统包拷贝到 /your/prefix/path
sudo cp -r /usr/lib/python2.7/dist-packages/* /your/prefix/path
2. SDK 使用
3. 函数代码
# -*- coding:utf-8 -*-
import json
from openstack import connection
def shutdown_ecs(event, context):
projectId = context.getUserData('projectId')
domain = context.getUserData('domain')
region = context.getUserData('region')
ak = context.getUserData('ak')
sk = context.getUserData('sk')
whiteLists = context.getUserData('whiteLists')
logger = context.getLogger()
_shutdown_ecs(logger, projectId, domain, region, ak, sk, whiteLists)
def _shutdown_ecs(logger, projectId, domain, region, ak, sk, whiteLists):
whites = whiteLists.split(',')
conn = connection.Connection(project_id=projectId, domain=domain, region=region, ak=ak, sk=sk)
servers = conn.compute.servers()
for server in servers:
if server.name in whites:
logger.info("DO NOT shutdown %s because it is in white lists" % (server.name))
continue
if "ACTIVE" == server.status:
logger.info("try stop server %s ..." % (server.name))
conn.compute.stop_server(server)
conn.compute.wait_for_server(server, status="SHUTOFF", interval=5, wait=600)
logger.info("stop server %s success" % (server.name))
使用定时器触发,配置规则为每天0点,8点,12点,18点关机:0 0 0,8,12,18 * * ?