我将用户个人资料图片保存在 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 类别(谈论“请求定价”,您的问题不是关于“数据传输定价”)。