Amazon-S3

當對 Amazon S3 的 Get 請求返回 304 Not Modified 時,它是否也計入請求配額?

  • May 6, 2018

我將使用者個人資料圖片保存在 Amazon S3 上,每個使用者都有一些隨機路徑/文件名。數據庫知道每個使用者圖像的路徑。我的問題是,當使用者在應用程序中導航時,會多次向個人資料圖片發出獲取請求。第一次之後,S3 返回 http 304 Not Modified 狀態。每個這樣的 get 請求是否都計入 GET 請求配額以進行計費?

我了解您正在尋找關於返回 304 的 GET 請求是否被計為 GET 請求以用於計費目的的確切證據,就像返回 200 的 GET 請求一樣。

該文件沒有根據返回的 HTTP 狀態程式碼指出任何計費差異,但這並沒有以一種或另一種方式提供任何證據。為了給您提供一個明確的答案,我為我的帳戶設置了一個成本和使用情況報告,其中聚合頻率設置為每小時並包含資源 ID,然後對此進行了測試並查看了報告中出現的內容。

TLDR;計費報告證實了每個人的預期,無論返回狀態碼 200 還是 304,GET 都被計費為 GET。

測試設置

我選擇了一個未使用的公開可讀 S3 儲存桶並上傳了一個圖像文件,並在文件上設置了 Cache-Control: public, max-age=10 的 HTTP Header。這意味著如果頁面在 10 秒後重新載入,則瀏覽器必須在使用其本地記憶體副本之前與伺服器檢查文件是否已更改。

為了確保測試是可重複的並且沒有任何意外的結果(例如,錯字等),我創建了一個本地 html 文件來顯示圖像。

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

將其保留在我的本地電腦上的原因是避免對 S3 的任何請求,例如 favicon(這可能會污染結果)。

確認測試有效

我通過打開開發人員工具、查看網路選項卡並載入我的本地 html 文件在 chrome 中執行了初始測試。在第一次請求時,圖像載入的 HTTP 狀態程式碼為 200。等待然後刷新頁面顯示圖像正在第二次載入,HTTP 狀態程式碼為 304。

我清除了最後一小時的條目記憶體。

實際測試

第二天早上,我重複了這個實驗。為了確保我能區分前一天晚上的測試和真正的測試,我記下了我得到的時間和狀態程式碼。我在記憶體中沒有圖像的情況下進行了一次載入,結果為 200,然後兩次刷新間隔約 20 秒,結果為 304。

這將在計費報告中提供以下可能性:

  • 1 GET 請求 = 僅計算返回 200 的 GET 請求
  • 2 GET 請求 = 僅計算返回 304 的 GET 請求(不太可能)
  • 3 GET 請求 = 計算所有 GET 請求

計費報告

然後,我等到賬單報告可用並將其載入到 Athena 中。如果您重複此操作,則 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 個請求。這意味著我的所有請求都已計費。

如果您想知道如何確定沒有發生其他使用儲存桶的情況,我啟用了啟用 S3 日誌記錄並指向 CloudWatch Logs 的 CloudTrail。使用它,我能夠驗證當時沒有對儲存桶發出其他請求。:)

引用自:https://serverfault.com/questions/908825