当对 Amazon S3 的 Get 请求返回 304 Not Modified 时,它是否也计入请求配额?

当对 Amazon S3 的 Get 请求返回 304 Not Modified 时,它是否也计入请求配额?

我将用户个人资料图片保存在 Amazon S3 上,每个用户的路径/文件名都是随机的。数据库知道每个用户图像的路径。我的问题是,当用户在应用程序内导航时,会多次向个人资料图片发出获取请求。第一次之后,S3 返回 http 304 未修改状态。每个这样的获取请求是否都计入计费的获取请求配额?

答案1

我理解,您正在寻找确凿的证据,证明返回 304 的 GET 请求是否在计费方面算作 GET 请求,就像返回 200 的 GET 请求一样。

文档没有指出基于返回的 HTTP 状态代码的任何计费差异,但这并没有提供任何证据。为了给您一个肯定的答案,我设置了一个成本和使用情况报告针对我的帐户,将聚合频率设置为每小时并包含资源ID,然后测试它并查看报告中出现的内容。

TLDR;计费报告证实了每个人的预期,无论 GET 返回状态代码是 200 还是 304,它都按 GET 计费。

测试设置

我选择了一个未使用的可公开读取的 S3 存储桶,上传了一个图像文件,并在文件上设置了 Cache-Control: public, max-age=10 的 HTTP 标头。这意味着如果页面在 10 秒后重新加载,则浏览器必须与服务器核对文件是否已更改,然后才能使用其本地缓存的副本。

为了确保测试可重复且不会产生任何意外结果(例如由于拼写错误等),我创建了一个可以显示图像的本地 html 文件。

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

将其保存在本地机器上的原因是为了避免向 S3 发送任何有关 favicon 之类的请求(这可能会污染结果)。

确认测试有效

我在 Chrome 中进行了初步测试,打开开发者工具,查看网络选项卡并加载本地 html 文件。第一次请求时,图片加载时的 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 个请求。这意味着我的所有请求都已计费。

如果您想知道我如何确保没有其他使用存储桶的情况,我启用了 CloudTrail 的 S3 日志记录并将其指向 CloudWatch Logs。使用这个,我能够验证当时没有对存储桶发出其他请求。:)

答案2

每个这样的获取请求是否都计入计费的获取请求配额?

是的。“GET、SELECT 和所有其他请求”属于完全相同的价格类别(来源:Amazon S3 定价)。302 请求属于 GET 类别(谈论“请求定价”,您的问题不是关于“数据传输定价”)。

相关内容