Python3编程实现获取阿里云ECS实例及监控的方法


Posted in Python onAugust 18, 2017

本文实例讲述了Python3编程实现获取阿里云ECS实例及监控的方法。分享给大家供大家参考,具体如下:

#!/usr/bin/env python3.5
# -*- coding:utf8 -*-
try: import httplib
except ImportError:
  import http.client as httplib
import sys,datetime
import urllib
import urllib.request
import urllib.error
import urllib.parse
import time
import json
import base64
import hmac,ssl
import uuid
from hashlib import sha1
# 解决 访问ssl网站证书的问题
try:
  _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
  # Legacy Python that doesn't verify HTTPS certificates by default
  pass
else:
  # Handle target environment that doesn't support HTTPS verification
  ssl._create_default_https_context = _create_unverified_https_context
class aliyunclient:
  def __init__(self):
    self.access_id = '阿里云access_id'
    self.access_secret ='阿里云secret'
    #监控获取ECS URL
    self.url = 'https://ecs.aliyuncs.com'
  # #签名
  def sign(self,accessKeySecret, parameters):
    sortedParameters = sorted(parameters.items(), key=lambda parameters: parameters[0])
    canonicalizedQueryString = ''
    for (k,v) in sortedParameters:
      canonicalizedQueryString += '&' + self.percent_encode(k) + '=' + self.percent_encode(v)
    stringToSign = 'GET&%2F&' + self.percent_encode(canonicalizedQueryString[1:]) # 使用get请求方法
    bs = accessKeySecret +'&'
    bs = bytes(bs,encoding='utf8')
    stringToSign = bytes(stringToSign,encoding='utf8')
    h = hmac.new(bs, stringToSign, sha1)
    # 进行编码
    signature = base64.b64encode(h.digest()).strip()
    return signature
  def percent_encode(self,encodeStr):
    encodeStr = str(encodeStr)
    res = urllib.request.quote(encodeStr)
    res = res.replace('+', '%20')
    res = res.replace('*', '%2A')
    res = res.replace('%7E', '~')
    return res
  # 构建除共公参数外的所有URL
  def make_url(self,params):
    timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
    parameters = {
      'Format' : 'JSON',
      'Version' : '2014-05-26',
      'AccessKeyId' : self.access_id,
      'SignatureVersion' : '1.0',
      'SignatureMethod' : 'HMAC-SHA1',
      'SignatureNonce' : str(uuid.uuid1()),
      'TimeStamp' : timestamp,
    }
    for key in params.keys():
      parameters[key] = params[key]
    signature = self.sign(self.access_secret,parameters)
    parameters['Signature'] = signature
    url = self.url + "/?" + urllib.parse.urlencode(parameters)
    return url
  def do_action(self,params):
    url = self.make_url(params)
    # print(url)
    request = urllib.request.Request(url)
    try:
      conn = urllib.request.urlopen(request)
      response = conn.read().decode()
    except urllib.error.HTTPError as e:
      print(e.read().strip())
      raise SystemExit(e)
    try:
      res = json.loads(response)
    except ValueError as e:
      raise SystemExit(e)
    return res
# 继承原始类
class client(aliyunclient):
  def __init__(self,InstanceIds):
    aliyunclient.__init__(self)
    self.InstanceIds = InstanceIds
    # ECS 区域
    self.RegionId = "cn-shanghai"
  # 时间UTC转换
  def timestrip(self):
    UTCC = datetime.datetime.utcnow()
    utcbefore5 = UTCC - datetime.timedelta(minutes =5)
    Endtime = datetime.datetime.strftime(UTCC, "%Y-%m-%dT%H:%M:%SZ")
    StartTime = datetime.datetime.strftime(utcbefore5, "%Y-%m-%dT%H:%M:%SZ")
    return (StartTime,Endtime)
  def DescribeInstanceMonitorData(self):
    '''
    构造实例监控序列函数
    '''
    self.tt = self.timestrip()
    action_dict ={"StartTime":self.tt[0],"Endtime":self.tt[1],"Action":"DescribeInstanceMonitorData","RegionId":self.RegionId,"InstanceId":self.InstanceId}
    return action_dict
  def DescribeInstances(self):
    '''
    构建实例配置查询函数
    '''
    action_dict = {"Action":"DescribeInstances","RegionId":self.RegionId,"InstanceIds":self.InstanceIds}
    return action_dict
  def alis_main(self):
    res = self.do_action(self.DescribeInstances())
    listarry = len(res["Instances"]["Instance"])
    a = {}
    cpu = 0
    InternetBandwidth = 0
    instanlist = {"data":a}
    # 调用所有符合条件的实例配置数据
    for i in range(0,listarry):
      self.InstanceId = res["Instances"]["Instance"][i]["InstanceId"]
      BandwidthOUT = res["Instances"]["Instance"][i]["InternetMaxBandwidthOut"]
      # 调用计算该实例的监控数据
      monitordata = self.do_action(self.DescribeInstanceMonitorData())
      data = monitordata["MonitorData"]["InstanceMonitorData"]
      for i in range(0,len(data)):
        cpu += data[i]["CPU"]
        InternetBandwidth += data[i]["InternetBandwidth"]
      # 对该实例数据生成字典
      arry = {"BandwidthOUT":BandwidthOUT,"cpu":cpu/len(data),"InternetBandwidth":InternetBandwidth/len(data)}
      # 将新数据重构到原字典数据
      a.setdefault(self.InstanceId,arry)
    return instanlist
if __name__ == "__main__":
  # 传实例ID 列表进去
  clt= client(["i-11cy8adf2x"])
  res = clt.alis_main()
  print(res)
# 获取的结果如下:
{'data': {'i-11cy8adf2x': {'InternetBandwidth': 0.0, 'cpu': 4.0, 'BandwidthOUT': 4}}}
# 解释 获取所有实例的 当前配置的带宽值 当前占用的CPU% 当前占用的出口带宽 kbps

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
Python中DJANGO简单测试实例
May 11 Python
python正则表达式之作业计算器
Mar 18 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
Python实现的归并排序算法示例
Nov 21 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
python修改文件内容的3种方法详解
Nov 15 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 Python
如何利用python读取micaps文件详解
Oct 18 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
浅谈django开发者模式中的autoreload是如何实现的
Aug 18 #Python
Python绑定方法与非绑定方法详解
Aug 18 #Python
python字典DICT类型合并详解
Aug 17 #Python
Python时间的精准正则匹配方法分析
Aug 17 #Python
Python实现运行其他程序的四种方式实例分析
Aug 17 #Python
python进阶_浅谈面向对象进阶
Aug 17 #Python
Python 比较两个数组的元素的异同方法
Aug 17 #Python
You might like
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP fclose函数用法总结
2019/02/15 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
python使用matplotlib绘制折线图教程
2017/02/08 Python
python select.select模块通信全过程解析
2017/09/20 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python文件操作基础流程解析
2020/03/19 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
《母鸡》教学反思
2014/02/25 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
预备党员介绍人意见
2015/06/01 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers