s3 клиент get_object (Range = byte_range) не может получить первые байты объекта - PullRequest
0 голосов
/ 17 декабря 2018

Все переменные, исправленные в приведенном ниже коде, возвращают исключение SignatureDoesNotMatch, только если оно пытается вернуть ранний диапазон байтов (например, bytes = 0-1000).Исключение не возникает, если диапазон выше (например, bytes = 400000-500000)

import sys
import boto3
import botocore
from boto3.session import Session, Config

def transfer(bucket, access_key, secret_key, file_name, byte_range):
    src_s3 = boto3.client('s3', 
                        verify=False,
                        aws_access_key_id = access_key,
                        aws_secret_access_key = secret_key,
                        config = Config(signature_version='s3v4')
                        )

    try:
        print('Now will start reading using byte_range:', byte_range)
        part_object = src_s3.get_object(Bucket=bucket, Key=file_name, Range=byte_range)
        print('Done reading byte_range:', byte_range)
    except Exception as e:
        print('Failed reading byte_range:', byte_range)
        print(e)
        raise



if __name__ == "__main__":
    bucket = sys.argv[1]
    access_key = sys.argv[2]
    secret_key = sys.argv[3]
    file_name = sys.argv[4]
    byte_range = sys.argv[5]

    transfer(bucket, access_key, secret_key, file_name, byte_range)

Примечание. Проблема не воспроизводима во всех средах, но она является единой для среды, в которой я развертываю(Pivotal Cloud Foundry).

Устранение неполадок. Я предполагаю, что существует фактор окружающей среды, который смущает boto3 при расчете подписи.Любые идеи о том, что может быть причиной этого исключения, учитывая взаимодействие boto3 - Pivotal Cloud Foundry?

Если возможно, вы можете указать мне направление, в котором я могу понять, как boto3 проверяет подпись.

Исключение

2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] Traceback (most recent call last):
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] File "download_part.py", line 32, in <module>
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] transfer(bucket, access_key, secret_key, file_name, byte_range)
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] File "download_part.py", line 16, in transfer
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] part_object = src_s3.get_object(Bucket=bucket, Key=file_name, Range=byte_range)
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] File "/home/vcap/deps/0/python/lib/python3.5/site-packages/botocore/client.py", line 320, in _api_call
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] return self._make_api_call(operation_name, kwargs)
    2018-12-17T14:52:07.710-05:00 [APP/TASK/7dbf1c0d/0] [ERR] File "/home/vcap/deps/0/python/lib/python3.5/site-packages/botocore/client.py", line 624, in _make_api_call
    2018-12-17T14:52:07.711-05:00 [APP/TASK/7dbf1c0d/0] [ERR] raise error_class(parsed_response, operation_name)
    2018-12-17T14:52:07.711-05:00 [APP/TASK/7dbf1c0d/0] [ERR] botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the GetObject operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.
...