SkillAgentSearch skills...

Kumo

A lightweight AWS service emulator written in Go

Install / Use

/learn @sivchari/Kumo
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

<p align="center"> <img src="assets/kumo.jpg" alt="kumo logo" width="480"> <br><br> <a href="https://go.dev/"><img src="https://img.shields.io/github/go-mod/go-version/sivchari/kumo" alt="Go Version"></a> <a href="LICENSE"><img src="https://img.shields.io/github/license/sivchari/kumo" alt="License"></a> <a href="https://github.com/sivchari/kumo/releases"><img src="https://img.shields.io/github/v/release/sivchari/kumo" alt="Release"></a> <a href="https://github.com/sivchari/kumo/actions/workflows/lint.yaml"><img src="https://github.com/sivchari/kumo/actions/workflows/lint.yaml/badge.svg" alt="Lint"></a> <a href="https://github.com/sivchari/kumo/actions/workflows/integration-test.yaml"><img src="https://github.com/sivchari/kumo/actions/workflows/integration-test.yaml/badge.svg" alt="Integration Tests"></a> </p> <p align="center">A lightweight AWS service emulator written in Go.<br>Works as both a CI/CD testing tool and a local development server with optional data persistence.</p>

Features

  • No authentication required - Perfect for CI environments
  • Single binary - Easy to distribute and deploy
  • Docker support - Run as a container
  • Lightweight - Fast startup, minimal resource usage
  • AWS SDK v2 compatible - Works seamlessly with Go AWS SDK v2
  • Optional data persistence - Survive restarts with KUMO_DATA_DIR

Supported Services (71 services)

Storage

| Service | Description | |---------|-------------| | S3 | Object storage | | S3 Control | S3 account-level operations | | S3 Tables | S3 table buckets | | DynamoDB | NoSQL database | | ElastiCache | In-memory caching | | MemoryDB | Redis-compatible database | | Glacier | Archive storage | | EBS | Block storage |

Compute

| Service | Description | |---------|-------------| | Lambda | Serverless functions | | Batch | Batch computing | | EC2 | Virtual machines | | Elastic Beanstalk | Application deployment |

Container

| Service | Description | |---------|-------------| | ECS | Container orchestration | | ECR | Container registry | | EKS | Kubernetes service |

Database

| Service | Description | |---------|-------------| | RDS | Relational database service |

Messaging & Integration

| Service | Description | |---------|-------------| | SQS | Message queuing | | SNS | Pub/Sub messaging | | EventBridge | Event bus | | Kinesis | Real-time streaming | | Firehose | Data delivery | | MQ | Message broker (ActiveMQ/RabbitMQ) | | Pipes | Event-driven integration | | MSK (Kafka) | Managed streaming for Kafka |

Security & Identity

| Service | Description | |---------|-------------| | IAM | Identity and access management | | KMS | Key management | | Secrets Manager | Secret storage | | ACM | Certificate management | | Cognito | User authentication | | Security Lake | Security data lake | | STS | Security token service |

Monitoring & Logging

| Service | Description | |---------|-------------| | CloudWatch | Metrics and alarms | | CloudWatch Logs | Log management | | X-Ray | Distributed tracing | | CloudTrail | API audit logging |

Networking & Content Delivery

| Service | Description | |---------|-------------| | CloudFront | CDN | | Global Accelerator | Network acceleration | | API Gateway | API management | | Route 53 | DNS service | | Route 53 Resolver | DNS resolver | | ELBv2 | Load balancing | | App Mesh | Service mesh |

Application Integration

| Service | Description | |---------|-------------| | Step Functions | Workflow orchestration | | AppSync | GraphQL API | | SES v2 | Email service | | Scheduler | Task scheduling | | Amplify | Full-stack application hosting |

Management & Configuration

| Service | Description | |---------|-------------| | SSM | Systems Manager | | Config | Resource configuration | | CloudFormation | Infrastructure as code | | Organizations | Multi-account management | | Service Quotas | Service limit management | | CodeConnections | Source code connections | | Backup | Centralized backup service |

Analytics & ML

| Service | Description | |---------|-------------| | Athena | SQL query service | | Glue | ETL service | | Comprehend | NLP service | | Rekognition | Image/video analysis | | SageMaker | Machine learning | | Forecast | Time-series forecasting | | Data Exchange | Data marketplace | | Entity Resolution | Entity matching |

Developer Tools

| Service | Description | |---------|-------------| | CodeGuru Profiler | Application profiling | | CodeGuru Reviewer | Automated code review |

Other Services

