Home / Reference / S3 on ONTAP

S3 on ONTAP: the object store server

ONTAP has spoken S3 natively since 9.8. Every SVM can host an object store server that serves S3 buckets out of ordinary FlexVols — no gateway VM, no extra licensing. This guide covers the architecture, the commands you actually type, and the limits that bite.

ONTAP S3 object service on a storage VM

What ONTAP S3 actually is

An object store server is an S3-compatible service that runs inside an SVM. Buckets are not a new filesystem — each bucket is carved out of a FlexVol on the SVM, and objects are stored as files in that volume with a small amount of object metadata alongside. That means everything you already know about ONTAP applies: snapshots protect buckets, QoS throttles them, dedupe/compression works on the underlying volume, and the data is served from the same HA pairs as any other workload.

It is not StorageGRID. ONTAP S3 is for S3-compatible access to data on the cluster you already own — app backup targets, archive, dual-protocol NAS+S3. StorageGRID is the scale-out, erasure-coded, multi-site object platform for when you need true object storage at scale (see the SMB guide for the NAS side of the same story).

Architecture in one picture

Step 1 — Create the object store server

vserver object-store-server create \
  -vserver vs1 \
  -root-volume data_vs1_root \
  -root-volume-security-style unix \
  -data-volumes data_vs1_data1,data_vs1_data2 \
  -bucket-endpoint-style path-style \
  -policy default

The root volume must be a dedicated volume (ONTAP creates it with the right settings if the name doesn't exist — keep it empty and unshared). -data-volumes lists the volumes buckets may be created in; you can add more later with vserver object-store-server modify -data-volumes ....

-bucket-endpoint-style chooses how clients address buckets:

vserver object-store-server show
vserver object-store-server show -vserver vs1 -instance

Step 2 — Create buckets

vserver object-store-server bucket create \
  -vserver vs1 \
  -bucket reports \
  -volume data_vs1_data1 \
  -size 1TB \
  -policy default

# grow, shrink (shrink only to used size), or delete
vserver object-store-server bucket modify -vserver vs1 -bucket reports -size 2TB
vserver object-store-server bucket delete -vserver vs1 -bucket reports

vserver object-store-server bucket show

Step 3 — Create users and get keys

vserver object-store-server user create -vserver vs1 -user backup-svc \
  -comment "Veeam service account"

# ONTAP prints the credentials once:
#   Access Key:  A5B9...
#   Secret Key:  Xk2m...   (shown once, save it now)

vserver object-store-server user show
vserver object-store-server user modify -vserver vs1 -user backup-svc -comment "..."
vserver object-store-server user delete -vserver vs1 -user backup-svc

Store the secret key at creation time — ONTAP will not show it again. If it's lost, delete and recreate the user. Keys are cluster-wide unique; the same user can be used against any object store server on the cluster.

Step 4 — Policies (IAM-style access control)

By default, buckets are private. You grant access with policies and statements, modeled on AWS IAM. A policy is a named container; statements inside it declare effect (allow/deny), principal (which user), action (s3:GetObject, s3:PutObject, s3:ListBucket, ...), and resource (an ARN like arn:aws:s3:::reports/*).

vserver object-store-server policy create -vserver vs1 -policy reports-ro

vserver object-store-server policy statement create \
  -vserver vs1 -policy reports-ro \
  -effect allow \
  -principal backup-svc \
  -action s3:GetObject,s3:ListBucket \
  -resource arn:aws:s3:::reports/*,arn:aws:s3:::reports

vserver object-store-server policy show
vserver object-store-server policy statement show -vserver vs1 -policy reports-ro

Statements are evaluated in order; deny wins. If a user has no matching allow statement, the request is rejected. When policies change, existing open connections may hold old permissions briefly.

Step 5 — Connect from clients

Point any S3 client at the SVM's data LIF. AWS CLI is the easiest test:

# path-style endpoint against the SVM LIF (10.0.0.5 here)
aws --endpoint-url https://10.0.0.5 --no-verify-ssl s3 ls
aws --endpoint-url https://10.0.0.5 --no-verify-ssl s3 mb s3://reports
aws --endpoint-url https://10.0.0.5 --no-verify-ssl s3 cp big-file.tgz s3://reports/
aws --endpoint-url https://10.0.0.5 --no-verify-ssl s3 ls s3://reports/

--no-verify-ssl is only for testing against ONTAP's default self-signed certificate. In production, install a CA-signed certificate for the SVM (System Manager → SVM → Security, or security certificate install) and drop the flag. ONTAP serves HTTPS on port 443 by default; you can change the HTTP/HTTPS ports with vserver object-store-server modify -http-port 80 -https-port 443.

DNS tip: with path-style endpoints, no DNS is needed beyond normal LIF resolution. Virtual-hosted style needs *.svm.example.com pointing at the LIFs.

REST API (ONTAP 9.8+)

The same configuration is available over the ONTAP REST API — handy for automation and IaC:

# create the object store server (PUT /api/svm/svms/{svm.uuid}/object-store/servers)
curl -k -u admin -X PUT \
  "https://cluster-mgr/api/svm/svms/00000000-0000-0000-0000-000000000000/object-store/servers" \
  -H "Content-Type: application/json" \
  -d '{
        "name": "svm1",
        "root_volume": {"name": "data_vs1_root"},
        "data_volumes": [{"name": "data_vs1_data1"}],
        "bucket_endpoint_style": "path_style"
      }'

# create a bucket
curl -k -u admin -X POST \
  "https://cluster-mgr/api/svm/svms/00000000-0000-0000-0000-000000000000/object-store/servers/11111111-1111-1111-1111-111111111111/buckets" \
  -H "Content-Type: application/json" \
  -d '{"name": "reports", "volume": {"name": "data_vs1_data1"}, "size": 1099511627776}'

curl -k -u admin "https://cluster-mgr/api/svm/svms/00000000-0000-0000-0000-000000000000/object-store/servers"

Get the real UUIDs from vserver object-store-server show -instance (UUID) and vserver show -vserver vs1 -fields uuid before scripting.

Lifecycle, snapshots, and replication

Monitoring and troubleshooting

# object store server status and stats
vserver object-store-server show -instance
vserver object-store-server stats show -vserver vs1
vserver object-store-server bucket show -fields name,size,used,percent-used

# object latency / ops
statistics show -object object-store-server -sample-id s3

# check the audit log / EMS for S3 events
event log show -event *s3* -severity warning

Common failure signatures:

Limits and gotchas (the parts that bite)

ItemLimitNote
Max object size5 GiBLarger objects fail on PUT; multipart upload doesn't raise the ceiling on ONTAP
Bucket default / max size10 TB default, up to 100 TBSet at creation with -size; growing later is easy
Object store servers1 per SVM (9.8–9.10); more in later releasesPlan one SVM per object namespace
Endpoint stylepath-style or virtual-hosted, set onceChanging style later breaks clients using the old form
AuthAccess/secret keys onlyNo IAM federation, no AD integration — manage keys via CLI/REST
Feature parityNot full AWS S3No event notifications, no website hosting, no cross-region replication

Verify limits against the exact ONTAP release you run — vserver object-store-server help and the S3 configuration section of the ONTAP documentation are authoritative for your version.

Use cases that fit (and one that doesn't)