我正在使用一个名为Alteryx的产品,我正在尝试编写一个Alteryx宏,该宏使用Dynamodb查询API,这样我就可以从Alteryx中访问我的Dynamodb表。不幸的是,我无法使用其中一个AmazonSDK,因此必须手动/在Alteryx中对亚马逊查询api签名进行编码。
我正在利用亚马逊文档中包含的PythonPost示例来指导我完成整个过程。Python示例可以在这里找到:Python Post example。
我已经完成了示例中列出的每个任务:
- 定义请求变量
- 创建规范请求
- 创建要签名的字符串
- 计算签名
- 向请求添加签名信息并提出请求
最初我得到了以下错误:
InvalidSignatureException","message":"Signature·expired:·20150704T101118Z·is·now·earlier·than·20150704T135625Z·(20150704T141125Z·-·15·min.)
尽管我电脑上的时间是正确的,并且我请求中包含的101118Z的时间实际上是正确的。但错误消息告诉我签名已在四小时前过期。我解决这个错误的方法是在我的日期/时间变量中添加4个小时,这似乎奏效了。
问题1。有人熟悉导致这个错误的原因吗?有没有一种方法可以在不给我的日期/时间变量增加4小时的情况下修复它。这是否会导致签名API签名和请求过程中出现额外的复杂情况。
在应用了我的日期/时间变通方法后,我收到了一条新的错误消息:
InvalidSignatureException","message":"The·request·signature·we·calculated·does·not·match·the·signature·you·provided.·Check·your·AWS·Secret·Access·Key·and·signing·method.·Consult·the·service·documentation·for·details.nnThe·Canonical·String·for·this·request·should·have·beenn'POSTn/nncontent_type:nhost:dynamodb.us-east-1.amazonaws.comnx-amz-date:20150704T141834Znx-amz-target:DynamoDB_20120810.CreateTablenncontent_type;host;x-amz-date;x-amz-targetn09a8bcdeea1d20631f887235820bbff0a614679080a2e74a89ceb1a1bcc71b44'nnThe·String-to-Sign·should·have·beenn'AWS4-HMAC-SHA256n20150704T141834Zn20150704/us-east-1/dynamodb/aws4_requestnec549e12e44faf7ee750e19b570eaf2389f82e722ae2978b535df6fd6f3df129'n"}
因此,接下来我将我的规范请求与错误消息中提供的请求进行了比较。这就是我发现的:
- 请求完全相同,只有一个例外。错误消息中提供的规范请求具有内容类型:标头,但排除了相关的内容类型值
- 我的规范请求包括内容类型头和值
- 规范请求末尾的请求参数散列与其他所有参数完全匹配
这一点很重要,因为规范请求是流程下一步的输入。你必须计算规范请求的sha256哈希摘要才能创建要签名的字符串
- 首先,我使用我派生的规范请求(包括内容类型值(来计算要签名的字符串。在这种情况下,除了最后一个元素:规范请求的哈希之外,所有内容都与错误消息string to sign匹配
- 我的下一个方法是计算一个规范请求,该请求排除了内容类型值,因此与错误消息中包含的规范请求完全匹配。在这个场景中,除了规范请求的散列之外,派生的StringToSign完全匹配
问题2:有人遇到这个错误吗;你知道原因吗和/或你有解决办法吗。
我希望一旦我能够解决问题3,我将能够成功地完成第四项任务,计算签名并成功地提出api请求。
问题3:是否有人知道这个过程中还有其他问题,或者有任何其他建议或见解。
除非您有非常具体的理由手动执行,否则标准建议是使用boto从Python访问AWS。
编辑:一般来说,标准建议是使用适合您用例的可用库。
第2版:查看有关sys.path
的评论以及您的案例的解决方法。