| Service | Description | |---------|-------------| | Cost Explorer | Cost analysis | | DLM | Data lifecycle manager | | Directory Service | Microsoft AD | | EMR Serverless | Big data processing | | FinSpace | Financial data management | | GameLift | Game server hosting | | Resilience Hub | Application resilience |

Quick Start

Docker

docker run -p 4566:4566 ghcr.io/sivchari/kumo:latest

With data persistence:

docker run -p 4566:4566 \
  -e KUMO_DATA_DIR=/data \
  -v kumo-data:/data \
  ghcr.io/sivchari/kumo:latest

Binary

# Build
make build

# Run
./bin/kumo

# Run with data persistence
KUMO_DATA_DIR=./data ./bin/kumo

Docker Compose

services:
  kumo:
    image: ghcr.io/sivchari/kumo:latest
    ports:
      - "4566:4566"

With data persistence:

services:
  kumo:
    image: ghcr.io/sivchari/kumo:latest
    ports:
      - "4566:4566"
    environment:
      - KUMO_DATA_DIR=/data
    volumes:
      - kumo-data:/data

volumes:
  kumo-data:

Usage Examples

S3

package main

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"
)

func main() {
    cfg, _ := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("test", "test", "")),
    )

    client := s3.NewFromConfig(cfg, func(o *s3.Options) {
        o.BaseEndpoint = aws.String("http://localhost:4566")
        o.UsePathStyle = true
    })

    // Create bucket
    client.CreateBucket(context.TODO(), &s3.CreateBucketInput{
        Bucket: aws.String("my-bucket"),
    })

    // Put object
    client.PutObject(context.TODO(), &s3.PutObjectInput{
        Bucket: aws.String("my-bucket"),
        Key:    aws.String("hello.txt"),
        Body:   strings.NewReader("Hello, World!"),
    })
}

SQS

package main

import (
    "context"
    "fmt"

    "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/sqs"
)

func main() {
    cfg, _ := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("test", "test", "")),
    )

    client := sqs.NewFromConfig(cfg, func(o *sqs.Options) {
        o.BaseEndpoint = aws.String("http://localhost:4566")
    })

    // Create queue
    result, _ := client.CreateQueue(context.TODO(), &sqs.CreateQueueInput{
        QueueName: aws.String("my-queue"),
    })

    // Send message
    client.SendMessage(context.TODO(), &sqs.SendMessageInput{
        QueueUrl:    result.QueueUrl,
        MessageBody: aws.String("Hello from SQS!"),
    })

    // Receive message
    messages, _ := client.ReceiveMessage(context.TODO(), &sqs.ReceiveMessageInput{
        QueueUrl: result.QueueUrl,
    })

    for _, msg := range messages.Messages {
        fmt.Println(*msg.Body)
    }
}

DynamoDB

package main

import (
    "context"

    "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/dynamodb"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)

func main() {
    cfg, _ := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("test", "test", "")),
    )

    client := dynamodb.NewFromConfig(cfg, func(o *dynamodb.Options) {
        o.BaseEndpoint = aws.String("http://localhost:4566")
    })

    // Create table
    client.CreateTable(context.TODO(), &dynamodb.CreateTableInput{
        TableName: aws.String("users"),
        KeySchema: []types.KeySchemaElement{
            {AttributeName: aws.String("id"), KeyType: types.KeyTypeHash},
        },
        AttributeDefinitions: []types.AttributeDefinition{
            {AttributeName: aws.String("id"), AttributeType: types.ScalarAttributeTypeS},
        },
        BillingMode: types.BillingModePayPerRequest,
    })

    // Put item
    client.PutItem(context.TODO(), &dynamodb.PutItemInput{
        TableName: aws.String("users"),
        Item: map[string]types.AttributeValue{
            "id":   &types.AttributeValueMemberS{Value: "user-1"},
            "name": &types.AttributeValueMemberS{Value: "Alice"},
        },
    })
}

Secrets Manager

package main

import (
    "context"
    "fmt"

    "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/secretsmanager"
)

func main() {
    cfg, _ := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("test", "test", "")),
    )

    client := secretsmanager.NewFromConfig(cfg, func(o *secretsmanager.Options) {
        o.BaseEndpoint = aws.String("http://localhost:4566")
    })

    // Create secret
    client.CreateSecret(context.TODO(), &secretsmanager.CreateSecretInput{
        Name:         aws.String("my-secret"),
        SecretString: aws.String(`{"usernam
View on GitHub
GitHub Stars259
CategoryDevelopment
Updated55m ago
Forks6

Languages

Go

Security Score

100/100

Audited on Mar 27, 2026

No findings