Applies to VAST Cluster 5.5.
VAST Cluster 5.5 supports a subset of the Amazon S3 REST API. This page lists the supported requests, the supported headers, the differences from AWS S3 that affect applications, and VAST's own additions. When a request isn't listed here, assume it isn't supported and test before you depend on it.
Protocol basics
| Area | VAST Cluster 5.5 |
|---|---|
| Authentication | AWS Signature Version 4 and Version 2. Presigned URLs (query-string authentication). Anonymous requests only where your platform team allows them on the view. |
| Credentials | Access key pairs created in VMS for a VAST user, one tenant per key pair. Temporary credentials from the cluster's STS (AssumeRole, AssumeRoleWithWebIdentity), over HTTPS only: AssumeRole over HTTP gets 403 AccessDenied. |
| Transport | HTTP and HTTPS, both on by default; either can be disabled. Standard ports only (80, 443). |
| Addressing | Path-style (https://endpoint/bucket/key). A virtual-hosted-style request (https://bucket.endpoint/key) got 501 NotImplemented, so configure clients for path-style. |
| Region | Any region name is accepted for signing. HeadBucket reports the region vast; GetBucketLocation returns vast-1, also for a bucket created with CreateBucket and no location constraint. |
| Buckets | Bucket names are unique across the cluster (all tenants), 3–63 characters, DNS-style: lowercase letters, digits, hyphens and dots, starting and ending each label with a letter or digit. Names that break these rules get 400 InvalidBucketName. A bucket can't be renamed or moved. |
| Keys | Up to 1,024 characters (longer: 400 KeyTooLong) and up to 198 / characters (more: 400 InvalidArgument). Each part between slashes is a file or directory name, so it's limited to 255 characters with the default name-length setting (400 InvalidObjectName). See concepts for keys that aren't visible over NFS. |
Supported requests
The supported requests, with the IAM action each needs in a policy. Each request in the table was run on a 5.5 cluster, except PutBucketLogging, PutBucketNotificationConfiguration, PutBucketOwnershipControls, DeleteObjectTagging, the per-version tagging requests and AssumeRoleWithWebIdentity:
| Area | Requests | Action in a policy |
|---|---|---|
| Buckets | ListBuckets |
s3:ListAllMyBuckets |
CreateBucket, DeleteBucket |
s3:CreateBucket, s3:DeleteBucket |
|
HeadBucket, ListObjects, ListObjectsV2 |
s3:ListBucket |
|
GetBucketLocation |
s3:GetBucketLocation |
|
| Bucket policy | GetBucketPolicy, PutBucketPolicy, DeleteBucketPolicy |
same names |
| Bucket ACLs | GetBucketAcl, PutBucketAcl |
same names |
| Bucket tags | GetBucketTagging, PutBucketTagging, DeleteBucketTagging |
s3:GetBucketTagging, s3:PutBucketTagging (also for delete) |
| Bucket logging | GetBucketLogging, PutBucketLogging |
same names |
| Event notifications | GetBucketNotificationConfiguration, PutBucketNotificationConfiguration |
s3:GetBucketNotification, s3:PutBucketNotification |
| CORS | GetBucketCors, PutBucketCors, DeleteBucketCors |
s3:GetBucketCORS, s3:PutBucketCORS, s3:DeleteBucketCORS |
| Ownership | GetBucketOwnershipControls, PutBucketOwnershipControls |
s3:PutBucketOwnershipControls |
| Objects | PutObject, GetObject, HeadObject, CopyObject, DeleteObject, DeleteObjects |
s3:PutObject, s3:GetObject (also HEAD; CopyObject needs both), s3:DeleteObject |
| Object ACLs | GetObjectAcl, PutObjectAcl |
same names |
| Object tags | GetObjectTagging, PutObjectTagging, DeleteObjectTagging (also per version) |
same names (...VersionTagging per version) |
| Multipart | CreateMultipartUpload, UploadPart, UploadPartCopy, CompleteMultipartUpload, AbortMultipartUpload, ListParts, ListMultipartUploads |
s3:PutObject (and s3:GetObject for UploadPartCopy), s3:AbortMultipartUpload, s3:ListMultipartUploadParts, s3:ListBucketMultipartUploads |
| Versioning | GetBucketVersioning, PutBucketVersioning (enable only), ListObjectVersions, and versionId on GET, HEAD, DELETE, ACL and tagging requests |
s3:GetBucketVersioning, s3:PutBucketVersioning, s3:ListBucketVersions, s3:GetObjectVersion, s3:DeleteObjectVersion, ... |
| Object lock | GetObjectLockConfiguration, PutObjectLockConfiguration, GetObjectRetention, PutObjectRetention, GetObjectLegalHold, PutObjectLegalHold |
same names (s3:...BucketObjectLockConfiguration for the bucket configuration), plus s3:BypassGovernanceRetention |
| STS | AssumeRole, AssumeRoleWithWebIdentity, over HTTPS on any protocol VIP |
the role's trust policy |
Headers
These request headers are supported: Host, Expect, Content-Length, Content-MD5, Content-Type, Expires, Transfer-Encoding, Connection, Range, If-Match, If-None-Match, x-amz-meta-*, x-amz-copy-source, x-amz-copy-source-if-match, x-amz-copy-source-if-none-match, x-amz-copy-source-if-modified-since, x-amz-copy-source-if-unmodified-since, x-amz-copy-source-range, x-amz-grant-*, x-amz-acl, x-amz-metadata-directive, x-amz-content-sha256, x-amz-decoded-content-length, x-amz-trailer, x-amz-checksum-*, x-amz-tagging, x-amz-tagging-directive, x-amz-bucket-object-lock-enabled, x-amz-object-ownership, x-amz-bypass-governance-retention, x-amz-object-lock-mode, x-amz-object-lock-retain-until-date, x-amz-object-lock-legal-hold, the CORS request headers, and the SSE-C headers (x-amz-server-side-encryption-customer-*).
Content-MD5 is checked on uploads and parts (a mismatch gets 400 BadDigest), and accepted on configuration requests (ACLs, policies, tagging, versioning, lock, logging, notifications, ownership) and DeleteObjects. Uploads with an x-amz-checksum-* header (CRC32, SHA-1 or SHA-256, including the CRC32 checksum that recent AWS SDKs add by default) are accepted, but responses don't return a checksum. A copy whose x-amz-copy-source-if-match doesn't match fails with 400 InvalidArgument, where AWS returns 412 PreconditionFailed.
Not supported. These requests fail: bucket encryption, replication, website, transfer acceleration and Requester Pays configuration (501 NotImplemented), PutPublicAccessBlock (400 MalformedXML), SelectObjectContent (404 NoSuchKey) and GetObjectAttributes (500 Internal Server Error).
Differences from AWS S3
Bucket configuration
- Lifecycle rules are set in VMS, not with the S3 API. Expiration, cleanup of incomplete multipart uploads and of expired delete markers are lifecycle rules that your platform team sets in VMS. Rules can apply to files over any protocol, not only objects.
PutBucketLifecycleConfigurationisn't a supported request: the cluster accepts it and returns the configuration fromGetBucketLifecycleConfiguration, but no lifecycle rule is created from it, so don't rely on it. - Versioning can't be suspended, only enabled:
Suspendedgets501 NotImplemented. Versioning needs a view with no protocol other than S3: enabling it on a view that also has NFS fails. No MFA Delete. - Object locking needs a view with no protocol other than S3, can't be disabled and turns on versioning. Both retention modes work: in governance mode, a user with
s3:BypassGovernanceRetentioncan delete a locked version early; in compliance mode, nobody can delete it, shorten its retention or switch it to governance before the date, not even with the bypass header. Legal holds work too (versioning and object lock). - Object ownership defaults to
ObjectWriter(ACLs enabled, the uploader owns the object), where AWS defaults toBucketOwnerEnforced. Ownership controls apply only to views with the S3 Native security flavor. - Policies apply only with the S3 Native flavor. On views with another security flavor, identity and bucket policies are ignored and file permissions decide (concepts).
- CORS rules have no IDs: a rule with an
IDgets400 MalformedXML. A failedPutObjectresponse doesn't carryAccess-Control-Allow-Origin. - Bucket logging and event notifications are supported; event notifications go to VAST Event Broker or a third-party Kafka broker (S3 bucket events).
Objects and requests
- Conditional writes (
If-None-Match: *onPutObjectandCompleteMultipartUpload) aren't supported in versioned buckets (501 NotImplemented). Conditional reads (If-Matchon GET and HEAD) and conditional deletes are. - ETags of objects written over NFS or SMB aren't MD5s of the data; they're computed from metadata (multiprotocol access).
- Multipart: part numbers run from 1 to 10,000, as on AWS; other numbers get
400 InvalidPart. Unlike AWS, the cluster doesn't enforce a minimum part size (parts of one byte are accepted) or a 5 GiB maximum for a part or a singlePutObject(5 GiB + 1 byte was accepted for both). Keep to the AWS limits anyway (parts of 5 MiB to 5 GiB, except the last), so your code works with other S3 stores and with clients that check them. An absolute URL in theCompleteMultipartUploadrequest line isn't supported. - Presigned POST: object names must be ASCII (a non-ASCII name gets
403 AccessDenied), and the POST policy is limited in size (limits). - SSE-C: requests with SSE-C headers must use HTTPS (over HTTP they get
400 InvalidArgument); only AES256; SSE-C objects can't be read over NFS or SMB. - Keys with
//, a leading/or.//../parts have file-system implications; some are refused unless the view policy allows them (concepts). With the default settings, keys with//or a leading/got400 InvalidObjectName, and keys with./or../parts were accepted but had no file over NFS.
VAST additions
| Addition | How | Where |
|---|---|---|
| Rename an object (or a "directory") in one request | CopyObject with x-amz-copy-disposition: replace; the source key is gone afterwards |
S3 objects |
| Delete to the trash folder | DeleteObject with x-amz-delete-contents: true, if your platform team has enabled the trash folder |
KB: Using Trash Folder for S3 Objects |
| Tables over the S3 protocol | VAST DataBase requests with tabular-* headers, made for you by the VAST DataBase SDK and connectors |
VAST DataBase |
| Indestructible object mode | A cluster mode that protects S3 buckets on S3-only views; enabled through VAST Customer Success | KB: Indestructible Object Mode |
See also
- Limits.
- KB: Supported S3 Requests, Supported S3 HTTP Headers and the 5.5.0 release notes.