Clone
19
Supported APIs vs Minio
Chris Lu edited this page 2026-05-19 17:58:53 -07:00

S3 API Comparison: SeaweedFS vs MinIO

Note

This page is generated by scanning the source code with AI and serves as a to-do list for SeaweedFS as we continue to add more S3 APIs to improve compatibility and functionality.

This page compares the S3 API implementation in SeaweedFS with MinIO.

Comparison Summary

Feature Area SeaweedFS Support MinIO Support Notes
Basic Object Ops Full Full GET, PUT, DELETE, HEAD, COPY
Bucket Ops Full Full Create, Delete, List, Head
Multipart Upload Full Full
Object Tagging Full Full
Object Lock Full Full Retention, Legal Hold
Bucket Policy Full Full
Lifecycle Full Full
Versioning Full Full
ACLs Full ⚠️ Dummy MinIO accepts but does not enforce bucket and object ACL requests
Bucket Notifications No Full GetBucketNotification, PutBucketNotification, ListenBucketNotification
Bucket Replication No Full Get/Put/DeleteBucketReplication plus metrics and reset extensions
Bucket Policy Status Full Full GetBucketPolicyStatus
Analytics / Inventory / IntelligentTiering / Metrics configs ⚠️ Stub Rejected (OSS) SeaweedFS returns an empty list / NoSuchConfiguration so SDK probes succeed; MinIO OSS returns 501 NotImplemented (the equivalents live in mc admin / AIStor workflows, not the standard S3 endpoint)
S3 Tables Full No SeaweedFS supports Iceberg via S3 Tables
Object Select No Yes SelectObjectContent
Object Attributes Yes Yes GetObjectAttributes
Lambda Triggers No Yes GetObjectLambda
IAM Groups Full ⚠️ Proprietary Similar group admin capability, but not API-compatible: SeaweedFS uses AWS IAM actions; MinIO uses proprietary /minio/admin/v3 endpoints.
STS Partial Full SeaweedFS: standard AssumeRole APIs. MinIO: several extensions.

Implemented APIs (Both)

  • Service Operations: ListBuckets
  • Bucket Operations: HeadBucket, PutBucket, DeleteBucket, ListObjectsV1, ListObjectsV2, ListObjectVersions, GetBucketAcl, PutBucketAcl, GetBucketPolicy, PutBucketPolicy, DeleteBucketPolicy, GetBucketCors, PutBucketCors, DeleteBucketCors, GetBucketLifecycle, PutBucketLifecycle, DeleteBucketLifecycle, GetBucketLocation, GetBucketVersioning, PutBucketVersioning, GetBucketObjectLockConfiguration, PutBucketObjectLockConfiguration, GetBucketTagging, PutBucketTagging, DeleteBucketTagging, GetBucketEncryption, PutBucketEncryption, DeleteBucketEncryption
  • Object Operations: HeadObject, GetObject, PutObject, PostObject (browser form upload), DeleteObject, CopyObject, DeleteMultipleObjects, GetObjectAttributes, GetObjectTagging, PutObjectTagging, DeleteObjectTagging, GetObjectAcl, PutObjectAcl, GetObjectRetention, PutObjectRetention, GetObjectLegalHold, PutObjectLegalHold
  • Multipart Upload: CreateMultipartUpload, AbortMultipartUpload, CompleteMultipartUpload, UploadPart, CopyObjectPart, ListMultipartUploads, ListParts

SeaweedFS Specific / Better Implemented

  • S3 Tables API (Iceberg Support): Extensive support for Iceberg tables, namespaces, and buckets.
    • CreateTableBucket, ListTableBuckets, GetTableBucket, DeleteTableBucket, CreateNamespace, CreateTable, etc.
  • Bucket Management: SeaweedFS implements PublicAccessBlock and OwnershipControls which are rejected or labeled as dummy in some MinIO versions.

