Amazon S3
Create buckets and store, retrieve, copy and delete object bytes.
Plan: Free111 of 116 operations implemented3Known differences
Basic object reads work; range reads and reads of a specified older version failed in testing of Vera 1.2.0 preview.
Example checked on Vera 1.2.2, 8 November 2026. Each coverage note names its own evidence and date.
Connect
Section titled “Connect”This Free service needs no license key. Start Vera as in Get started, then run this in a terminal of its own, from an empty scratch directory. It gives the official AWS CLI dummy credentials and a config file of its own, so no AWS account is needed and your own AWS profile isn't touched.
export VERA_ENDPOINT="http://localhost:5003"export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=testexport AWS_REGION=us-east-1 AWS_DEFAULT_REGION=us-east-1export AWS_SHARED_CREDENTIALS_FILE=/dev/nullexport AWS_EC2_METADATA_DISABLED=trueexport AWS_PAGER="" AWS_CLI_AUTO_PROMPT=offunset AWS_PROFILE AWS_DEFAULT_PROFILEunset AWS_SESSION_TOKEN AWS_SECURITY_TOKENunset AWS_WEB_IDENTITY_TOKEN_FILE AWS_ROLE_ARN AWS_ROLE_SESSION_NAMEunset AWS_CONTAINER_CREDENTIALS_FULL_URIunset AWS_CONTAINER_CREDENTIALS_RELATIVE_URIcat > vera-aws-config <<'EOF'[default]region = us-east-1output = jsoncli_binary_format = base64s3 = addressing_style = pathEOFexport AWS_CONFIG_FILE="$PWD/vera-aws-config"When you've finished every example in this terminal, close it and delete vera-aws-config, not before.
The example uses the AWS CLI’s s3api commands. The emulator serves the 2006-03-01 API over the REST XML protocol, and the example was checked with the official AWS CLI 2.31.35. The higher-level aws s3 commands weren’t tested.
The config file turns on path-style addressing, so a bucket and its objects are paths on VERA_ENDPOINT: hello.txt in vera-docs-storage is $VERA_ENDPOINT/vera-docs-storage/hello.txt. In earlier testing, an unsigned GET of that URL returned the object’s bytes.
Example
Section titled “Example”Create a bucket, upload a small file to it and download it again.
printf 'Vera documentation object\n' > payload.txtaws --endpoint-url "$VERA_ENDPOINT" s3api create-bucket --bucket vera-docs-storageaws --endpoint-url "$VERA_ENDPOINT" s3api put-object \ --bucket vera-docs-storage --key hello.txt --body payload.txtaws --endpoint-url "$VERA_ENDPOINT" s3api get-object \ --bucket vera-docs-storage --key hello.txt download.txtThe download writes the object to download.txt and prints its metadata, including these fields. Time fields differ on every run.
{ "ContentLength": 26, "ETag": "\"37d345de60cd441214979010cfd6717c\"", "ChecksumCRC64NVME": "nIS13osbxSA=", "ChecksumType": "FULL_OBJECT", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256"}ServerSideEncryption is a returned field: it doesn’t show that the object is encrypted at rest.
Compare the download with the original using cmp, then read the object’s metadata again:
cmp payload.txt download.txtaws --endpoint-url "$VERA_ENDPOINT" s3api head-object --bucket vera-docs-storage --key hello.txtcmp prints nothing and exits with status 0: the downloaded file is byte for byte the same 26 bytes as payload.txt. The head-object output has the same ContentLength, ETag, ContentType and ServerSideEncryption as the download.
To clean up, delete the object and the bucket, then the two local files:
aws --endpoint-url "$VERA_ENDPOINT" s3api delete-object --bucket vera-docs-storage --key hello.txtaws --endpoint-url "$VERA_ENDPOINT" s3api delete-bucket --bucket vera-docs-storagerm payload.txt download.txtSupported features
Section titled “Supported features”- Buckets, created, checked with
HeadBucketand deleted. In earlier testing,HeadBucketreturned404once a bucket was deleted. - Objects, uploaded with
PutObject, downloaded byte for byte withGetObject, inspected withHeadObjectand deleted, with anETagand a CRC64NVME checksum. - Copies:
CopyObjectmade a byte-for-byte copy of an object. - Multipart uploads, with a single part: an upload was created, its one part uploaded and the upload completed, and the object read back. See Limitations for what wasn’t tested.
- Versioning settings and version lists: a bucket’s versioning setting is recorded, and two puts of the same key in a versioned bucket gave two version IDs, both listed by
ListObjectVersions. Reading an older version failed: see Limitations. - Objects from other services: Data Firehose writes the records it delivers to buckets in the emulator.
- Object listing, in other services’ examples:
ListObjectsV2showed that the DataSync example’s destination bucket stayed empty, and found an object delivered in a Data Firehose diagnostic. Pagination and other listing variants weren’t checked. - Also served, not yet tested: batch deletes, bucket settings such as CORS, encryption, lifecycle, logging, notifications, policies, replication, tagging and websites, object tags, ACLs, legal holds and retention, restores and
SelectObjectContent.
Limitations
Section titled “Limitations”The main limits are below. A few more apply to every service, and the API coverage notes cover smaller differences.
- Range reads returned the whole object. In Vera 1.2.0 preview, a standard SDK and the official AWS CLI asked for
Range: bytes=0-4of an 11-byte object holdinghello-world. Both got the whole 11 bytes with HTTP200, though the response hadAcceptRanges: bytes. Range reads weren’t checked again on Vera 1.2.0-rc.3. - Older versions couldn’t be read. In a versioned bucket in Vera 1.2.0 preview, two puts of the same key gave two version IDs, and
ListObjectVersionslisted both. An ordinary get returned the latest body,two, but a get with the first put’sVersionIdreturned404 NoSuchKey. Listing versions doesn’t mean you can read them. - Only a small multipart upload was tested. One 14-byte part was uploaded and completed. Large parts, uploads of several parts, conditional requests, concurrent uploads and multipart failure handling weren’t verified.
- Encryption wasn’t tested. Objects come back with
ServerSideEncryptionset toAES256, but that doesn’t show they’re encrypted at rest. - Higher-level commands and bucket automation weren’t tested. The
aws s3commands, lifecycle rules running, event notifications being delivered, replication and access policy enforcement weren’t verified. Directory buckets and S3 Express sessions weren’t tested either. - S3 Select and torrents may be synthetic. Earlier source inspection, not a run of a release build, found that S3 Select returns stored data without evaluating SQL, and that torrent responses are synthetic and don’t describe the object.
API coverage
Section titled “API coverage”Every operation in AWS's published 2006-03-01 API (SDK model, botocore 1.43.105), and whether the emulator implements it. Availability combines the earlier implementation inventory with the dated observations below; checking a page's example does not verify every operation. Each note names its evidence first; an observation given without a build or date comes from earlier testing, on 3 November 2026. What the statuses mean
No operation matches .
Try part of a name, such as AbortMultipartUpload, or .
| Operation | Status | Notes |
|---|---|---|
| Abort | Implemented | |
| Complete | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — a single 14-byte part was uploaded, the upload completed and the object read back. Large parts, several parts, concurrency and failure handling weren't checked. |
| Copy | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — made a byte-for-byte copy of an object. |
| Create | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — created a bucket used with path-style addressing. |
| Create | Implemented | |
| Create | Implemented | |
| Create | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — a single 14-byte part was uploaded, the upload completed and the object read back. Large parts, several parts, concurrency and failure handling weren't checked. |
| Create | Implemented | |
| Delete | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — deleted an empty bucket. |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — deleted the example object. |
| Delete | Not implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Delete | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Known difference | Local observation: Vera 1.2.0 preview, 5 November 2026 — returned a 26-byte object byte for byte. A request with Range: bytes=0-4 for an 11-byte object returned the whole object with HTTP 200, though the response has AcceptRanges: bytes. In a versioned bucket, a get with the first version's VersionId returned 404 NoSuchKey, while an ordinary get returned the latest body. |
| Get | Implemented | |
| Get | Not implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Implemented | |
| Get | Known difference | Source inspection: Returns a synthetic, name-based torrent-shaped payload with a fixed zero object length; it does not describe the actual object content or establish working torrent distribution. |
| Get | Implemented | |
| Head | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — checked an existing bucket. |
| Head | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — returned the object's ContentLength, ETag, ContentType and ServerSideEncryption. The AES256 value doesn't establish encryption at rest. |
| List | Implemented | |
| List | Implemented | |
| List | Implemented | |
| List | Implemented | |
| List | Implemented | |
| List | Implemented | |
| List | Implemented | |
| List | Not implemented | |
| List | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — listed both version IDs of a key put twice in a versioned bucket. Reading the older version failed: see GetObject. |
| List | Implemented | |
| List | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — showed an empty destination bucket in the DataSync example and found an object delivered in a Data Firehose diagnostic. Pagination and other listing variants weren't checked. |
| List | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — recorded versioning on a bucket, and two puts of one key then gave two version IDs. |
| Put | Implemented | |
| Put | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — stored a 26-byte object that GetObject returned byte for byte. |
| Put | Implemented | |
| Put | Not implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Put | Implemented | |
| Rename | Implemented | |
| Restore | Implemented | |
| Select | Known difference | Source inspection: Returns the stored object body without evaluating the SQL expression. This cannot validate SQL filtering. The wire-level event stream was not newly tested. |
| Update | Not implemented | |
| Update | Implemented | |
| Update | Implemented | |
| Update | Implemented | |
| Upload | Implemented | Local observation: Vera 1.2.0 preview, 5 November 2026 — a single 14-byte part was uploaded, the upload completed and the object read back. Large parts, several parts, concurrency and failure handling weren't checked. |
| Upload | Implemented | |
| Write | Implemented |