Overview
Ozone provides S3 compatible REST interface to use the object store data with any S3 compatible tools.
S3 buckets are stored under the /s3v volume.
Getting started
S3 Gateway is a separated component which provides the S3 compatible APIs. It should be started additional to the regular Ozone components. You can start a Docker based cluster, including the S3 Gateway from the release package.
Go to the compose/ozone directory, and start the server:
docker-compose up -d --scale datanode=3
You can access the S3 Gateway at http://localhost:9878
URL Schema
Ozone S3 Gateway supports both the virtual-host-style URL S3 bucket addresses (eg. http://bucketname.host:9878) and the path-style addresses (eg. http://host:9878/bucketname)
By default it uses the path-style addressing. To use virtual host style URLs set your main domain name in your ozone-site.xml:
<property>
<name>ozone.s3g.domain.name</name>
<value>s3g.internal</value>
</property>
Implemented REST Endpoints
The Ozone S3 Gateway implements a substantial subset of the Amazon S3 REST API. The tables below summarize each API’s support status, its feature, and any relevant notes, including known deviations from AWS S3 behavior.
Bucket Operations
| API Name | Feature | Note |
|---|---|---|
| ✅ ListBuckets | Lists all buckets owned by the authenticated user. | Returns the full bucket list. |
| ✅ CreateBucket | Creates a new bucket. | Non-compliant behavior: The default bucket ACL may include extra group permissions instead of being strictly private. Bucket names must adhere to S3 naming conventions. |
| ✅ HeadBucket | Checks for the existence of a bucket. | Returns a 200 status if the bucket exists. |
| ✅ DeleteBucket | Deletes a bucket. | Bucket must be empty before deletion. |
Object Operations
| API Name | Feature | Note |
|---|---|---|
| ✅ GetObject | Retrieves the contents of an object. | Non-compliant behavior: For non-existent objects, Ozone may return a generic 404 without the structured XML error body defined by AWS S3. |
| ✅ HeadObject | Retrieves metadata for an object. | Similar to GET Object, error responses for missing objects might lack detailed AWS-style error XML. |
| ✅ PutObject | Uploads a new object. | Supports both single PUT and multipart uploads. Non-compliant behavior: Any ACL headers provided in the request are ignored. |
| ✅ DeleteObject | Deletes a single object. | Returns standard error codes for missing objects. |
| ✅ DeleteObjects | Deletes multiple objects in one request. | Bulk delete operation with aggregated error reporting. |
| ✅ CopyObject | Copies an object (intra- or inter-bucket). | Supports metadata directives (COPY/REPLACE). Non-compliant behavior: Self-copying for metadata updates may differ slightly from AWS S3. |
| ✅ ListObjectsV2 | Lists objects in a bucket with filtering and pagination. | Supports prefix, delimiter, and continuation tokens. |
Object Tagging Operations
| API Name | Feature | Note |
|---|---|---|
| ✅ PutObjectTagging | Adds or updates tags on an object. | Fully supported; updates replace any existing tag set. |
| ✅ GetObjectTagging | Retrieves the tag set of an object. | Returns the tag set as defined by the S3 API. |
| ✅ DeleteObjectTagging | Removes the tag set from an object. | Clears all tags associated with the object. |
Multipart Upload Operations
| API Name | Feature | Note |
|---|---|---|
| ✅ CreateMultipartUpload | Starts a multipart upload session. | Returns an UploadId for subsequent parts. |
| ✅ UploadPart | Uploads an individual part for a multipart upload. | Part numbering and ETag computation follow AWS semantics. |
| ✅ ListMultipartUploads | Lists in-progress multipart uploads in a bucket. | Up to 1000 multipart uploads are returned in a batch by default. |
| ✅ ListParts | Lists uploaded parts for an in-progress multipart upload. | Supports pagination if many parts exist. |