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 相关文章推荐
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
Python内置函数OCT详解
Nov 09 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
python将list转为matrix的方法
Dec 12 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
Windows下Sqlmap环境安装教程详解
Aug 04 Python
python 如何获取页面所有a标签下href的值
May 06 Python
5行Python代码实现一键批量扣图
Jun 29 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 smarty 二级分类代码和模版循环例子
2011/06/16 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php格式化日期实例分析
2014/11/12 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
详解vue添加删除元素的方法
2018/06/30 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
Python中apply函数的用法实例教程
2014/07/31 Python
Python自动连接ssh的方法
2015/03/07 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
python脚本定时发送邮件
2020/12/22 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
建筑工地门卫岗位职责
2014/04/30 职场文书
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python