我正在使用boto3测试Python应用程序来访问DynamoDB,我从boto3收到以下错误消息。
{'error':
{'Message': u'Signature expired: 20160915T000000Z is now earlier than 20170828T180022Z (20170828T181522Z - 15 min.)',
'Code': u'InvalidSignatureException'}}
我注意到它是因为我正在使用python包&fulggun.free_time'冻结20160915的时间,因为测试使用的模拟数据是静态的。
我对错误进行了一些研究,我找到了this answer post。基本上,它说AWS在创建后很短的时间内使签名无效。根据我的理解,在我的情况下,签名被标记为在20160915创建,因为使用了' freeze_time',但AWS使用当前时间(测试运行的时间)。因此,AWS认为此签名已过期近一年,并发回错误消息。
有没有办法让AWS忽略该错误?或者是否可以使用boto3手动修改创建签名的日期和时间?
如果我没有清楚地解释我的问题,请告诉我。任何想法都表示赞赏。
答案 0 :(得分:2)
AWS API调用使用时间戳来防止重放攻击。如果您的计算机时间/日期偏离实际时间太远,则API调用将被拒绝。
从日期设置为2016的计算机运行请求肯定会触发此故障情况。
检查是在主机端完成的,因此除了使用实际日期(或以某种方式强迫Python使用与系统其余部分不同的日期)之外,没有什么可以在本地修复。
答案 1 :(得分:0)
有没有办法让AWS忽略该错误?
没有
或者是否可以使用boto3手动修改创建签名的日期和时间?
您应该修补botocore库的auth.py文件中的任何日期时间/时间调用(来源:https://github.com/boto/botocore/blob/develop/botocore/auth.py)。
答案 2 :(得分:0)
immobilus遇到了类似的问题。我的解决方案是将datetime
中的botocore.auth
替换为未经模拟的版本,如Antonio所建议的那样。
pytest示例看起来像这样
import types
from immobilus import logic
@pytest.fixture(scope='session', autouse=True)
def _boto_real_time():
from botocore import auth
auth.datetime = get_original_datetime()
def get_original_datetime():
original_datetime = types.ModuleType('datetime')
original_datetime.mktime = logic.original_mktime
original_datetime.date = logic.original_time
original_datetime.gmtime = logic.original_gmtime
original_datetime.localtime = logic.original_localtime
original_datetime.strftime = logic.original_strftime
original_datetime.date = logic.original_date
original_datetime.datetime = logic.original_datetime
return original_datetime