Ошибка NoSuchBucket иногда возникает при циклическом прохождении всех сегментов S3 - PullRequest
0 голосов
/ 17 мая 2019

Я написал некоторый код, предназначенный для циклического прохождения всех сегментов S3 и печати счета каждого аккаунта, имени и статуса управления версиями. Этот код работал, когда я запустил его вчера без ошибок. Сегодня он дал мне ошибку BucketNotFound, когда достиг некоторого сегмента. Я вообще не изменил код, за исключением того, что файл .csv, который он выводит, добавляется, а не перезаписывается.

def main(access_key, access_secret):
    session = boto3.Session(
        aws_access_key_id=access_key,
        aws_secret_access_key=access_secret,
        )
    s3resource = session.resource('s3')
    account = session.client('iam').list_account_aliases()['AccountAliases'][0]
    with open('Buckets with Versioning Enabled.csv', 'a') as output:
        writer = csv.writer(output)
        writer.writerow(['Account', 'Bucket', 'Versioning'])
        for bucket in s3resource.buckets.all():
            response = s3resource.BucketVersioning(bucket.name).status
            if response is None:
                versioning = "Disabled"
            else:
                versioning = response
            print("Account: " + account + " | Bucket: " + bucket.name + " | Versioning: " + versioning)
            writer.writerow([account, bucket.name, versioning])

Может кто-нибудь посоветовать мне, почему этот код может выборочно выдавать такую ​​ошибку? Этот код должен работать надежно. Выполнение этого кода занимает много времени из-за количества блоков, которые он должен проверить, и было бы неприятно запускать его несколько раз, пока эта ошибка не возникнет. Вот исключение:

botocore.errorfactory.NoSuchBucket: An error occurred (NoSuchBucket) when calling the GetBucketVersioning operation: The specified bucket does not exist

1 Ответ

0 голосов
/ 18 мая 2019

Для этого есть две возможные причины: одна очевидная, а другая - не столь очевидная, пока вы не вспомните, что S3 - это масштабная глобально распределенная система.

Если корзина удаляется после того, как ваш скрипт извлекает список, это будет очевидной причиной. Поскольку вы говорите, что запускали сценарий несколько раз, чтобы обойти ошибку, это, вероятно, не проблема, но определенно следует помнить.

Другим, менее очевидным случаем будет удаление корзины за несколько минут до запуска сценария. S3 поддерживает глобальный список всех имен сегментов, и этот список реплицируется во все регионы. После удаления сегмента реплика индекса, используемая для обслуживания вашего запроса, может еще не знать, что сегмент удален.

Разумно предположить, что это условие , вероятно, станет более вероятным или будет длиться дольше при двух условиях: недавно удаленный сегмент находится в другом регионе, чем тот, к которому вы подключаетесь, и регион, к которому вы подключаетесь, это регион, отличный от us-east-1. Это кажется вероятным, поскольку под капотом us-east-1 является официальным хранителем авторитетного списка сегментов, поэтому любая из этих двух вещей или обе могут увеличить задержку до достижения глобальной согласованности. (Обратите внимание, что во время относительно кратковременного простоя us-east-1 2017 года S3 во всех других регионах функционировал почти идеально, но создать ведро в любом регионе S3 было невозможно).

В любом случае вам нужно перехватить исключение и продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...