#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 случайно не загружает файлы. Вам не должна понадобиться логика повторных попыток, и ваш код выглядит нормально, но вы предоставили только фрагмент, который содержит множество параметров, возможно, просмотрите код, вызывающий эту функцию, и добавьте несколько журналов вокруг всех этих параметров, которые вы можете отслеживать и проверять, соответствуют ли они вашим ожиданиям