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

Pra*_*pta 4 amazon-s3

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

Ale*_*gue 6

我知道您正在寻找关于返回 304 的 GET 请求是否被计为用于计费目的的 GET 请求的确切证据,与返回 200 的 GET 请求相同。

该文档没有根据返回的 HTTP 状态代码指出任何计费差异,但这并没有以一种或另一种方式提供任何证据。为了给您一个明确的答案,我为我的帐户设置了一个成本和使用报告,聚合频率设置为每小时并包含资源 ID,然后对此进行了测试并查看了报告中出现的内容。

TLDR;计费报告确认了每个人的预期,无论 GET 返回 200 还是 304 状态代码,都将作为 GET 计费。

测试设置

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

为了确保测试是可重复的并且没有任何意外的结果(例如,错误等),我创建了一个本地 html 文件来显示图像。

<html>
<body>
<img src="http://mybucket.s3.amazonaws.com/5DS05736-2.jpg" width="868" height="488" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

将它保留在我的本地机器上的原因是为了避免对 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')
Run Code Online (Sandbox Code Playgroud)

将其缩小到您正在寻找的用法的查询是:

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
Run Code Online (Sandbox Code Playgroud)

您需要将 my-bucket 和 USW2-Requests-Tier2 更改为适合您的存储桶和存储桶位置等的值。

在我执行测试的那个小时,lineitem_usageamount 列列出了 3 个请求。这意味着我的所有请求都已计费。

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