Назад | Перейти на главную страницу

Когда запрос Get к Amazon S3 возвращает 304 Not Modified, учитывается ли он также в квоте запросов?

Я сохраняю изображения профиля пользователя на Amazon S3 с некоторыми случайными путями / именами файлов для каждого пользователя. База данных знает путь к каждому пользовательскому изображению. Мой вопрос в том, что когда пользователь перемещается в приложении, запрос на получение выдается к изображению профиля несколько раз. После первого раза S3 возвращает статус http 304 Not Modified. Учитывается ли каждый такой запрос GET квоте запросов GET для выставления счетов?

Я понимаю, что вы ищете твердое доказательство того, считаются ли запросы GET, возвращающие 304, как запрос GET для выставления счетов, так же как и запрос GET, возвращающий 200.

В документации не указывается какая-либо разница в выставлении счетов на основе возвращенного кода состояния HTTP, но это не дает никаких доказательств тем или иным образом. Чтобы дать вам четкий ответ, я установил Отчет о стоимости и использовании для моей учетной записи с почасовой частотой агрегирования и включенными идентификаторами ресурсов, а затем протестировал это и посмотрел, что появилось в отчете.

TL; DR; Отчет о выставлении счетов подтверждает то, что все ожидали, GET оплачивается как GET, независимо от того, возвращает ли он код состояния 200 или 304.

Испытательная установка

Я выбрал свою неиспользуемую публично читаемую корзину S3, загрузил файл изображения и установил HTTP-заголовок Cache-Control: public, max-age = 10 в файле. Это означает, что если страница перезагружается через 10 секунд, браузер должен проверить с сервером, изменился ли файл, прежде чем использовать его локально кэшированную копию.

Чтобы гарантировать повторяемость теста и отсутствие неожиданных результатов (например, из-за опечатки и т. Д.), Я создал локальный html-файл, в котором будет отображаться изображение.

<html>
<body>
<img src="http://mybucket.s3.amazonaws.com/5DS05736-2.jpg" width="868" height="488" />
</body>
</html>

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

Подтверждение того, что тест будет работать

Я выполнил первоначальный тест в Chrome, открыв инструменты разработчика, просмотрев вкладку сети и загрузив свой локальный html-файл. По первому запросу изображение было загружено с кодом состояния HTTP 200. Ожидание и последующее обновление страницы показало, что изображение загружается во второй раз с кодом состояния HTTP 304.

Я очистил кеш от записей за последний час.

Фактический тест

На следующее утро я повторил эксперимент. Чтобы убедиться, что я могу отличить тесты, проведенные накануне вечером, от реальных, я записал время и коды состояния, которые я получил. Я сделал одну загрузку без изображения в кеше, что дало 200, а затем два обновления с интервалом ~ 20 секунд, что дало 304 секунды.

Это даст следующие возможности в биллинге:

  • 1 запрос GET = учитываются только запросы GET, возвращающие 200
  • 2 запроса GET = учитываются только запросы GET, возвращающие 304 (маловероятно)
  • 3 запроса GET = учитываются все запросы GET

Отчет о выставлении счетов

Затем я дождался появления отчета о выставлении счетов и загрузил его в Афину. Если вы повторяете это, команда Athena CREATE TABLE:

