Skip to content
Back to main site

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.

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.

Terminal window
export VERA_ENDPOINT="http://localhost:5003"
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test
export AWS_REGION=us-east-1 AWS_DEFAULT_REGION=us-east-1
export AWS_SHARED_CREDENTIALS_FILE=/dev/null
export AWS_EC2_METADATA_DISABLED=true
export AWS_PAGER="" AWS_CLI_AUTO_PROMPT=off
unset AWS_PROFILE AWS_DEFAULT_PROFILE
unset AWS_SESSION_TOKEN AWS_SECURITY_TOKEN
unset AWS_WEB_IDENTITY_TOKEN_FILE AWS_ROLE_ARN AWS_ROLE_SESSION_NAME
unset AWS_CONTAINER_CREDENTIALS_FULL_URI
unset AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
cat > vera-aws-config <<'EOF'
[default]
region = us-east-1
output = json
cli_binary_format = base64
s3 =
addressing_style = path
EOF
export 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.

Create a bucket, upload a small file to it and download it again.

Terminal window
printf 'Vera documentation object\n' > payload.txt
aws --endpoint-url "$VERA_ENDPOINT" s3api create-bucket --bucket vera-docs-storage
aws --endpoint-url "$VERA_ENDPOINT" s3api put-object \
--bucket vera-docs-storage --key hello.txt --body payload.txt
aws --endpoint-url "$VERA_ENDPOINT" s3api get-object \
--bucket vera-docs-storage --key hello.txt download.txt

The download writes the object to download.txt and prints its metadata, including these fields. Time fields differ on every run.

