使用亚马逊拉实例时400 Bad Request

时间:2012-04-09 07:31:38

标签: boto

任何人都可以说我为什么会收到这个错误吗?

我在连接到amazon服务器后拉实例时得到了这个。

import boto

con = boto.connect_ec2(aws_access_key_id='XXX',aws_secret_access_key='XXX')
con.get_all_instances()

Traceback (most recent call last):

  File "getAllinstanc.py", line 7, in <module>

    reservations = ec2conn.get_all_instances()

  File "c:\jiva\py26\lib\site-packages\boto-2.3.0-py2.6.egg\boto\ec2\connection.py", line 467, in get_all_instances

    [('item', Reservation)], verb='POST')
  File "c:\Jiva\py26\lib\site-packages\boto-2.3.0-py2.6.egg\boto\connection.py", line 896, in get_list

    raise self.ResponseError(response.status, response.reason, body)

boto.exception.EC2ResponseError: EC2ResponseError: 400 Bad Request

<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>RequestExpired</Code><Message>Request has expired. Timestamp date is 2012-04-09T06:54:53Z</Message></Error></Errors><RequestID>44
08be18-5d2b-420b-af48-e2cb03</RequestID></Response>

2 个答案:

答案 0 :(得分:7)

boto(或任何其他AWS客户端库)发出的每个请求都经过加密签名,并且具有与之关联的时间戳(通常是请求中的Date标头)。亚马逊对当前时间的看法,时间戳必须合理接近,通常在15分钟内。如果时间戳在此可接受的窗口之外,您将收到类似的错误。

因此,简短的回答是检查客户端计算机上的系统时间。它似乎不准确。

答案 1 :(得分:2)

测试Amazon's forum上描述的时钟偏差的好方法。

类型:

wget -S  "https://email.us-east-1.amazonaws.com"

这会返回错误,但在Date标头中包含远程系统的时间。然后将其与您系统上date的结果进行比较(假设它是由unix派生的)。

如果您的操作系统恰好是Ubuntu或其他Debian变体,您可以通过安装这样的ntp守护程序来保持时间最新:

sudo apt-get install ntp