6

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

我在连接到亚马逊服务器后拉取实例时得到了这个。

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>
4

2 回答 2

7

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

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

于 2012-04-10T12:05:19.650 回答
3

亚马逊论坛上有一个很好的测试时钟偏差的方法。

类型:

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

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

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

sudo apt-get install ntp
于 2014-07-16T00:15:26.113 回答