GAEではhmac
、AWSAPIリクエストの署名を生成するために使用しています。私のコードはもともとこれでした:
import urllib
import urllib2
import time
import hmac
import base64
from hashlib import sha256 as sha256
class AmazonProductAdvertisingAPI:
secret_access_key = '...'
my_hmac = hmac.new(secret_access_key, digestmod=sha256)
def get_signed_url(self, params):
....
# Sign it
self.my_hmac.update('GET' + "\n" + server + "\n" + path + "\n" + paramstring)
urlstring = urlstring + "&Signature=" + \
urllib.quote(base64.encodestring(self.my_hmac.digest()).strip())
return urlstring
これにより、APIリクエスト(で指定されたURLを使用get_signed_url
)は、リクエストがインスタンスの「コールドスタート」である場合にのみ、たとえばコードをデプロイして初めて実行した後などにわかりました。
ただし、その後のリクエストは失敗し、AWSは署名が無効であると主張しました。これは、メソッド内に移動my_hmac
することで解決されたため、クラス内のインスタンス変数ではなく、メソッド内の変数になりました。
...
def get_signed_url(self, params):
my_hmac = hmac.new(self.secret_access_key, digestmod=sha256)
...
私は1つの質問があります:なぜですか?