sleep 1 は筋悪だったので
自己満レベルですが書き換えました。
endpoint = "エンドポイント" akey = "アクセスキー" skey = "秘密キー" sigbase ="""GET %s / %s""" import hmac import hashlib from base64 import b64encode, urlsafe_b64encode from datetime import datetime, timedelta from urllib import quote_plus, urlopen from sys import exit def callAPI2XML(params, confirm=1): baseparam = dict(AWSAccessKeyId=akey, SignatureMethod = 'HmacSHA256', SignatureVersion = '2', Version = '2012-04-23', ) onesec = timedelta(0, 1) baseparam.update(params) signature, signatureS = range(2) now = datetime.utcnow() while signature != signatureS: timeStamp = now.isoformat().split('.')[0] baseparam.update(dict(Timestamp = timeStamp)) data = '&'.join(['%s=%s'%(x, quote_plus(baseparam[x])) for x in sorted(baseparam.keys())]) sigdata = sigbase%(endpoint, data) sigbin = hmac.new(skey, sigdata, hashlib.sha256).digest() signature, signatureS = b64encode(sigbin), urlsafe_b64encode(sigbin) now -= onesec uri = '%s&Signature=%s'%(data, signatureS) url = 'https://%s/?%s'%(endpoint, uri) if confirm: print "!!!!You will perform followings!!!!" for k,v in params.iteritems(): print "Param:",k, "\nValue:", v, "\n" while (not (confirm in ['y', 'n'])): confirm = raw_input("\nDo you perform this request? (y/n)") if confirm == 'n': exit(0) response = urlopen(url) xml = response.read() return xml ## main if "__name__" == "__main__": from xml.etree import ElementTree xml = callAPI2XML(dict(Action='DescribeDBSecurityGroups',DBSecurityGroupName='test')) # print xml # みづらい # ETreeでざっくり表示 root = ElementTree.fromstring(xml) for e in root.getiterator(): if not e.text:continue text = e.text.strip() if not text:continue tag = e.tag.split('}')[1] print tag, text