Included transfer
Bucket internet downloads consume the shared billing pool: 1 TB per organization per month plus earned instance allowances, including load balancer and database instances. Only overage is charged. Storage capacity and request prices remain separate.Objects and their limits
These are S3’s own numbers, and they are enforced at S3’s values:
The 5 MiB floor applies to every part except the last one named at completion,
and it is checked at completion, not when the part is uploaded. A part list
whose non-final part is short fails with
EntityTooSmall after the bytes are
already staged.
Uploads you start and never finish keep their staged parts until something
removes them. Add an abort_incomplete_multipart_upload lifecycle
rule rather than relying on remembering.
Declare the upload length
Object uploads and multipart part uploads must promise their payload length. SendContent-Length on the storage API and on ordinary S3 uploads. Empty
uploads remain supported with length 0; server-side copies do not need an
upload body length.
For supported S3 aws-chunked streaming modes, send
X-Amz-Decoded-Content-Length: it counts payload bytes, excluding framing and
trailers. The encoded wire length cannot replace it. Adding this header to a
bare chunked request does not make that request an AWS streaming upload.
Uploads without a declared payload length receive HTTP 411 before storage:
MISSING_CONTENT_LENGTH on the storage API, or MissingContentLength on S3.
A body that ends short of its declared length is rejected; a rejected part
retry leaves the previously stored part intact.
If you produce a pipe, generator, or archive of unknown size, buffer it to a
file and send its measured length. For larger streams, buffer each multipart
part and declare that part’s length. You do not need the complete object’s
length in advance. Keep the multipart size limits above in mind.
The Go SDK determines the remaining length of seekable bodies, including
files, starting with v0.3.2. An arbitrary reader still needs a known length or
buffering. An ETag alone cannot tell whether a producer delivered all the bytes
it intended to send.
Storage classes
Two classes, and they name device tiers rather than access patterns:
They keep S3’s uppercase spelling because the vocabulary is S3’s. Set a class
per object with
x-amz-storage-class on the upload, or move objects between
classes with a lifecycle transition. The two classes bill separately, so the
label an object carries decides which counter and which price its bytes land on.
An unsupported class — STANDARD_IA, GLACIER, anything else S3 defines — is
rejected rather than quietly stored as STANDARD.
Working with objects through the storage API
You do not need an S3 client. The storage API exposes the same object plane under/v1/buckets/{bucket}/objects, authenticated with your ordinary
Basaltic credentials exactly like every other call to this API — useful for a
service that already holds them and should not carry an S3 SDK as well:
- Console
- API
- CLI
- Go
A bucket’s Objects tab is a file browser over the same routes.
Upload opens the Upload objects page, where you set a Folder
prefix, pick a Storage class — Standard or Cold — and add
Files. New folder creates a prefix, and selecting rows gives you
Delete selected, which issues one delete per key rather than a bulk
request — see the note below.Opening an object gives you Download and Delete, a Versions
tab, and a Properties tab carrying its Tags alongside the
retention controls.
?tagging,
?retention, ?legal-hold — and the same X-Amz-* headers apply on upload for
storage class, encryption and object-lock settings. delimiter gives you the
usual folder semantics through common_prefixes, and max_keys is capped at
1000 per page.
Bulk delete (
POST ?delete) and server-side copy (x-amz-copy-source) are S3
endpoint features. Through the storage API, delete objects one at a time.
