Python3编程实现获取阿里云ECS实例及监控的方法
本文实例讲述了Python3编程实现获取阿里云ECS实例及监控的方法。分享给大家供大家参考,具体如下:
#!/usr/bin/envpython3.5 #-*-coding:utf8-*- try:importhttplib exceptImportError: importhttp.clientashttplib importsys,datetime importurllib importurllib.request importurllib.error importurllib.parse importtime importjson importbase64 importhmac,ssl importuuid fromhashlibimportsha1 #解决访问ssl网站证书的问题 try: _create_unverified_https_context=ssl._create_unverified_context exceptAttributeError: #LegacyPythonthatdoesn'tverifyHTTPScertificatesbydefault pass else: #Handletargetenvironmentthatdoesn'tsupportHTTPSverification ssl._create_default_https_context=_create_unverified_https_context classaliyunclient: def__init__(self): self.access_id='阿里云access_id' self.access_secret='阿里云secret' #监控获取ECSURL self.url='https://ecs.aliyuncs.com' ##签名 defsign(self,accessKeySecret,parameters): sortedParameters=sorted(parameters.items(),key=lambdaparameters:parameters[0]) canonicalizedQueryString='' for(k,v)insortedParameters: 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() returnsignature defpercent_encode(self,encodeStr): encodeStr=str(encodeStr) res=urllib.request.quote(encodeStr) res=res.replace('+','%20') res=res.replace('*','%2A') res=res.replace('%7E','~') returnres #构建除共公参数外的所有URL defmake_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, } forkeyinparams.keys(): parameters[key]=params[key] signature=self.sign(self.access_secret,parameters) parameters['Signature']=signature url=self.url+"/?"+urllib.parse.urlencode(parameters) returnurl defdo_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() excepturllib.error.HTTPErrorase: print(e.read().strip()) raiseSystemExit(e) try: res=json.loads(response) exceptValueErrorase: raiseSystemExit(e) returnres #继承原始类 classclient(aliyunclient): def__init__(self,InstanceIds): aliyunclient.__init__(self) self.InstanceIds=InstanceIds #ECS区域 self.RegionId="cn-shanghai" #时间UTC转换 deftimestrip(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) defDescribeInstanceMonitorData(self): ''' 构造实例监控序列函数 ''' self.tt=self.timestrip() action_dict={"StartTime":self.tt[0],"Endtime":self.tt[1],"Action":"DescribeInstanceMonitorData","RegionId":self.RegionId,"InstanceId":self.InstanceId} returnaction_dict defDescribeInstances(self): ''' 构建实例配置查询函数 ''' action_dict={"Action":"DescribeInstances","RegionId":self.RegionId,"InstanceIds":self.InstanceIds} returnaction_dict defalis_main(self): res=self.do_action(self.DescribeInstances()) listarry=len(res["Instances"]["Instance"]) a={} cpu=0 InternetBandwidth=0 instanlist={"data":a} #调用所有符合条件的实例配置数据 foriinrange(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"] foriinrange(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) returninstanlist 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相关内容可查看本站专题:《PythonSocket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。