AWS SigV4 caching
Say you find yourself doing silly things with AWS APIs on a lazy Sunday afternoon. And you are getting the following inexplicable error when using perfectly valid credentials:
<Error>
<Type>Sender</Type>
<Code>SignatureDoesNotMatch</Code>
<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.</Message>
</Error>
The solution might be sleep(). Ideally for yourself (the sun is shining and it
is Sunday afternoon), but in your code is also acceptable. Or hang up and
reconnect.
Why?¶
There appears to be a credential cache on the AWS services. Specifically, it looks like:
- The cache timeout is 5 seconds
- It is keyed by access key ID1 (i.e.
AKIA...orASIA...) - Only invalid credentials are cached
So you'll only be hit by this issue if you try a [valid key ID, invalid secret key] pair followed (within 5 seconds) by [same valid key ID, valid secret key].
I suppose it's fair enough, because it doesn't affect legitimate usage and it's a cheap way for AWS to avoid spending too much time processing invalid credentials - can you imagine all the infinite loops of bad credentials trying to hammer their APIs all the time?
1: Maybe it's keyed by the entire Credential=AKIA0123456../20211024/us-east-1/sts/aws4_request
string, but I'm not going to wait until the stroke of midnight to find out.