Skip to content

winterbaume-s3

S3 service implementation for winterbaume.

Coverage

MetricValue
ServiceS3
AWS models3
ProtocolrestXml
winterbaume coverage103/107 operations (96.3%)
stubs (routed, returns empty/default)4/107 operations (3.7%)
moto coverage73/107 operations (68.2%)
floci coverage51/107 operations (47.7%)
kumo coverage36/107 operations (33.6%)
Coverage report date2026-05-13

Server-mode usage

Start winterbaume-server and point the AWS CLI at it:

sh
cargo run -p winterbaume-server -- --host 127.0.0.1 --port 5555
sh
export AWS_ENDPOINT_URL=http://localhost:5555
aws s3api list-buckets

Example

rust
use aws_sdk_s3::config::BehaviorVersion;
use winterbaume_core::MockAws;
use winterbaume_s3::S3Service;

#[tokio::main]
async fn main() {
    let mock = MockAws::builder().with_service(S3Service::new()).build();

    let config = aws_config::defaults(BehaviorVersion::latest())
        .http_client(mock.http_client())
        .credentials_provider(mock.credentials_provider())
        .region(aws_sdk_s3::config::Region::new("us-east-1"))
        .load()
        .await;

    let client = aws_sdk_s3::Client::new(&config);

    client
        .create_bucket()
        .bucket("example-bucket")
        .send()
        .await
        .expect("create_bucket should succeed");
    let resp = client
        .list_buckets()
        .send()
        .await
        .expect("list_buckets should succeed");
    println!(
        "S3 buckets: {:?}",
        resp.buckets()
            .iter()
            .map(|b| b.name().unwrap_or_default())
            .collect::<Vec<_>>()
    );
}

Implemented APIs (103)

  • AbortMultipartUpload
  • CompleteMultipartUpload
  • CopyObject
  • CreateBucket
  • CreateBucketMetadataConfiguration
  • CreateBucketMetadataTableConfiguration
  • CreateMultipartUpload
  • DeleteBucket
  • DeleteBucketAnalyticsConfiguration
  • DeleteBucketCors
  • DeleteBucketEncryption
  • DeleteBucketIntelligentTieringConfiguration
  • DeleteBucketInventoryConfiguration
  • DeleteBucketLifecycle
  • DeleteBucketMetadataConfiguration
  • DeleteBucketMetadataTableConfiguration
  • DeleteBucketMetricsConfiguration
  • DeleteBucketOwnershipControls
  • DeleteBucketPolicy
  • DeleteBucketReplication
  • DeleteBucketTagging
  • DeleteBucketWebsite
  • DeleteObject
  • DeleteObjectTagging
  • DeleteObjects
  • DeletePublicAccessBlock
  • GetBucketAbac
  • GetBucketAccelerateConfiguration
  • GetBucketAcl
  • GetBucketAnalyticsConfiguration
  • GetBucketCors
  • GetBucketEncryption
  • GetBucketIntelligentTieringConfiguration
  • GetBucketInventoryConfiguration
  • GetBucketLifecycleConfiguration
  • GetBucketLocation
  • GetBucketLogging
  • GetBucketMetadataConfiguration
  • GetBucketMetadataTableConfiguration
  • GetBucketMetricsConfiguration
  • GetBucketNotificationConfiguration
  • GetBucketOwnershipControls
  • GetBucketPolicy
  • GetBucketReplication
  • GetBucketRequestPayment
  • GetBucketTagging
  • GetBucketVersioning
  • GetBucketWebsite
  • GetObject
  • GetObjectAcl
  • GetObjectAttributes
  • GetObjectLegalHold
  • GetObjectLockConfiguration
  • GetObjectRetention
  • GetObjectTagging
  • GetPublicAccessBlock
  • HeadBucket
  • HeadObject
  • ListBucketAnalyticsConfigurations
  • ListBucketIntelligentTieringConfigurations
  • ListBucketInventoryConfigurations
  • ListBucketMetricsConfigurations
  • ListBuckets
  • ListDirectoryBuckets
  • ListMultipartUploads
  • ListObjectVersions
  • ListObjects
  • ListObjectsV2
  • ListParts
  • PutBucketAbac
  • PutBucketAccelerateConfiguration
  • PutBucketAcl
  • PutBucketAnalyticsConfiguration
  • PutBucketCors
  • PutBucketEncryption
  • PutBucketIntelligentTieringConfiguration
  • PutBucketInventoryConfiguration
  • PutBucketLifecycleConfiguration
  • PutBucketLogging
  • PutBucketMetricsConfiguration
  • PutBucketNotificationConfiguration
  • PutBucketOwnershipControls
  • PutBucketPolicy
  • PutBucketReplication
  • PutBucketRequestPayment
  • PutBucketTagging
  • PutBucketVersioning
  • PutBucketWebsite
  • PutObject
  • PutObjectAcl
  • PutObjectLegalHold
  • PutObjectLockConfiguration
  • PutObjectRetention
  • PutObjectTagging
  • PutPublicAccessBlock
  • RenameObject
  • SelectObjectContent
  • UpdateBucketMetadataInventoryTableConfiguration
  • UpdateBucketMetadataJournalTableConfiguration
  • UpdateObjectEncryption
  • UploadPart
  • UploadPartCopy
  • WriteGetObjectResponse
Stubbed APIs (4) — routed but return an empty/default response
  • CreateSession
  • GetBucketPolicyStatus
  • GetObjectTorrent
  • RestoreObject

Path-style bucket URLs

winterbaume only supports path-style S3 URLs (http://host:port/bucket/key). Virtual-hosted-style URLs (http://bucket.host:port/key) are not supported when using a custom endpoint.

Most AWS SDKs and tools default to virtual-hosted-style for S3. When pointing them at winterbaume, you need to force path-style addressing. For example:

  • AWS CLI: aws s3api --endpoint-url http://localhost:5555 list-buckets (path-style is the default for custom endpoints)
  • aws-sdk-rust: use force_path_style(true) on the S3 config builder
  • Terraform: set s3_use_path_style = true in the provider block:
hcl
provider "aws" {
  region                      = "us-east-1"
  access_key                  = "test"
  secret_key                  = "test"
  s3_use_path_style           = true
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true

  endpoints {
    s3  = "http://localhost:5555"
    sts = "http://localhost:5555"
  }
}

Released under the Apache-2.0 License. This project is not affiliated with or endorsed by Amazon Web Services.