Output (selected fields)
{
"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:

Terminal window
cmp payload.txt download.txt
aws --endpoint-url "$VERA_ENDPOINT" s3api head-object --bucket vera-docs-storage --key hello.txt

cmp 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:

Terminal window
aws --endpoint-url "$VERA_ENDPOINT" s3api delete-object --bucket vera-docs-storage --key hello.txt
aws --endpoint-url "$VERA_ENDPOINT" s3api delete-bucket --bucket vera-docs-storage
rm payload.txt download.txt
  • Buckets, created, checked with HeadBucket and deleted. In earlier testing, HeadBucket returned 404 once a bucket was deleted.
  • Objects, uploaded with PutObject, downloaded byte for byte with GetObject, inspected with HeadObject and deleted, with an ETag and a CRC64NVME checksum.
  • Copies: CopyObject made 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: ListObjectsV2 showed 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.

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-4 of an 11-byte object holding hello-world. Both got the whole 11 bytes with HTTP 200, though the response had AcceptRanges: 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 ListObjectVersions listed both. An ordinary get returned the latest body, two, but a get with the first put’s VersionId returned 404 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 ServerSideEncryption set to AES256, but that doesn’t show they’re encrypted at rest.
  • Higher-level commands and bucket automation weren’t tested. The aws s3 commands, 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.

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

OperationStatusNotes
AbortMultipartUploadImplemented
CompleteMultipartUploadImplementedLocal 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.
CopyObjectImplementedLocal observation: Vera 1.2.0 preview, 5 November 2026 — made a byte-for-byte copy of an object.
CreateBucketImplementedLocal observation: Vera 1.2.0 preview, 5 November 2026 — created a bucket used with path-style addressing.
CreateBucketMetadataConfigurationImplemented
CreateBucketMetadataTableConfigurationImplemented
CreateMultipartUploadImplementedLocal 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.
CreateSessionImplemented
DeleteBucketImplementedLocal observation: Vera 1.2.0 preview, 5 November 2026 — deleted an empty bucket.
DeleteBucketAnalyticsConfigurationImplemented
DeleteBucketCorsImplemented
DeleteBucketEncryptionImplemented
DeleteBucketIntelligentTieringConfigurationImplemented
DeleteBucketInventoryConfigurationImplemented
DeleteBucketLifecycleImplemented
DeleteBucketMetadataConfigurationImplemented
DeleteBucketMetadataTableConfigurationImplemented
DeleteBucketMetricsConfigurationImplemented
DeleteBucketOwnershipControlsImplemented
DeleteBucketPolicyImplemented
DeleteBucketReplicationImplemented
DeleteBucketTaggingImplemented
DeleteBucketWebsiteImplemented
DeleteObjectImplementedLocal observation: Vera 1.2.0 preview, 5 November 2026 — deleted the example object.
DeleteObjectAnnotationNot implemented
DeleteObjectTaggingImplemented
DeleteObjectsImplemented
DeletePublicAccessBlockImplemented
GetBucketAbacImplemented
GetBucketAccelerateConfigurationImplemented
GetBucketAclImplemented
GetBucketAnalyticsConfigurationImplemented
GetBucketCorsImplemented
GetBucketEncryptionImplemented
GetBucketIntelligentTieringConfigurationImplemented
GetBucketInventoryConfigurationImplemented
GetBucketLifecycleImplemented
GetBucketLifecycleConfigurationImplemented
GetBucketLocationImplemented
GetBucketLoggingImplemented
GetBucketMetadataConfigurationImplemented
GetBucketMetadataTableConfigurationImplemented
GetBucketMetricsConfigurationImplemented
GetBucketNotificationImplemented
GetBucketNotificationConfigurationImplemented
GetBucketOwnershipControlsImplemented
GetBucketPolicyImplemented
GetBucketPolicyStatusImplemented
GetBucketReplicationImplemented
GetBucketRequestPaymentImplemented
GetBucketTaggingImplemented
GetBucketVersioningImplemented
GetBucketWebsiteImplemented
GetObjectKnown differenceLocal 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.
GetObjectAclImplemented
GetObjectAnnotationNot implemented
GetObjectAttributesImplemented
GetObjectLegalHoldImplemented
GetObjectLockConfigurationImplemented
GetObjectRetentionImplemented
GetObjectTaggingImplemented
GetObjectTorrentKnown differenceSource 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.
GetPublicAccessBlockImplemented
HeadBucketImplementedLocal observation: Vera 1.2.0 preview, 5 November 2026 — checked an existing bucket.
HeadObjectImplementedLocal 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.
ListBucketAnalyticsConfigurationsImplemented
ListBucketIntelligentTieringConfigurationsImplemented
ListBucketInventoryConfigurationsImplemented
ListBucketMetricsConfigurationsImplemented
ListBucketsImplemented
ListDirectoryBucketsImplemented
ListMultipartUploadsImplemented
ListObjectAnnotationsNot implemented
ListObjectVersionsImplementedLocal 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.
ListObjectsImplemented
ListObjectsV2ImplementedLocal 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.
ListPartsImplemented
PutBucketAbacImplemented
PutBucketAccelerateConfigurationImplemented
PutBucketAclImplemented
PutBucketAnalyticsConfigurationImplemented
PutBucketCorsImplemented
PutBucketEncryptionImplemented
PutBucketIntelligentTieringConfigurationImplemented
PutBucketInventoryConfigurationImplemented
PutBucketLifecycleImplemented
PutBucketLifecycleConfigurationImplemented
PutBucketLoggingImplemented
PutBucketMetricsConfigurationImplemented
PutBucketNotificationImplemented
PutBucketNotificationConfigurationImplemented
PutBucketOwnershipControlsImplemented
PutBucketPolicyImplemented
PutBucketReplicationImplemented
PutBucketRequestPaymentImplemented
PutBucketTaggingImplemented
PutBucketVersioningImplementedLocal 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.
PutBucketWebsiteImplemented
PutObjectImplementedLocal observation: Vera 1.2.0 preview, 5 November 2026 — stored a 26-byte object that GetObject returned byte for byte.
PutObjectAclImplemented
PutObjectAnnotationNot implemented
PutObjectLegalHoldImplemented
PutObjectLockConfigurationImplemented
PutObjectRetentionImplemented
PutObjectTaggingImplemented
PutPublicAccessBlockImplemented
RenameObjectImplemented
RestoreObjectImplemented
SelectObjectContentKnown differenceSource 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.
UpdateBucketMetadataAnnotationTableConfigurationNot implemented
UpdateBucketMetadataInventoryTableConfigurationImplemented
UpdateBucketMetadataJournalTableConfigurationImplemented
UpdateObjectEncryptionImplemented
UploadPartImplementedLocal 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.
UploadPartCopyImplemented
WriteGetObjectResponseImplemented