MinIO Specific / Not in SeaweedFS

  • Advanced Object Querying: SelectObjectContent.
  • Extensions: GetObjectLambda, PostRestoreObject, PutObjectExtract (Snowball auto-extract).
  • Bucket Notifications: GetBucketNotification, PutBucketNotification, plus MinIO's ListenBucketNotification SSE-style event stream.
  • Bucket Replication: GetBucketReplication, PutBucketReplication, DeleteBucketReplication, replication metrics (v1/v2), ResetBucketReplicationStart, ResetBucketReplicationStatus, ValidateBucketReplicationCreds.
  • Persisted bucket configurations: AWS Analytics, Inventory, IntelligentTiering, and Metrics configurations are not implemented on either side at the standard S3 endpoint. MinIO OSS rejects all methods with 501 NotImplemented; SeaweedFS exposes well-formed empty / NoSuchConfiguration stubs so AWS-SDK probes succeed. The equivalents live in MinIO's mc admin / AIStor workflows.

STS API Comparison

STS Action SeaweedFS MinIO Notes
sts:AssumeRole Standard SigV4 auth
sts:AssumeRoleWithWebIdentity OIDC / JWT support
sts:AssumeRoleWithLDAPIdentity LDAP integration
sts:GetFederationToken Temp credentials with scoped-down policy
sts:GetCallerIdentity Returns ARN/account/user of caller
sts:AssumeRoleWithClientGrants MinIO extension
sts:AssumeRoleWithCertificate MinIO extension (TLS certs)
sts:AssumeRoleWithCustomToken MinIO extension

Detailed Comparison Table

API Action SeaweedFS MinIO
s3:GetObject
s3:PutObject
s3:DeleteObject
s3:CopyObject
s3:SelectObjectContent
s3:GetObjectAttributes
s3:PostRestoreObject
s3:GetBucketCORS
s3:PutBucketCORS ⚠️ (Dummy)
s3:GetBucketACL
s3:PutBucketACL ⚠️ (Dummy)
s3:GetBucketLifecycle
s3:PutBucketLifecycle
s3:GetBucketEncryption
s3:GetBucketVersioning
s3:GetBucketLocation
s3:GetBucketPolicy
s3:PutBucketPolicy
s3:DeleteBucketPolicy
s3:GetBucketObjectLockConfiguration
s3:GetBucketTagging
s3:PutBucketOwnershipControls (Rejected)
s3:GetPublicAccessBlock (Rejected)
s3:GetBucketNotification
s3:PutBucketNotification
s3:GetBucketReplication
s3:PutBucketReplication
s3:DeleteBucketReplication
s3:GetBucketPolicyStatus
s3:PutBucketRequestPayment (BucketOwner only) (Rejected)
s3:GetBucketAccelerate ⚠️ (Static Suspended) ⚠️ (Dummy)
s3:GetBucketLogging ⚠️ (Static empty) ⚠️ (Dummy)
s3:GetBucketAnalyticsConfiguration / s3:ListBucketAnalyticsConfigurations ⚠️ (Stub) (Rejected, 501)
s3:GetBucketInventoryConfiguration / s3:ListBucketInventoryConfigurations ⚠️ (Stub) (Rejected, 501)
s3:GetBucketIntelligentTieringConfiguration / s3:ListBucketIntelligentTieringConfigurations ⚠️ (Stub) (Rejected, 501)
s3:GetBucketMetricsConfiguration / s3:ListBucketMetricsConfigurations ⚠️ (Stub) (Rejected, 501)
s3:GetBucketWebsite ⚠️ (Dummy)
s3:GetObjectACL ⚠️ (Dummy)
s3:PutObjectACL ⚠️ (Dummy)

Notes on behavioral divergence

  • s3:GetBucketPolicyStatus — both services return an IsPublic flag, but the definition of "public" differs. MinIO marks a bucket public only when anonymous credentials can both ListBucket and PutObject. SeaweedFS marks it public if any Allow statement grants Principal: "*" without a Condition. A bucket open to anonymous reads only would report true in SeaweedFS and FALSE in MinIO.
  • s3:GetBucketAccelerate — MinIO returns 200 + <AccelerateConfiguration/> with no <Status> child (AWS clients default-interpret as Suspended). SeaweedFS returns the same empty XML but with an explicit <Status>Suspended</Status> element.

IAM API Comparison

SeaweedFS implements IAM actions as standard AWS IAM API calls (same endpoint as S3). MinIO uses a proprietary admin API (/minio/admin/v3/) accessible via mc admin CLI and madmin-go SDK.

