使用函数服务定时关闭华为公有云虚拟机

需求

在公有云开了测试或开发服务器,但是到了晚上下班后,或周末就不用了,有时候忘记关机,导致资源浪费。 因此考虑通过函数服务调用华为云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 使用

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 * * ?