Ответы
S3 ListObjects
и ListObjectsV2
API содержат элемент ответа IsTruncated
, который (в соответствии с V1 API документами )
Указывает, (true
) или нет (false
) все результаты были возвращены.Если число результатов превышает указанное в MaxKeys
, все результаты могут быть не возвращены.
Согласно разделу Список объектов документации S3:
Поскольку корзины могут содержать практически неограниченное количество ключей, полные результаты запроса списка могут быть чрезвычайно большими.Для управления большими наборами результатов API-интерфейс Amazon S3 поддерживает разбиение на страницы, разделяя их на несколько ответов.Каждый ответ на список ключей возвращает страницу, содержащую до 1000 ключей, с индикатором, указывающим, урезан ли ответ.Вы отправляете серию запросов списка ключей, пока не получите все ключи.Библиотеки-оболочки AWS SDK обеспечивают одинаковую нумерацию страниц.
Очевидно, что нам нужно проверить isTruncated
, если существует вероятность того, что список может соответствовать более 1000 ключей.Точно так же, если мы явно установим MaxKeys
, тогда нам определенно необходимо проверить isTruncated
, есть ли вероятность того, что листинг может соответствовать более чем MaxKeys
ключам.
Однако нужно ли проверять isTruncated
если мы никогда не ожидаем, что будет больше чем min(1000, MaxKeys)
соответствующих ключей?
Я думаю, что самая слабая возможная интерпретация документации по API S3 состоит в том, что S3 вернет самое большее min(1000, MaxKeys)
количество ключей на вызов списка, но технически может вернуть меньше ключей , даже если существует больше подходящих ключей и будет соответствовать в ответе .Например, если имеется 10 совпадающих ключей и MaxKeys == 1000
, то для S3 было бы технически правильно вернуть, скажем, 3 ключа в первом ответе API и 7 во втором.(Технически я полагаю, что он мог бы даже вернуть ноль ключей и установить isTruncated = true
, но такое поведение кажется маловероятным).
При такой слабой семантике я думаю, что всегда нужночтобы проверить isTruncated
, даже если мы перечисляем то, что мы ожидаем от очень небольшого количества ключей.Как следствие, любой код, который не проверяет isTruncated
, является (скорее всего) ошибочным.
В прошлом я наблюдал этот семантический список из других API-интерфейсов AWS (включаяAPI рынка зарезервированных экземпляров EC2).
Это правильная интерпретация семантики API S3? Или S3 фактически гарантирует (но не документирует) более сильную семантику (например, «если больше, чем *»)Ключи 1058 * соответствуют списку, тогда список будет содержать ровно MaxKeys
)?
Меня особенно интересуют ответы, которые ссылаются на официальные источники AWS (такие как ответы на форуме AWS, проблемы SDK и т. Д.).