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 相关文章推荐
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
用Python编写简单的微博爬虫
Mar 04 Python
Python设计模式之模板方法模式实例详解
Jan 17 Python
Python Django的安装配置教程图文详解
Jul 17 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
Python 存取npy格式数据实例
Jul 01 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
简述python&pytorch 随机种子的实现
Oct 07 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 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实现智能文件类型检测的实现代码
2011/08/02 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
yii添删改查实例
2015/11/16 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
JavaScript入门之基本函数详解
2011/10/21 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
Python requests接口测试实现代码
2020/09/08 Python
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
食品工程专业求职信
2014/06/15 职场文书
活动总结报告怎么写
2014/07/03 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
优秀员工推荐材料
2014/12/20 职场文书