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中type的构造函数参数含义说明
Jun 21 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
pytorch 数据集图片显示方法
Jul 26 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
Python sorted对list和dict排序
Jun 09 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
Python import模块的缓存问题解决方案
Jun 02 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
Apr 11 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网站被挂木马后的修复方法总结
2014/11/06 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
Javascript的一种模块模式
2008/03/22 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python去除所有html标签的方法
2015/05/05 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python实现决策树分类(2)
2018/08/30 Python
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
行政经理的岗位职责
2013/11/23 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2015年试用期工作总结
2014/12/12 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python