Why S3 Request Pricing Differs Between GET and PUT - The Economics of Storage I/O

This article explains why S3 GET requests cost one-tenth of PUT requests by examining the internal costs of writes, erasure coding, and consistency guarantees, along with practical techniques for optimizing request charges.

The GET vs. PUT Price Gap - A 10x Difference

Under S3 Standard's pricing model, PUT/COPY/POST/LIST requests cost $0.005 per 1,000 requests, while GET/SELECT requests cost $0.0004 per 1,000 requests (in us-east-1). PUT is roughly 12.5 times more expensive than GET. This price difference is not arbitrary; it reflects AWS's internal cost structure. Writes (PUT) place a far greater load on S3's internal infrastructure than reads (GET). When a PUT request arrives, S3 redundantly writes data to multiple physical devices, updates the metadata index, and executes synchronous processing to guarantee consistency. A GET request simply locates the data's physical position from the metadata index and reads from a single copy. Because writes consume more computation, I/O, and network bandwidth, they are priced higher.

The Internal Cost of Writes - Erasure Coding and Redundancy

S3 uses erasure coding to achieve 11 nines (99.999999999%) of durability. Erasure coding splits data into multiple fragments, adds parity fragments, and enables data recovery even if some fragments are lost. When a PUT request is executed, S3 encodes the object data with erasure coding and writes the generated fragments to multiple physical devices across multiple AZs. This write does not complete until all fragments are confirmed to be safely stored. Since S3 introduced strong consistency in December 2020, a GET immediately after a PUT is guaranteed to return the latest data. To provide this consistency guarantee, PUT must update the metadata index synchronously, incurring additional latency and cost. GET simply reads the latest data location from the metadata index and decodes a subset of fragments. The processing is lightweight compared to writes.

Request Pricing Differences by Storage Class

Request pricing varies significantly across S3 storage classes. S3 Standard GET costs $0.0004 per 1,000 requests, but S3 Glacier Flexible Retrieval GET (restore request) costs $0.05 per 1,000 requests, which is 125 times more. Glacier's higher request pricing reflects the physical storage method. Glacier stores data on offline or nearline storage media, and reading requires physical operations such as mounting media and transferring data. These operational costs are reflected in the request pricing. S3 Intelligent-Tiering automatically moves objects to the optimal storage class based on access patterns. Frequently accessed objects stay in the Standard tier, objects not accessed for 30 days move to the Infrequent Access tier, and objects not accessed for 90 days move to the Archive Instant Access tier. While Intelligent-Tiering incurs a monitoring fee ($0.0025 per 1,000 objects per month), it can be more cost-effective than manually managing storage classes for workloads with unpredictable access patterns.

Practical Techniques for Optimizing Request Costs

Request costs become a concern with workloads that read and write large numbers of small objects. PUTting 1 million 1 KB objects costs $5 in request charges, while the storage cost is only $0.023. Request charges are over 200 times the storage cost. The first optimization technique is combining small objects into larger ones. Merging 1,000 1 KB objects into a single 1 MB object reduces PUT requests by a factor of 1,000. At read time, use S3 Select or Range GET to retrieve only the needed portions. The second technique is minimizing LIST requests. LIST costs the same as PUT ($0.005 per 1,000 requests). Frequently running LIST on buckets with large numbers of objects can drive up costs. If you need an object inventory, using S3 Inventory to periodically export bucket contents in CSV/ORC/Parquet format and analyzing with Athena is more economical. The third technique is placing CloudFront as a caching layer. When the same objects receive many GET requests, CloudFront caching can dramatically reduce the number of GET requests reaching S3.

Why DELETE Requests Are Free

S3 DELETE requests are free. This may seem surprising at first. DELETE also requires metadata index updates, so there are internal costs involved. The reason DELETE is free is an incentive design to encourage customers to release resources. If deleting objects incurred a charge, customers would hesitate to delete, and unnecessary data would accumulate. Accumulated unnecessary data consumes S3 storage capacity and increases AWS infrastructure costs. By making DELETE free, AWS encourages customers to actively delete unnecessary data, enabling efficient storage utilization. The same design philosophy is evident in lifecycle policies. Automatic object deletion and storage class transitions via lifecycle policies also incur no additional charges. AWS intentionally designs its pricing to make it easy for customers to take cost-optimization actions. To systematically learn about S3 cost optimization, specialized books (Amazon) are a great reference.