S3 Compatibility status

9 min

Endpoint implementation

All APIs that are missing on Garage will return a 501 Not Implemented. Some x-amz- headers are not implemented.

The compatibility list for other platforms is given only for information purposes and based on available documentation. Some entries might be inexact. Feel free to open a PR to fix this table. Minio is missing because they do not provide a public S3 compatibility list.

Features

FeatureGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
signature v2 (deprecated)❌ Missing
signature v4✅ Implemented
URL path-style (eg. host.tld/bucket/key)✅ Implemented
URL vhost-style URL (eg. bucket.host.tld/key)✅ Implemented
Presigned URLs✅ Implemented✅(❓)

Note: OpenIO does not says if it supports presigned URLs. Because it is part of signature v4 and they claim they support it without additional precisions, we suppose that OpenIO supports presigned URLs.

Core endoints

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
CreateBucket✅ Implemented
DeleteBucket✅ Implemented
GetBucketLocation✅ Implemented
HeadBucket✅ Implemented
ListBuckets✅ Implemented
HeadObject✅ Implemented
CopyObject✅ Implemented
DeleteObject✅ Implemented
DeleteObjects✅ Implemented
GetObject✅ Implemented
ListObjects✅ Implemented (see details below)
ListObjectsV2✅ Implemented
PostObject (compatibility API)❌ Missing
PutObject✅ Implemented

ListObjects: Implemented, but there isn't a very good specification of what encoding-type=url covers so there might be some encoding bugs. In our implementation the url-encoded fields are in the same in ListObjects as they are in ListObjectsV2.

Note: Ceph API documentation is incomplete and miss at least HeadBucket and UploadPartCopy, but these endpoints are documented in Red Hat Ceph Storage - Chapter 2. Ceph Object Gateway and the S3 API

Multipart Upload endpoints

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
AbortMultipartUpload✅ Implemented
CompleteMultipartUpload✅ Implemented (see details below)
CreateMultipartUpload✅ Implemented
ListMultipartUpload✅ Implemented
ListParts✅ Implemented
UploadPart✅ Implemented (see details below)
UploadPartCopy✅ Implemented

Our implementation of Multipart Upload is currently a bit more restrictive than Amazon's one in some edge cases. For more information, please refer to our issue tracker.

Website endpoints

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
DeleteBucketWebsite✅ Implemented
GetBucketWebsite✅ Implemented
PutBucketWebsite⚠ Partially implemented (see below)
DeleteBucketCors✅ Implemented
GetBucketCors✅ Implemented
PutBucketCors✅ Implemented

PutBucketWebsite: Implemented, but only stores the index document suffix and the error document path. Redirects are not supported.

Note: Ceph radosgw has some support for static websites but it is different from Amazon one plus it does not implement its configuration endpoints.

ACL, Policies endpoints

Amazon has 2 access control mechanisms in S3: ACL (legacy) and policies (new one). Garage implements none of them, and has its own system instead, built around a per-access-key-per-bucket logic. See Garage CLI reference manual to learn how to use Garage's permission system.

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
DeleteBucketPolicy❌ Missing
GetBucketPolicy❌ Missing
GetBucketPolicyStatus❌ Missing
PutBucketPolicy❌ Missing
GetBucketAcl❌ Missing
PutBucketAcl❌ Missing
GetObjectAcl❌ Missing
PutObjectAcl❌ Missing

Notes: Ceph claims that it supports bucket policies but does not implement any Policy endpoints. They probably refer to their own permission system. Riak CS only supports a subset of the policy configuration.

Versioning, Lifecycle endpoints

Garage does not support (yet) object versioning. If you need this feature, please share your use case in our dedicated issue.

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
DeleteBucketLifecycle❌ Missing
GetBucketLifecycleConfiguration❌ Missing
PutBucketLifecycleConfiguration❌ Missing
GetBucketVersioning❌ Stub (see below)
ListObjectVersions❌ Missing
PutBucketVersioning❌ Missing

GetBucketVersioning: Stub implementation (Garage does not yet support versionning so this always returns "versionning not enabled").

Note: Ceph only supports Expiration, NoncurrentVersionExpiration and AbortIncompleteMultipartUpload on its Lifecycle endpoints.

Replication endpoints

Please open an issue if you have a use case for replication.

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
DeleteBucketReplication❌ Missing
GetBucketReplication❌ Missing
PutBucketReplication❌ Missing

Note: Ceph documentation briefly says that Ceph supports replication though the S3 API but with some limitations. Additionaly, replication endpoints are not documented in the S3 compatibility page so I don't know what kind of support we can expect.

Locking objects

Amazon defines a concept of object locking that can be achieved either through a Retention period or a Legal hold.

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
GetObjectLegalHold❌ Missing
PutObjectLegalHold❌ Missing
GetObjectRetention❌ Missing
PutObjectRetention❌ Missing
GetObjectLockConfiguration❌ Missing
PutObjectLockConfiguration❌ Missing

(Server-side) encryption

We think that you can either encrypt your server partition or do client-side encryption, so we did not implement server-side encryption for Garage. Please open an issue if you have a use case.

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
DeleteBucketEncryption❌ Missing
GetBucketEncryption❌ Missing
PutBucketEncryption❌ Missing

Misc endpoints

EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
GetBucketNotificationConfiguration❌ Missing
PutBucketNotificationConfiguration❌ Missing
DeleteBucketTagging❌ Missing
GetBucketTagging❌ Missing
PutBucketTagging❌ Missing
DeleteObjectTagging❌ Missing
GetObjectTagging❌ Missing
PutObjectTagging❌ Missing
GetObjectTorrent❌ Missing

Vendor specific endpoints

Display Amazon specifc endpoints
EndpointGarageOpenstack SwiftCeph Object GatewayRiak CSOpenIO
DeleteBucketAnalyticsConfiguration❌ Missing
DeleteBucketIntelligentTieringConfiguration❌ Missing
DeleteBucketInventoryConfiguration❌ Missing
DeleteBucketMetricsConfiguration❌ Missing
DeleteBucketOwnershipControls❌ Missing
DeletePublicAccessBlock❌ Missing
GetBucketAccelerateConfiguration❌ Missing
GetBucketAnalyticsConfiguration❌ Missing
GetBucketIntelligentTieringConfiguration❌ Missing
GetBucketInventoryConfiguration❌ Missing
GetBucketLogging❌ Missing
GetBucketMetricsConfiguration❌ Missing
GetBucketOwnershipControls❌ Missing
GetBucketRequestPayment❌ Missing
GetPublicAccessBlock❌ Missing
ListBucketAnalyticsConfigurations❌ Missing
ListBucketIntelligentTieringConfigurations❌ Missing
ListBucketInventoryConfigurations❌ Missing
ListBucketMetricsConfigurations❌ Missing
PutBucketAccelerateConfiguration❌ Missing
PutBucketAnalyticsConfiguration❌ Missing
PutBucketIntelligentTieringConfiguration❌ Missing
PutBucketInventoryConfiguration❌ Missing
PutBucketLogging❌ Missing
PutBucketMetricsConfiguration❌ Missing
PutBucketOwnershipControls❌ Missing
PutBucketRequestPayment❌ Missing
PutPublicAccessBlock❌ Missing
RestoreObject❌ Missing
SelectObjectContent❌ Missing
Navigation