Zipping a whole bucket sounds like the simplest case: select everything, compress it, done. In practice it is the case most likely to hit limits — of memory, of timeouts, of transfer costs. Here is what actually works.
What does not exist
- There is no "download as zip" button for an S3 bucket.
- The AWS CLI has no zip command (only copy, sync and friends).
Typical approaches and their limits
| Approach | What breaks first |
|---|---|
| CLI + local zip | Bandwidth and disk: every object is downloaded and re-uploaded. |
| Lambda | 15-minute timeout and limited /tmp space; large buckets need fan-out. |
| EC2 worker | Most capable, but you maintain an instance and pay for it idle. |
| Managed API | Needs a supported file layout and a plan large enough for the total size. |
The variables that decide success
- Total size. A bucket of 5 TB is not the same problem as 5 GB. Any single-process approach eventually runs out of time or memory.
- Number of objects. Thousands of small files cost more in request overhead than one big file.
- Prefix structure. A "bucket" is not a folder — choosing the prefix deliberately is what you are really doing.
- Where the recipient is. If the person downloading is outside AWS, you pay egress for the archive no matter how you built it.
The practical recipe
Zip by prefix rather than the whole bucket — it keeps each job to a sensible size and makes reruns cheap. With S3zipper, pass the prefix as the path and let the API expand it:
"filePaths": ["my-bucket/snapshots/2026-10"]
For genuinely huge sets, split by prefix or month and start one job per chunk. Because each job returns a signed URL, you can hand out several archives instead of one unwieldy file.
What about a bucket with no subfolders?
Pass the bucket prefix with a trailing slash (my-bucket/) and the objects at the root are expanded. If that is millions of objects, split the work anyway — a single archive with millions of entries is slow to create and unpleasant to open.
Next: how to zip a folder in Amazon S3, or the full API walkthrough.