storage

Amazon S3

Object storage for any amount of data — and the origin behind most production static sites. Here's what S3 is good for, what it costs, how it connects to CloudFront, Lambda, and your queues, and the mistakes Design Beaver catches as you draw.

Updated July 12, 2026

What S3 is

S3 stores files — “objects” — in buckets and serves them over HTTP(S). There’s no server to manage: you upload objects and S3 handles durability, scaling, and availability. For a website, it can serve HTML, CSS, JS, and images directly from a bucket, or — the path you actually want in production — act as the origin behind a CloudFront distribution.

Design Beaver models S3 as a regional, API-accessed service rather than something that sits inside a VPC subnet, and validates as you draw which services can use it and how that connection has to be set up to be correct.

When to use S3 (and when not to)

Reach for S3 when you’re serving files with no server-side logic, when you need an origin behind CloudFront for a public-facing site, or when you’re storing objects that don’t need the query and index capability a database gives you.

Don’t reach for it when you need HTTPS on the bucket’s website endpoint directly — S3 website endpoints don’t support it, and the fix is CloudFront, not a bucket setting. It’s also the wrong tool when you need server-side rendering or dynamic per-request responses.

Variants: storage classes

S3’s “variants” are storage classes — the dial between how fast you can retrieve data and how little you pay to keep it. Standard is the default a static site’s assets sit in; the Glacier tiers trade retrieval speed for cost.

OptionWhat it is
S3 StandarddefaultGeneral-purpose storage for frequently accessed data. What a static site's assets sit in by default.
S3 Intelligent-TieringAutomatically moves objects between frequent/infrequent/archive tiers based on access patterns. No retrieval fees.
S3 Glacier Instant RetrievalArchive storage with millisecond retrieval — for rarely accessed data that still needs to be fetched fast when requested.
S3 Glacier Flexible RetrievalLower-cost archive; retrieval takes minutes (expedited) to hours (standard).
S3 Glacier Deep ArchiveLowest-cost storage class — for data retrieved at most a few times a year; retrieval takes hours.

S3 pricing

You pay for what you store, plus requests and data transfer — and the storage class you pick moves the per-GB number by more than an order of magnitude.

Pay per GB stored per month, plus request and data-transfer charges. Varies significantly by storage class.

OptionRepresentative rate
standard$0.023/GB for the first 50 TB/month
intelligent-tiering$0.0025 per 1,000 objects/month monitoring fee; no retrieval charges
glacier-instant-retrieval$0.004/GB
glacier-flexible-retrieval$0.0036/GB storage; ~$0.03/GB for expedited retrieval
glacier-deep-archive$0.00099/GB

Keeping the bill down

  • Use Intelligent-Tiering when access patterns are unpredictable — avoids hand-written lifecycle rules
  • Use lifecycle policies to move cold data into Glacier tiers automatically

us-east-1 (rates vary by region). Rates as of 2026-07. Verify at the official pricing page before using for real cost estimates — this list is not kept in sync with AWS pricing changes.

How S3 connects to other services

S3 is rarely a lone box on a diagram — it’s an origin, an event source, and a destination. Each of those edges has a requirement that makes it actually work, and Design Beaver models them so it knows what belongs on each connection.

  • CloudFront distribution uses the S3 bucket as its origin

  • S3 event notifications trigger a Lambda function (e.g. process file on upload)

  • EC2

    An application running on the EC2 instance reads/writes S3 objects via the AWS SDK (e.g. uploading user content, reading config/assets, writing logs or backups)

  • SQS

    S3 event notifications (object created/removed) are delivered to an SQS queue, so a consumer can process uploads asynchronously without S3 invoking it directly

  • SNS

    S3 event notifications are published to an SNS topic, which then fans the event out to multiple subscribers (several queues/functions reacting to the same upload)

  • With EventBridge notifications turned on for the bucket, S3 sends every object event (created, removed, restored, etc.) to the default event bus, where rules route and filter it to any target — richer routing than S3's built-in SNS/SQS/Lambda notifications, and the way to reach targets S3 can't notify directly (e.g. a FIFO queue)

What S3 can’t connect to

A few edges look plausible on a canvas but aren’t real AWS integrations. Design Beaver flags them instead of letting you draw a diagram that can’t be built.

  • RDS

    No native direct integration — S3 is not a drawable connection target for RDS; data movement between them (e.g. Aurora's S3 import/export) is an engine feature invoked by application code, not an architectural connection

  • S3 has no relationship with Route 53 pointing outward from it — a Route 53 alias record can point at an S3 website endpoint, but that's Route 53 connecting to S3, never S3 connecting to Route 53

  • Peer AWS storage/database services with no native direct integration between them — S3's export/import features for other services (e.g. Aurora) don't extend to DynamoDB, and an application would use both independently rather than connecting them as an architectural edge

Anti-patterns Design Beaver catches

Public S3 bucket serving a website directly, with no CloudFront in front

Why it breaksNo HTTPS on the website endpoint, no CDN caching or edge locations, and Block Public Access must be disabled on the bucket to allow it

Do this insteadPut CloudFront in front using OAC; keep Block Public Access enabled on the bucket

Gotchas that bite in production

  • S3 website endpoints don’t do HTTPS. If someone asks why they can’t get a padlock on their S3 site, this is why — the fix is CloudFront in front, not a bucket setting.
  • Use OAC, not the legacy OAI. Origin Access Control is the current best practice for restricting CloudFront → S3 access. OAI (Origin Access Identity) is the older mechanism; new setups should use OAC.
  • A fully public website bucket works, but it’s the anti-pattern. Serving directly from a public bucket means no HTTPS, no CDN, and disabling Block Public Access. Put CloudFront in front and keep the bucket private.
  • S3 event notifications to a queue have rules. They reach standard SQS queues, not FIFO — route through EventBridge if an event needs to land in a FIFO queue.

Further reading

Frequently asked questions

When should you use Amazon S3?
Use S3 to serve files with no server-side logic — a portfolio, docs site, or SPA — as the origin behind a CloudFront distribution, or to store app assets like images, video, backups, and logs. It's a poor fit when you need HTTPS directly on the bucket's website endpoint (that's what CloudFront is for) or server-side rendering.
Does an S3 static website support HTTPS?
No — S3 website endpoints don't support HTTPS. If you need a padlock on your S3-hosted site, put CloudFront in front of the bucket; that's what terminates HTTPS and adds CDN caching. Serving directly from a public bucket gives up HTTPS, the CDN, and edge performance.
How much does Amazon S3 cost?
S3 bills per GB stored per month plus request and data-transfer charges, and the rate varies a lot by storage class — S3 Standard for frequently accessed data down to Glacier Deep Archive for data you touch a few times a year. Verify current rates on the official pricing page before estimating a bill.
How do you connect CloudFront to an S3 bucket correctly?
Use Origin Access Control (OAC) on the CloudFront origin and keep the bucket's Block Public Access settings on, so all traffic is forced through CloudFront and the bucket stays private. Making the bucket public to serve the site directly is the anti-pattern Design Beaver flags.

Validate your S3 architecture as you draw

Design Beaver checks your AWS design in real time — missing queues, invalid connections, and security anti-patterns, caught before you ship. It’s live in beta, free, and runs in your browser with no account.

Open the app →

Prefer email? Get new features in your inbox:

← All supported services