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.

SymbolMeaning
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.

OperationSupported
CreateBucket
DeleteBucket
HeadBucket
ListBuckets
ListDirectoryBuckets
CreateSession
OperationSupported
PutObject
GetObject
DeleteObject
DeleteObjects
HeadObject
CopyObject
GetObjectAttributes
RestoreObject
SelectObjectContent
GetObjectTorrent
WriteGetObjectResponse
OperationSupported
ListObjects
ListObjectsV2
ListObjectVersions
OperationSupported
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.

OperationSupported
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.

OperationSupported
GetBucketVersioning
PutBucketVersioning
OperationSupported
GetBucketCors
PutBucketCors
DeleteBucketCors
OperationSupported
GetBucketTagging
PutBucketTagging
DeleteBucketTagging
GetObjectTagging
PutObjectTagging
DeleteObjectTagging
OperationSupported
GetObjectRetention
PutObjectRetention
GetObjectLegalHold
PutObjectLegalHold
GetObjectLockConfiguration
PutObjectLockConfiguration
OperationSupported
GetBucketLocation
OperationSupported
GetBucketPolicy
PutBucketPolicy
DeleteBucketPolicy
GetBucketPolicyStatus
OperationSupported
GetBucketAcl
PutBucketAcl
GetObjectAcl
PutObjectAcl
OperationSupported
GetBucketEncryption
PutBucketEncryption
DeleteBucketEncryption
OperationSupported
GetPublicAccessBlock
PutPublicAccessBlock
DeletePublicAccessBlock
OperationSupported
GetBucketOwnershipControls
PutBucketOwnershipControls
DeleteBucketOwnershipControls
OperationSupported
GetBucketLifecycleConfiguration
PutBucketLifecycleConfiguration
DeleteBucketLifecycle
OperationSupported
GetBucketWebsite
PutBucketWebsite
DeleteBucketWebsite
OperationSupported
GetBucketReplication
PutBucketReplication
DeleteBucketReplication
OperationSupported
GetBucketNotificationConfiguration
PutBucketNotificationConfiguration
OperationSupported
GetBucketLogging
PutBucketLogging
OperationSupported
GetBucketAccelerateConfiguration
PutBucketAccelerateConfiguration
OperationSupported
GetBucketRequestPayment
PutBucketRequestPayment
OperationSupported
GetBucketAnalyticsConfiguration
PutBucketAnalyticsConfiguration
DeleteBucketAnalyticsConfiguration
ListBucketAnalyticsConfigurations
OperationSupported
GetBucketIntelligentTieringConfiguration
PutBucketIntelligentTieringConfiguration
DeleteBucketIntelligentTieringConfiguration
ListBucketIntelligentTieringConfigurations
OperationSupported
GetBucketInventoryConfiguration
PutBucketInventoryConfiguration
DeleteBucketInventoryConfiguration
ListBucketInventoryConfigurations
OperationSupported
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)
}