Клиент Python S3 put_object завершается беззвучно

#python #amazon-web-services #amazon-s3 #upload #boto3

Вопрос:

Я реализовал механизм для хранения файлов json в корзине s3.

Через некоторое время я заметил,что некоторые файлы не существовали в корзине, не было никаких признаков ошибки или какого-либо другого сбоя вообще.

Проблема, по-видимому, возникает случайным образом и не является последовательной. Я просмотрел его и нашел людей, у которых были аналогичные проблемы с молчаливым отказом put_object s3, поэтому я реализовал механизм повторных попыток, используя хэш md5 файла и ETag, чтобы проверить загрузку, а также проверить, находится ли файл в корзине, используя list_objects_v2.

Даже после принятия этих мер, хотя проблемы с отсутствующими файлами все еще сохраняются. Я проверил, совпадают ли хэши, и файл указан в списке.

У кого-нибудь когда-нибудь была подобная проблема или у кого-то было какое-то представление о том, что может быть причиной? Спасибо.

Изменить: Это метод, который загружает файл и проверяет хэш

 def save_and_check_md5(s3_file_key, merged_data, packet_md5, dest, S3, DEST_BUCKETS):
    s3_response = S3.put_object(
        Bucket=DEST_BUCKETS[dest],
        Body=json.dumps(merged_data, separators=(",", ":")),
        Key=s3_file_key,
    )
    return s3_response.get("ETag") == '"{}"'.format(packet_md5), s3_response["ResponseMetadata"]["HTTPStatusCode"]
 

Метод, который проверяет, был ли загружен файл:

     def file_uploaded_to_s3(key, S3, destination):
        response = S3.list_objects_v2(Bucket=destination, Prefix=key)
        for item in response.get("Contents", []):
           if item == key:
              return True
        print("File was not found in {}".format(destination))
        return False
 

И повторная часть основного метода:

     while retries <= max_retries and not (file_uploaded_to_s3(s3_file_key, S3, destination)):
        saved_correctly, s3_status_code = save_and_check_md5(s3_file_key, merged_data, packet_md5, destination, S3
        )
        print("S3 response status code: {}".format(s3_status_code))
        if saved_correctly:
           break
        retries  = 1
 

Комментарии:

1. Можете ли вы правильно сделать отступ в своем коде?

2. Я думаю, ты хочешь if item['Key'] == key

3. @Marcin так и сделал, спасибо, что предупредил.

4. @jordanm Вы правы, это был недосмотр с моей стороны, я опубликовал правильный код

5. что создает ключ s3_file_key? возможно, есть ошибка, из-за которой это значение не соответствует вашим ожиданиям. У меня такое чувство, что более вероятно, что в вашем коде/процессах есть ошибка, чем то, что AWS случайно не загружает файлы. Вам не должна понадобиться логика повторных попыток, и ваш код выглядит нормально, но вы предоставили только фрагмент, который содержит множество параметров, возможно, просмотрите код, вызывающий эту функцию, и добавьте несколько журналов вокруг всех этих параметров, которые вы можете отслеживать и проверять, соответствуют ли они вашим ожиданиям