Welcome to the new DOCS.vastdata.com. We've added new menus and a version selector, plus new persona and resource pages to help customers get started. Looking for a previous article? Use the docs search.

S3 compatibility

Prev Next

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. PutBucketLifecycleConfiguration isn't a supported request: the cluster accepts it and returns the configuration from GetBucketLifecycleConfiguration, but no lifecycle rule is created from it, so don't rely on it.
  • Versioning can't be suspended, only enabled: Suspended gets 501 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:BypassGovernanceRetention can 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 to BucketOwnerEnforced. 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 ID gets 400 MalformedXML. A failed PutObject response doesn't carry Access-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: * on PutObject and CompleteMultipartUpload) aren't supported in versioned buckets (501 NotImplemented). Conditional reads (If-Match on 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 single PutObject (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 the CompleteMultipartUpload request 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 / got 400 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