Я сохраняю изображения профиля пользователя на 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 секунды.
Это даст следующие возможности в биллинге:
Отчет о выставлении счетов
Затем я дождался появления отчета о выставлении счетов и загрузил его в Афину. Если вы повторяете это, команда 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 (если говорить о «Запросе цены», ваш вопрос не касается «Цены на передачу данных»).