boto3 s3 загружает большой файл с проверкой Content MD5

У меня проблема с загрузкой больших файлов, и я нахожу подходящий метод ContentMD5 для проверки передачи

Я начал с client.upload_file. Этот метод не имеет параметра ContentMD5. Поэтому я попытался использовать функцию для создания локального ETag для файла и сверить его с переданным файлом.

Я обнаружил, что если вы используете шифрование KMS в своей корзине S3, ваш etag каким-то образом зависит от KMS, а локальный сгенерированный ETag не равен ETag в S3.

Вторая попытка заключалась в использовании Object.put. Здесь вы можете использовать ContentMD5, и KMS также работает, но функция использует один поток для загрузки, а не несколько частей. отдельные потоки не могут загружать большие файлы.

Так что теперь я как бы застрял. Есть функция создания MultiPart и upload_part, но я не могу найти примеров с ContentMD5 в целом.

это была попытка Object.put

binary_hash = hashlib.md5(open(file_name,'rb').read()).digest()
file_md5 = base64.b64encode(binary_hash)

metadata = {
    "md5sum": file_md5
}

try:
    obj = s3_resource.Object(bucket, fileobj)
    obj.put(
        Body=open(file_name, 'rb'),
        ContentMD5=file_md5,
        Metadata=metadata,
        ServerSideEncryption='aws:kms',
        SSEKMSKeyId=s3kmskey)

person noideawhatiamdoing    schedule 19.09.2019    source источник


Ответы (1)


Многокомпонентная загрузка разбивает файл на куски. Итак, вам нужно будет вычислить контрольную сумму MD5 для каждого фрагмента, а затем объединить контрольную сумму всех контрольных сумм. ETag будет контрольной суммой вышеуказанной конкатенации, за которой следует -n, где n — количество частей. Этого нет в официальной документации.

Этот скрипт Python может сделать всю работу за вас.

Примечание. Это не работает для шифрования KMS, как следует из документации.

Вы также можете вычислить хэш MD5 и передать его по запрос с заголовком Content-MD5.

person Munavir Chavody    schedule 19.09.2019
comment
как вы уже указали. это не работает с шифрованием KMS. Несколько часов назад я получил ответ от службы поддержки AWS. единственное решение, которое я могу использовать из boto3 с многокомпонентной загрузкой + ContentMD5, и это в зашифрованном сегменте S3 KMS будет create_multipart_upload. единственный пример кода о том, как это реализовать, по крайней мере, то, что я смог найти, это (gist.github.com /teasherm/bb73f21ed2f3b46bc1c2ca48ec2c1cf5) - person noideawhatiamdoing; 19.09.2019