Documentation

Supported S3 operations matrix

What an authenticated SDK call to the proxy will and will not do. Generated from internal/s3proxy/server.go::classifyOperation.

#Forwarded to the upstream

These are recognised, scope-checked, and forwarded:

OperationHTTP shapeNotes
GetObjectGET /<bucket>/<key>Range requests supported.
HeadObjectHEAD /<bucket>/<key>
PutObjectPUT /<bucket>/<key>Quota pre-check applies.
DeleteObjectDELETE /<bucket>/<key>
DeleteObjectsPOST /<bucket>?deleteMulti-key delete.
CopyObjectPUT /<bucket>/<key> with x-amz-copy-sourceSame-backend only.
ListObjects / ListObjectsV2GET /<bucket>?...
HeadBucketHEAD /<bucket>
GetBucketLocationGET /<bucket>?locationRegion per backend config.
CreateMultipartUploadPOST /<bucket>/<key>?uploads
UploadPartPUT /<bucket>/<key>?partNumber=<n>&uploadId=<id>
CompleteMultipartUploadPOST /<bucket>/<key>?uploadId=<id>
AbortMultipartDELETE /<bucket>/<key>?uploadId=<id>
ListMultipartUploadsGET /<bucket>?uploads
ListPartsGET /<bucket>/<key>?uploadId=<id>

#Synthesised by the proxy

ListBuckets (GET /) is built from your credential's bucket scope. Never reaches the upstream.

#Rejected at the proxy

  • Bucket creation / deletion (PutBucket / DeleteBucket) — not exposed to tenant credentials. Use the dashboard's bucket-CRUD for these.
  • Anything not in the recognised list — returns 400 InvalidRequest. The proxy tags the operation as Unknown for metrics.
  • Bucket configuration ops (versioning, CORS, lifecycle, policy) — not exposed to tenant credentials. The dashboard's bucket- settings handlers go directly to the upstream via the Backend interface, not through the proxy.

#Anonymous read fast-path

Anonymous requests (no SigV4) are allowed only for these operations, and only against buckets with an active anonymous binding:

  • GetObject
  • HeadObject
  • ListObjectsV2

Everything else returns 401.

#Behaviour matrix per status path

PathBackend callAudit rowQuota check
Authenticated successful readyessampled (default no)no
Authenticated successful writeyesalwaysyes
Authenticated denied (scope)noalwaysn/a
Authenticated bad signaturenoalways (auth_failure)n/a
Anonymous read (allowlisted)yessampledno
Anonymous read (denied operation)noalwaysn/a
Quota exceeded on writenoalways (507)yes
Rate-limited (429)noalwaysn/a

#Performance characteristics

The proxy does not cache object data. Every forwarded request is one round trip to the upstream. For the canonical numbers under matched 1 CPU / 200 MiB constraints, see Explanations → Benchmarks.

The proxy does cache:

  • SigV4 derived signing keys per (akid, date, region, service).
  • Per-credential decryption results, so a hot credential isn't re-decrypted on every request.
  • The Kubernetes informer's view of operator-written Secrets.

These caches invalidate on credential mutation events; you don't need to flush anything.