Skip to content

S3

kumolo implements the S3 REST API. All operations accept standard AWS SDK v2 requests — point your client at http://localhost:5566 with UsePathStyle = true.

Symbol Meaning
Fully implemented — the feature behaves like real AWS
Partial support — the operation works but has known limitations; see the note for details
Not yet implemented

Operations sourced from internal/s3/router.go in the kumolo repository.

Operation Supported
CreateBucket
DeleteBucket
HeadBucket
ListBuckets
ListDirectoryBuckets
CreateSession
Operation Supported
PutObject
GetObject
DeleteObject
DeleteObjects
HeadObject
CopyObject
GetObjectAttributes
RestoreObject
SelectObjectContent
RenameObject
UpdateObjectEncryption
GetObjectTorrent
WriteGetObjectResponse
Operation Supported
GetObjectAnnotation
PutObjectAnnotation
DeleteObjectAnnotation
ListObjectAnnotations
Operation Supported
ListObjects
ListObjectsV2
ListObjectVersions
Operation Supported
CreateMultipartUpload
UploadPart
UploadPartCopy
CompleteMultipartUpload
AbortMultipartUpload
ListMultipartUploads
ListParts

All object operations (GetObject, PutObject, DeleteObject, HeadObject, etc.) support standard SigV4 presigned URLs generated by the AWS SDK presign client. The X-Amz-Expires value is validated (1–604800 seconds); expired URLs return 403 AccessDenied. Signatures are not verified — see Known Limitations.

Operation Supported
POST Object

Presigned POST enables browser-based direct-to-S3 uploads without routing the file through your server. Generate a presigned POST policy with @aws-sdk/s3-presigned-post (JS) or a compatible library, then submit via an HTML form with enctype="multipart/form-data".

Supported form fields: key (required; supports ${filename} substitution), Content-Type, acl, x-amz-meta-*, success_action_status (200, 201, 204), and success_action_redirect.

Policy conditions are not evaluated — see Known Limitations.

Operation Supported
GetBucketVersioning
PutBucketVersioning
Operation Supported
GetBucketCors
PutBucketCors
DeleteBucketCors
Operation Supported
GetBucketTagging
PutBucketTagging
DeleteBucketTagging
GetObjectTagging
PutObjectTagging
DeleteObjectTagging
Operation Supported
GetObjectRetention
PutObjectRetention
GetObjectLegalHold
PutObjectLegalHold
GetObjectLockConfiguration
PutObjectLockConfiguration
Operation Supported
GetBucketLocation
Operation Supported
GetBucketPolicy
PutBucketPolicy
DeleteBucketPolicy
GetBucketPolicyStatus
Operation Supported
GetBucketAcl
PutBucketAcl
GetObjectAcl
PutObjectAcl
Operation Supported
GetBucketEncryption
PutBucketEncryption
DeleteBucketEncryption
Operation Supported
GetPublicAccessBlock
PutPublicAccessBlock
DeletePublicAccessBlock
Operation Supported
GetBucketOwnershipControls
PutBucketOwnershipControls
DeleteBucketOwnershipControls
Operation Supported
GetBucketLifecycleConfiguration
PutBucketLifecycleConfiguration
DeleteBucketLifecycle
Operation Supported
GetBucketWebsite
PutBucketWebsite
DeleteBucketWebsite
Operation Supported
GetBucketReplication
PutBucketReplication
DeleteBucketReplication
Operation Supported
GetBucketNotificationConfiguration
PutBucketNotificationConfiguration
Operation Supported
GetBucketLogging
PutBucketLogging
Operation Supported
GetBucketAccelerateConfiguration
PutBucketAccelerateConfiguration
Operation Supported
GetBucketRequestPayment
PutBucketRequestPayment
Operation Supported
GetBucketAbac
PutBucketAbac
Operation Supported
CreateBucketMetadataTableConfiguration
GetBucketMetadataTableConfiguration
DeleteBucketMetadataTableConfiguration
CreateBucketMetadataConfiguration
GetBucketMetadataConfiguration
DeleteBucketMetadataConfiguration
UpdateBucketMetadataAnnotationTableConfiguration
UpdateBucketMetadataInventoryTableConfiguration
UpdateBucketMetadataJournalTableConfiguration
Operation Supported
GetBucketAnalyticsConfiguration
PutBucketAnalyticsConfiguration
DeleteBucketAnalyticsConfiguration
ListBucketAnalyticsConfigurations
Operation Supported
GetBucketIntelligentTieringConfiguration
PutBucketIntelligentTieringConfiguration
DeleteBucketIntelligentTieringConfiguration
ListBucketIntelligentTieringConfigurations
Operation Supported
GetBucketInventoryConfiguration
PutBucketInventoryConfiguration
DeleteBucketInventoryConfiguration
ListBucketInventoryConfigurations
Operation Supported
GetBucketMetricsConfiguration
PutBucketMetricsConfiguration
DeleteBucketMetricsConfiguration
ListBucketMetricsConfigurations
import (
"context"
"strings"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
cfg, err := config.LoadDefaultConfig(context.Background(),
config.WithRegion("us-east-1"),
config.WithCredentialsProvider(
credentials.NewStaticCredentialsProvider("test", "test", ""),
),
)
if err != nil {
panic(err)
}
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String("http://localhost:5566")
o.UsePathStyle = true // required for local endpoint
})
if _, err = client.CreateBucket(context.Background(), &s3.CreateBucketInput{
Bucket: aws.String("my-bucket"),
}); err != nil {
panic(err)
}
if _, err = client.PutObject(context.Background(), &s3.PutObjectInput{
Bucket: aws.String("my-bucket"),
Key: aws.String("hello.txt"),
Body: strings.NewReader("hello, kumolo"),
}); err != nil {
panic(err)
}