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程序设计有所帮助。
