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