Проблемы с подписью PutObject на boto3 1.7.74 (с botocore 1.10.84) .. но не на более позднем boto3 - PullRequest
0 голосов
/ 19 ноября 2018

Я получаю следующую ошибку в одной версии boto3, а не в другой, без изменения кода:

Произошла ошибка (SignatureDoesNotMatch) при вызове операции PutObject: мы вычислили подпись запросане соответствует подписи, которую вы предоставили.Проверьте ваш ключ и метод подписи.

Я сталкиваюсь с этой ошибкой на boto3 1.7.74 (с botocore 1.10.84) в среде aws lambda.Я могу воспроизвести ошибку, если я установлю ту же версию boto3 с pip в моей среде разработки.

Проблемный код довольно прост:

# python3

s3 = boto3.client('s3')
base64_md5 = hex_to_b64(md5_hexdigest)
extra_args = {
    'ContentType': 'application/octet-stream',
    'ContentMD5': base64_md5, # "dsE2vA1oCr2XjZk0BwwB5Q=="
    'ContentLength': content_length, # 62914560
    'Metadata': {}
}
try:
    completed = s3.put_object(Bucket=bucketname, Key=keyname, Body=inputfp, **extra_args)

Иногда эти проблемы с подписью связаны с плохой передачейучетные данные для кода.Мои учетные данные хранятся в ~ / .aws /, и я экспортировал AWS_PROFILE в мою среду разработки.В противном случае я не передаю ключи или токены своему коду.

В приведенном выше коде inputfp - это файловый объект без поиска () (я передаю boto3 необработанное тело ответаПОЛУЧИТЬ запрос к локальному веб-серверу).Content-Length и Content-MD5 известны по тому времени, когда я передаю его в boto3.Мой конкретный тестовый файл имеет размер 60 МБ (62914560 байт) нулей (dd if=/dev/null bs=1M count=0 seek=60 of=zeroes).Md5 равен 76c136bc0d680abd978d9934070c01e5, что соответствует значению в кодировке b64 dsE2vA1oCr2XjZk0BwwB5Q==, переданному через параметр ContentMD5.

Я не сталкиваюсь с этой ошибкой на boto3 v1.9.35 (сbotocore v1.12.35) через pip на моем компьютере разработчика.Точно так же я не получаю сообщение об ошибке, если я включаю эту версию в свой zam-код лямбда-кода.

Я подозреваю, что boto 1.7.74 / botocore 1.10.84 не обрабатывает потоковые fds, а также более позднюю версию,но это не очевидно, чтобы проверить - библиотека botocore, кажется, почти полностью процедурно генерируется из заглушек.Кто-нибудь знает, где в botocore заголовки подписи создаются случайно?- Я бы сравнил две версии.

Я добавлю еще несколько оберток к моему файловому объекту и посмотрю, где, возможно, он может пойти не так.

...