verification
use it
# add to stunt.yaml
services:
aws-s3:
adapter: embedded:aws-s3-style
# then
$ stunt upThe embedded: source extracts this adapter from the binary — no git clone, fully offline.
how to mock the Amazon S3 API locally
Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Amazon S3 API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Amazon S3 API 2006-03-01 surface — the data is fake, the behavior is real.
backing stores
bucketsobjects
api surface (8)
generated from the adapter manifest — exactly what boots, nothing more
8 routes
GET/{bucket}
PUT/{bucket}
DELETE/{bucket}
PUT/{bucket}/{key+}
GET/{bucket}/{key+}
HEAD/{bucket}/{key+}
DELETE/{bucket}/{key+}
POST/{bucket}/{key+}
SDK-verified behaviors (6)
- ✓CreateBucket
- ✓PutObject (binary body)
- ✓GetObject byte-exact round-trip (incl. non-UTF-8)
- ✓HeadObject metadata
- ✓ListObjectsV2 paginator follows continuation (4 over MaxKeys=2)
- ✓DeleteObject
Not implemented (5)
- No bucket policy, tagging, ACL, CORS, lifecycle, or website subresources
- No object versioning (?versions listing, versionId delete) or object lock
- No CopyObject (x-amz-copy-source) or UploadPartCopy
- No browser form POST uploads (POST policy)
- No ListMultipartUploads (GET /{bucket}?uploads)
Differs from the real API (5)
- ETags are SHA-256-based (real S3 uses MD5); multipart ETag is sha256(etags)-N
- Multipart 5 MiB minimum part size not enforced (small parts allowed)
- DELETE of a missing bucket is an idempotent 204 (real S3: 404 NoSuchBucket)
- SigV4 canonical URI/query rebuilt from decoded values — duplicates indistinguishable
- No RFC 1123 Date fallback; canonical header whitespace collapsing not applied
want more of the Amazon S3 API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.