我正在尝试为子网创建发送API查询。请注意,验证码正在运行,问题只在于参数字符串:
request_parameters = 'Action=CreateSubnet&**VpcId=vpc-1738886c**&CidrBlock=20.20.3.0%2F28&Version=2016-11-15'
当我发送此消息时,我得到: AWS无法验证提供的访问凭据
对于完全相同的代码,当我发送时:
"request_parameters = 'Action=CreateVpc&CidrBlock=20.20.3.0%2F24&Version=2016-11-15'" # It works!!
我猜测有问题: VpcId = vpc-1738886c
作为同一个用户,我能够在控制台中使用相同的CIDR块在该VPC中创建子网,因此权限似乎不是问题。
你能告诉我吗?提前谢谢。答案 0 :(得分:0)
" AWS无法验证提供的访问凭据" 意味着您在签名代码中存在问题 - 而不是实际问题参数。
最初,很难理解为什么会出现这种情况,这里......但事实确实如此。
问题在于您需要签署查询字符串的规范表示 ...这意味着在签名时必须以词法方式对参数进行排序:
# canonical representation
Action=CreateSubnet&CidrBlock=20.20.3.0%2F28&Version=2016-11-15&VpcId=vpc-1738886c
对于查询字符串的参数在Internet上端到端更改的顺序,没有安全的假设,因此AWS签名算法要求对它们进行排序以进行签名。实际HTTP请求中的顺序并不重要,但签名时的顺序确实如此。