For group management specifically, MinIO supports broadly similar administration features, but not the same API surface. Group creation and deletion are implicit in MinIO's member-management flow, ListGroupsForUser is surfaced via user info (MemberOf) rather than a dedicated API, ListAttachedGroupPolicies is folded into broader admin responses, and SeaweedFS UpdateGroup rename support has no MinIO equivalent.

IAM Action SeaweedFS MinIO Notes
iam:CreateUser ⚠️ Proprietary MinIO: mc admin user add
iam:DeleteUser ⚠️ Proprietary MinIO: mc admin user remove
iam:GetUser ⚠️ Proprietary MinIO: mc admin user info
iam:ListUsers ⚠️ Proprietary MinIO: mc admin user list
iam:UpdateUser ⚠️ Proprietary
iam:SetUserStatus ⚠️ Proprietary MinIO: mc admin user enable/disable
iam:CreateAccessKey ⚠️ Proprietary SeaweedFS also accepts optional caller-supplied AccessKeyId/SecretAccessKey (extension). MinIO: mc admin user svcacct add
iam:DeleteAccessKey ⚠️ Proprietary MinIO: mc admin user svcacct rm
iam:ListAccessKeys ⚠️ Proprietary MinIO: mc admin user svcacct ls
iam:UpdateAccessKey ⚠️ Proprietary
iam:CreatePolicy ⚠️ Proprietary MinIO: mc admin policy create
iam:DeletePolicy ⚠️ Proprietary MinIO: mc admin policy rm
iam:ListPolicies ⚠️ Proprietary MinIO: mc admin policy ls
iam:GetPolicy ⚠️ Proprietary MinIO: mc admin policy info
iam:PutUserPolicy MinIO has no inline policy concept
iam:GetUserPolicy
iam:DeleteUserPolicy
iam:ListUserPolicies
iam:AttachUserPolicy ⚠️ Proprietary MinIO: mc admin policy attach
iam:DetachUserPolicy ⚠️ Proprietary MinIO: mc admin policy detach
iam:ListAttachedUserPolicies ⚠️ Proprietary
iam:CreateGroup ⚠️ Proprietary MinIO: implicit create via mc admin group add / update-group-members; no AWS IAM CreateGroup action
iam:DeleteGroup ⚠️ Proprietary MinIO: remove empty group via mc admin group remove; no AWS IAM DeleteGroup action
iam:GetGroup ⚠️ Proprietary MinIO: mc admin group info
iam:ListGroups ⚠️ Proprietary MinIO: mc admin group list
iam:AddUserToGroup ⚠️ Proprietary MinIO: mc admin group add <group> <user>
iam:RemoveUserFromGroup ⚠️ Proprietary MinIO: mc admin group remove <group> <user>
iam:AttachGroupPolicy ⚠️ Proprietary MinIO: mc admin policy attach --group
iam:DetachGroupPolicy ⚠️ Proprietary MinIO: mc admin policy detach --group
iam:ListAttachedGroupPolicies ⚠️ Proprietary No dedicated MinIO API; exposed via group info / policy mapping queries
iam:ListGroupsForUser ⚠️ Proprietary No dedicated MinIO API; returned as MemberOf in user info
iam:UpdateGroup ⚠️ Partial SeaweedFS extension: rename or enable/disable. MinIO only supports enable/disable via set-group-status
iam:PutGroupPolicy Group inline policies; MinIO only supports managed policies
iam:GetGroupPolicy
iam:DeleteGroupPolicy
iam:ListGroupPolicies
iam:GetPolicyVersion Managed policy version read; no MinIO equivalent
iam:ListPolicyVersions Managed policy version list; no MinIO equivalent
iam:CreateServiceAccount ⚠️ Proprietary MinIO: mc admin user svcacct add
iam:DeleteServiceAccount ⚠️ Proprietary MinIO: mc admin user svcacct rm
iam:GetServiceAccount ⚠️ Proprietary MinIO: mc admin user svcacct info
iam:ListServiceAccounts ⚠️ Proprietary MinIO: mc admin user svcacct ls
iam:UpdateServiceAccount ⚠️ Proprietary MinIO: mc admin user svcacct edit
iam:TagUser Add tags to a user; AWS limits (50 tags, key 1-128, value 0-256) enforced
iam:UntagUser Remove tags from a user
iam:ListUserTags List tags on a user
iam:GetAccessKeyLastUsed 📋 Planned Return when an access key was last used