Как функция Boto3 S3 put_object работает в python

С Boto3: я использую функцию put_object() для загрузки объекта в s3. Я использую put_object() с параметром ключа шифрования клиента для шифрования на стороне сервера.

С Boto: я использую функцию upload_chunk для загрузки объекта в s3. Здесь я использую управляемые ключи aws для шифрования на стороне сервера, а не предоставленные клиентом, поскольку они не поддерживаются в API.

Итак, с подходом Boto3 моя программа занимает больше памяти, чем подход Boto. Скажите, пожалуйста, как работает функция put_object в boto3 для шифрования на стороне сервера.

использует ли он память машины для шифрования, к которой он обращался?

должен ли я явно очищать буфер данных, который передается как параметр Body в функцию put_object?

Код:

def put_s3_object(self, target_key_name, data, sse_cust_key, sse_cust_key_md5): 
    ''' description: Upload file as s3 object using SSE with customer key 
    It will store s3 object in encrypted format 
    input: 
    target_key_name (#string) data(in memory string/bytes) 
    sse_cust_key (#string) 
    sse_cust_key_md5 (#string) 
    output: response 
    ''' 
    if not target_key_name: 
        raise 
    try: 
        response = self.s3_client.put_object(Bucket = self.source_bucket, Body = data, Key = target_key_name, SSECustomerAlgorithm = awsParams.CLOUD_DR_AWS_SSE_ALGO, SSECustomerKey = sse_cust_key, SSECustomerKeyMD5 = sse_cust_key_md5) 
        del data 
    except botocore.exceptions.ClientError, fault: 
        raise 
    except Exception, fault: 
        raise 

person Amar Patil    schedule 06.04.2016    source источник
comment
Что ж, исходный код есть :-D github.com/boto/boto3   -  person mootmoot    schedule 06.04.2016
comment
@ mootmoot: Спасибо за ответ. Я напрямую использовал put_object() вместо upload_file(). Это связано с тем, что в boto3 upload_file() требуется имя файла в качестве параметра. Он не поддерживает буфер данных в качестве параметра. Я хочу отправить буфер данных в качестве параметра для загрузки в s3. Обязательно ли использовать upload_file()? Не рекомендуется ли использовать put_object() непосредственно в boto3?   -  person Amar Patil    schedule 06.04.2016
comment
ИМХО, есть причина, по которой разработчик aws выпускает boto3 вместо того, чтобы исправлять функции для boto. Я не вижу никаких проблем с использованием put_object. Тело принимает потоковые объекты, такие как дескриптор файла, StringIO, ByteIO и т. д. Если вы хотите загрузить физический файл, просто откройте () файл и передайте обработчик файла. Вам просто нужно быть осторожным, если вы хотите манипулировать содержимым обработчика, прежде чем помещать содержимое в put_object().   -  person mootmoot    schedule 06.04.2016
comment
@mootmoot Спасибо за ответ. После использования put_object() с параметрами шифрования на стороне сервера использование моей памяти становится высоким в течение 5-6 часов. Пожалуйста, сообщите мне, если я пропускаю какие-либо параметры в вызове функции put_object()   -  person Amar Patil    schedule 12.04.2016
comment
@mootmoot Должен ли я вызывать какую-либо очистку (), которая освободит мою потребляемую память? Есть ли какой-либо параметр в вызове put_object(), который выполняет очистку потребляемой памяти?   -  person Amar Patil    schedule 12.04.2016
comment
Я боюсь, что это поведение кеша ОС. Если вы часто используете put_object, а объем памяти со временем не увеличивается, то, возможно, будет безопасно дождаться сборки мусора ОС. В противном случае, Вы можете проверить некоторые предложения здесь. askubuntu.com/questions/584095/   -  person mootmoot    schedule 12.04.2016
comment
@mootmoot Какая польза от параметра CacheControl в вызове put_object()? Каким должно быть значение параметра CacheControl в вызове put_object()? Это что-то, что связано с отпечатками памяти?   -  person Amar Patil    schedule 12.04.2016
comment
Cache_control не имеет ничего общего с использованием оперативной памяти. bucketexplorer .com/документация/   -  person mootmoot    schedule 12.04.2016
comment
@mootmoot Спасибо. Итак, в чем может быть проблема с использованием ОЗУ при использовании вызова функции put_object()? ИЛИ есть ли способ, если я хочу использовать вызов boto3 upload_file() с параметром буфера данных вместо имени файла?   -  person Amar Patil    schedule 12.04.2016
comment
Я не могу ответить на это, так как я не разработчик и не собираюсь диагностировать код в ближайшем будущем. Возможно, вы можете поэкспериментировать с multpartupload/upload_file и использовать передачу s3, чтобы установить пороговый размер и надеяться, что он будет контролировать объем памяти, но ничего не гарантируется. boto3.readthedocs.org/en/latest/_modules/boto3/ s3/transfer.html Альтернативным решением является запуск SPOT-экземпляра, который стоит в несколько раз дешевле обычного экземпляра.   -  person mootmoot    schedule 12.04.2016


Ответы (1)


Вместо Boto3 put_object() мы можем использовать функции set_contents_to_string() и get_contents_as_string() из boto. Эти вызовы также поддерживают шифрование на стороне сервера с использованием ключей клиента (SSE-C). нам просто нужно указать всю информацию о ключах в заголовках

Для получения дополнительной информации http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html

person Amar Patil    schedule 13.04.2016