CREATE EXTERNAL TABLE `cost_and_usage`(
  `identity_lineitemid` string, 
  `identity_timeinterval` string, 
  `bill_invoiceid` string, 
  `bill_billingentity` string, 
  `bill_billtype` string, 
  `bill_payeraccountid` string, 
  `bill_billingperiodstartdate` string, 
  `bill_billingperiodenddate` string, 
  `lineitem_usageaccountid` string, 
  `lineitem_lineitemtype` string, 
  `lineitem_usagestartdate` string, 
  `lineitem_usageenddate` string, 
  `lineitem_productcode` string, 
  `lineitem_usagetype` string, 
  `lineitem_operation` string, 
  `lineitem_availabilityzone` string, 
  `lineitem_resourceid` string, 
  `lineitem_usageamount` string, 
  `lineitem_normalizationfactor` string, 
  `lineitem_normalizedusageamount` string, 
  `lineitem_currencycode` string, 
  `lineitem_unblendedrate` string, 
  `lineitem_unblendedcost` string, 
  `lineitem_blendedrate` string, 
  `lineitem_blendedcost` string, 
  `lineitem_lineitemdescription` string, 
  `lineitem_taxtype` string, 
  `product_productname` string, 
  `product_accountassistance` string, 
  `product_architecturalreview` string, 
  `product_architecturesupport` string, 
  `product_availability` string, 
  `product_bestpractices` string, 
  `product_cacheengine` string, 
  `product_caseseverityresponsetimes` string, 
  `product_clockspeed` string, 
  `product_currentgeneration` string, 
  `product_customerserviceandcommunities` string, 
  `product_databaseedition` string, 
  `product_databaseengine` string, 
  `product_dedicatedebsthroughput` string, 
  `product_deploymentoption` string, 
  `product_description` string, 
  `product_durability` string, 
  `product_ebsoptimized` string, 
  `product_ecu` string, 
  `product_endpointtype` string, 
  `product_enginecode` string, 
  `product_enhancednetworkingsupported` string, 
  `product_executionfrequency` string, 
  `product_executionlocation` string, 
  `product_feecode` string, 
  `product_feedescription` string, 
  `product_freequerytypes` string, 
  `product_freetrial` string, 
  `product_frequencymode` string, 
  `product_fromlocation` string, 
  `product_fromlocationtype` string, 
  `product_group` string, 
  `product_groupdescription` string, 
  `product_includedservices` string, 
  `product_instancefamily` string, 
  `product_instancetype` string, 
  `product_io` string, 
  `product_launchsupport` string, 
  `product_licensemodel` string, 
  `product_location` string, 
  `product_locationtype` string, 
  `product_maxiopsburstperformance` string, 
  `product_maxiopsvolume` string, 
  `product_maxthroughputvolume` string, 
  `product_maxvolumesize` string, 
  `product_maximumstoragevolume` string, 
  `product_memory` string, 
  `product_messagedeliveryfrequency` string, 
  `product_messagedeliveryorder` string, 
  `product_minvolumesize` string, 
  `product_minimumstoragevolume` string, 
  `product_networkperformance` string, 
  `product_operatingsystem` string, 
  `product_operation` string, 
  `product_operationssupport` string, 
  `product_physicalprocessor` string, 
  `product_preinstalledsw` string, 
  `product_proactiveguidance` string, 
  `product_processorarchitecture` string, 
  `product_processorfeatures` string, 
  `product_productfamily` string, 
  `product_programmaticcasemanagement` string, 
  `product_provisioned` string, 
  `product_queuetype` string, 
  `product_requestdescription` string, 
  `product_requesttype` string, 
  `product_routingtarget` string, 
  `product_routingtype` string, 
  `product_servicecode` string, 
  `product_sku` string, 
  `product_softwaretype` string, 
  `product_storage` string, 
  `product_storageclass` string, 
  `product_storagemedia` string, 
  `product_technicalsupport` string, 
  `product_tenancy` string, 
  `product_thirdpartysoftwaresupport` string, 
  `product_tolocation` string, 
  `product_tolocationtype` string, 
  `product_training` string, 
  `product_transfertype` string, 
  `product_usagefamily` string, 
  `product_usagetype` string, 
  `product_vcpu` string, 
  `product_version` string, 
  `product_volumetype` string, 
  `product_whocanopencases` string, 
  `pricing_leasecontractlength` string, 
  `pricing_offeringclass` string, 
  `pricing_purchaseoption` string, 
  `pricing_publicondemandcost` string, 
  `pricing_publicondemandrate` string, 
  `pricing_term` string, 
  `pricing_unit` string, 
  `reservation_availabilityzone` string, 
  `reservation_normalizedunitsperreservation` string, 
  `reservation_numberofreservations` string, 
  `reservation_reservationarn` string, 
  `reservation_totalreservednormalizedunits` string, 
  `reservation_totalreservedunits` string, 
  `reservation_unitsperreservation` string, 
  `resourcetags_username` string, 
  `resourcetags_usercostcategory` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
WITH SERDEPROPERTIES ( 
  'escape.delim'='\\') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://my-billing-bucket/reports/hourly/20180501-20180601/dcd20d15-fffd-4a40-bc5d-555f32fc64b2'
TBLPROPERTIES (
  'skip.header.line.count'='1')

И запрос, чтобы сузить его до использования, которое вы ищете:

select * from cost_and_usage where lineitem_resourceid = 'my-bucket' and lineitem_operation = 'GetObject' and lineitem_usagetype = 'USW2-Requests-Tier2' order by lineitem_usagestartdate desc

Вам нужно будет изменить my-bucket и USW2-Requests-Tier2 на соответствующие значения для вашего сегмента, его местоположения и т. Д.

За час, в течение которого я выполнял свой тест, в столбце lineitem_usageamount указано 3 запроса. Это означает, что все мои запросы были оплачены.

Если вам интересно, как я могу быть уверен, что больше не было никакого другого использования корзины, у меня есть CloudTrail с включенным ведением журнала S3 и указанием на CloudWatch Logs. Используя это, я смог убедиться, что в то время к корзине не поступало никаких других запросов. :)

Учитывается ли каждый такой запрос GET квоте запросов GET для выставления счетов?

Да. «GET, SELECT и все остальные запросы» относятся к той же ценовой категории (источник: Цены на Amazon S3). 302 запроса являются частью категории GET (если говорить о «Запросе цены», ваш вопрос не касается «Цены на передачу данных»).