Star 历史趋势
数据来源: GitHub API · 生成自 Stargazers.cn
README.md

Floci Floci

Any Cloud. Locally.
Light, fluffy, and always free
No account. No auth token. No feature gates. Just docker compose up.

Latest Release Build Status Docker Pulls Docker Image Size License: MIT GitHub Stars

Quick Start · Features · Services · SDKs · Testcontainers · Migration · Docs


What is Floci?

Floci is a free, open-source local AWS emulator for development, testing, and CI.

It gives you AWS-shaped services on your machine without requiring a cloud account, an auth token, or paid feature gates. Point your AWS SDK, CLI, Terraform, CDK, OpenTofu, or test suite at http://localhost:4566 and keep your existing workflows.

Already using LocalStack? Floci is a drop-in replacement: swap the image and keep going. See Migrating from LocalStack.

Floci is the AWS member of the Floci emulator family, named after floccus, the cloud formation that looks like popcorn.

EmulatorCloudPort
flociAWS4566
floci-azAzure4577
floci-gcpGCP4588
floci-ociOCI4599

Quick Start

The fastest way to run Floci is with the official CLI

floci start

Export the AWS environment variables:

eval $(floci env)

Use your existing AWS tools normally:

aws s3 mb s3://my-bucket

aws dynamodb create-table \
  --table-name demo-table \
  --attribute-definitions AttributeName=pk,AttributeType=S \
  --key-schema AttributeName=pk,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

aws dynamodb list-tables

Watch it run

This short demo shows the CLI flow: start Floci, export the local AWS environment, run standard AWS CLI commands, and stop the emulator.

https://github.com/user-attachments/assets/b55714dc-ef36-40ae-a734-cd2cadc288a8

All AWS services are available at http://localhost:4566. Any region works. Credentials can be any non-empty values unless you explicitly enable stricter service-specific auth checks.

Prefer Docker Compose?

Create a compose.yaml file:

services:
  floci:
    image: floci/floci:latest
    ports:
      - "4566:4566"

Start Floci:

docker compose up

Then configure your AWS environment manually:

export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
Using the old hectorvent/floci image?

Update your image name:

# Before
image: hectorvent/floci:latest

# After
image: floci/floci:latest

The old hectorvent/floci repository no longer receives updates.

Web Console

Floci ships a browser console for inspecting the resources in your local emulator.

Open it at: http://localhost:4566/_floci/ui

Nothing runs at boot. The first request pulls the console image, starts it as a sidecar container on Floci's Docker network, hands it Floci's own reachable address plus the standard AWS environment, polls its health endpoint, and redirects the browser once it reports it can reach Floci. The sidecar's port is bound by Docker, so it needs no ports: entry of your own, and its logs are streamed into CloudWatch Logs under /floci/ui.

Starting a container needs the Docker socket:

services:
  floci:
    image: floci/floci:latest
    ports:
      - "4566:4566"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
VariableDefaultDescription
FLOCI_SERVICES_UI_ENABLEDtrueEnable the console sidecar
FLOCI_SERVICES_UI_IMAGEfloci/floci-ui:latestConsole image to run
FLOCI_SERVICES_UI_CONTAINER_NAMEfloci-uiName of the sidecar container
FLOCI_SERVICES_UI_PORT4500Host port the console is published on
FLOCI_SERVICES_UI_KEEP_RUNNING_ON_SHUTDOWNfalseLeave the sidecar running when Floci stops

Running a different console

The console is not fixed to the one Floci ships. Any console implementing the Floci console contract runs with nothing but an image name: listen on the port in PORT, serve GET /api/health, talk to Floci at AWS_ENDPOINT_URL.

environment:
  FLOCI_SERVICES_UI_IMAGE: acme/my-console:1.0

A console that differs from the contract's defaults says so in its own io.floci.console.* image labels, so its operators do not have to. StackPort, for example, listens on 8080 rather than 4500; on an image that predates the labels, say it by hand:

environment:
  FLOCI_SERVICES_UI_IMAGE: davireis/stackport:latest
  FLOCI_SERVICES_UI_CONTAINER_NAME: floci-stackport
  FLOCI_SERVICES_UI_PORT: "8080"
  FLOCI_SERVICES_UI_INTERNAL_PORT: "8080"

Floci Dash is another. It honours PORT, so only the two things it does differ on need naming:

environment:
  FLOCI_SERVICES_UI_IMAGE: ghcr.io/ofsazib/floci-dash:latest
  FLOCI_SERVICES_UI_CONTAINER_NAME: floci-dash
  FLOCI_SERVICES_UI_ENDPOINT_ENV: FLOCI_URL
  FLOCI_SERVICES_UI_STATUS_PATH: /api/healthz

The endpoint itself is never configured by hand: Floci resolves its own reachable address at start time and injects it as AWS_ENDPOINT_URL.

Full reference: Web Console and Console Contract v1.

Features

Local AWS without the cloud account

Run AWS-compatible services locally without an AWS account, auth token, or paid feature gates.

Real Docker where fidelity matters

Lambda, RDS, Neptune, ElastiCache, MSK, ECS, EC2, EKS, OpenSearch, CodeBuild, and Managed Service for Apache Flink use real Docker-backed execution instead of shallow mocks.

Drop-in AWS compatibility

Point standard AWS clients at http://localhost:4566. Existing credentials, regions, SDKs, CLI commands, and IaC workflows stay familiar.

Terraform can provision AWS-shaped resources locally through Floci using the standard HashiCorp AWS provider. See the Terraform with Floci guide for provider configuration, resource examples, and optional emulated S3 state.

Fast enough for CI

The native image starts in milliseconds and keeps idle memory low, making it practical for local development and test pipelines.

Configurable persistence

Choose from in-memory, persistent, hybrid, and write-ahead log storage depending on the durability profile you need.

Why Floci?

LocalStack's community edition sunset in March 2026, requiring auth tokens and freezing security updates. Floci is the no-strings-attached alternative.

CapabilityFlociLocalStack Community
Auth token requiredNoYes
Security updatesYesFrozen
Startup time~24 ms~3.3 s
Idle memory~13 MiB~143 MiB
Docker image size~90 MB~1.0 GB
LicenseMITRestricted
API Gateway v2 / HTTP APIYesNo
CognitoYesNo
RDS, ElastiCache, MSKReal DockerNo
Neptune (graph DB + Gremlin WebSocket)Real DockerNo
DocumentDB (MongoDB-compatible)Real DockerNo
ECS, EC2, EKSReal DockerNo
CodeBuildReal Docker executionNo
Native binary~40 MBNo

Broad AWS coverage. Free forever. See the Services Overview for the full list of emulated services.

Architecture Overview

flowchart LR
    Client["AWS SDK / CLI"]

    subgraph Floci ["Floci, port 4566"]
        Router["HTTP Router\nJAX-RS / Vert.x"]

        subgraph Stateless ["Stateless Services"]
            A["SSM · SQS · SNS\nIAM · STS · KMS\nSecrets Manager · SES\nCognito · Kinesis\nEventBridge · Scheduler · AppConfig\nCloudWatch · Step Functions\nCloudFormation · ACM · Config · CloudTrail\nAPI Gateway · AppSync · ELB v2 · Auto Scaling\nElastic Beanstalk · CodeDeploy · CodePipeline · Backup · FIS · Bedrock Runtime · Bedrock AgentCore · Route53 · Transfer"]
        end

        subgraph Stateful ["Stateful Services"]
            B["S3 · DynamoDB\nDynamoDB Streams"]
        end

        subgraph Containers ["Container Services"]
            C["Lambda\nElastiCache\nRDS\nNeptune\nECS\nEC2\nMSK\nEKS\nOpenSearch\nCodeBuild\nManaged Flink"]
            D["Athena -> floci-duck\nDuckDB sidecar"]
        end

        Router --> Stateless
        Router --> Stateful
        Router --> Containers
        Stateless & Stateful --> Store[("StorageBackend\nmemory · hybrid · persistent · wal")]
    end

    Docker["Docker Engine"]
    Client -->|"HTTP :4566\nAWS wire protocol"| Router
    Containers -->|"Docker API\nIAM / SigV4 auth"| Docker

Supported Services

Floci supports local emulation for application services, data services, eventing, identity, infrastructure, billing, and container-backed workloads.

CategoryServices
Core app servicesS3, SQS, SNS, DynamoDB, Lambda, Lambda MicroVMs, IAM, STS, KMS, Secrets Manager, SSM
Events and workflowsEventBridge, EventBridge Pipes, EventBridge Scheduler, Step Functions, SWF, CloudWatch Logs, CloudWatch Metrics, CloudWatch OAM, CloudWatch RUM, Managed Prometheus (AMP)
API and identityAPI Gateway REST, API Gateway v2, AppSync, Cognito, Cognito Identity, ACM, Route53, Route 53 Resolver, Cloud Map, Global Accelerator
Containers and computeECS, EC2, Lightsail, EKS, MWAA, ECR, EFS, CodeBuild, CodeDeploy, CodePipeline, CodeGuru Reviewer, CodeArtifact, AWS Batch, Auto Scaling, Application Auto Scaling, Elastic Beanstalk, ELB v2, ELB Classic
Data, analytics, and AIAthena, Glue, Lake Formation, EMR, EMR Serverless, Redshift, Redshift Data API, Firehose, Managed Service for Apache Flink, OpenSearch, S3 Tables, S3 Vectors, Textract, Transcribe, Comprehend, Rekognition, Translate, Bedrock, Bedrock Runtime, Bedrock AgentCore, Bedrock AgentCore Control, SageMaker
Databases and cachingRDS, RDS Data API, Neptune, DocumentDB, MemoryDB, ElastiCache
Messaging and transferSES, Kinesis, MSK, Amazon MQ, Transfer Family, DataSync, IoT Core, Amazon Connect, Amazon AppIntegrations
Security and governanceAWS Network Firewall, AWS RAM, Service Quotas, WAF v2, GuardDuty, Amazon Inspector, CloudTrail, CloudFront, Resource Groups Tagging API, Resource Explorer 2, CloudHSM v2, Organizations, AWS Account Management, IAM Access Analyzer, IAM Identity Center (SSO Admin, OIDC, Access Portal, SCIM), Identity Store, Amazon Macie, Amazon Detective, Security Hub, Amazon Verified Permissions, Control Catalog, Control Tower, Service Catalog, AWS Marketplace
Cost and billingAWS Budgets, Pricing, Cost Explorer, Cost and Usage Reports, BCM Pricing Calculator, BCM Data Exports
Resilience, backup, and configAWS FIS, AWS Backup, AWS Config, AppConfig, AppConfigData, CloudFormation, Cloud Control API

For operation-level compatibility, see the Services Overview.

Detailed service notes
ServiceHow it worksNotable features
SSMIn-process + EC2 containersParameter Store (version history, labels, SecureString, tagging); Run Command (SendCommand, GetCommandInvocation, direct EC2 container execution, agent polling)
SQSIn-processStandard and FIFO queues, DLQ, visibility timeout, batch operations, tagging
SNSIn-processTopics, subscriptions, SQS, Lambda and HTTP delivery, tagging
S3In-processVersioning, multipart upload, pre-signed URLs, Object Lock, object annotations, event notifications
S3 VectorsIn-processVector buckets, indexes, put / get / list / delete vectors, cosine similarity queries
DynamoDBIn-processGSI, LSI, Query, Scan, TTL, transactions, batch operations; Streams with shard iterators and Lambda event source mapping
LambdaReal DockerRuntime environment, execution model, warm container pool, aliases, Function URLs
API Gateway RESTIn-processResources, methods, stages, Lambda proxy, MOCK integrations, AWS integrations
API Gateway v2In-processHTTP APIs, routes, integrations, JWT authorizers, stages
AppSyncIn-processGraphQL API management API, schema registry, AWS scalars, domain names, channel namespaces
IAMIn-processUsers, roles, groups, policies, instance profiles, access keys; STS AssumeRole, WebIdentity, SAML, GetFederationToken, GetSessionToken
CognitoIn-processUser pools, app clients, auth flows, JWKS and OpenID well-known endpoints
KMSIn-processEncrypt, decrypt, sign, verify, data keys, aliases
KinesisIn-processStreams, shards, enhanced fan-out, split and merge
Secrets ManagerIn-processVersioning, resource policies, tagging
Step FunctionsIn-processASL execution, task tokens, execution history
SWFIn-processDecision and activity tasks, timers, child workflows, timeouts, real Lambda invocation
CloudFormationIn-processStacks, change sets, resource provisioning, StackSets (cross-account instances)
EventBridgeIn-processCustom buses, rules, SQS, SNS and Lambda targets
EventBridge PipesIn-processPoller-based integration connecting SQS, Kinesis, DynamoDB, and MSK sources to targets with optional filtering
EventBridge SchedulerIn-processSchedule groups, schedules, flexible time windows, retry policies, DLQs
CloudWatch LogsIn-processLog groups, streams, ingestion, filtering
CloudWatch MetricsIn-processCustom metrics, statistics, alarms
CloudWatch OAMIn-processFull 15-operation sink, policy, cross-account link, and tagging API
ElastiCacheReal DockerRedis / Valkey protocol, IAM auth, SigV4 validation
MemoryDBReal DockerRedis / Valkey protocol via real containers; JSON 1.1 control plane; reuses ElastiCache RESP proxy
RDSReal DockerPostgreSQL, MySQL, MariaDB, IAM auth, JDBC-compatible engines
RDS Data APIREST JSON over real RDS containersRaw SQL execution and transactions for local MySQL / MariaDB RDS resources
NeptuneReal DockerGraph DB via TinkerPop Gremlin Server (default) or Neo4j for openCypher/Bolt (NEPTUNE_DB_TYPE); RDS-shaped control plane; SigV4 proxy on port 8182
DocumentDBReal Docker, mock mode availableMongoDB-compatible cluster via real MongoDB containers; RDS-shaped control plane; MongoDB wire protocol on port 27017
MSKReal DockerKafka-compatible broker via Redpanda
Amazon MQReal DockerRabbitMQ broker via rabbitmq:3-management; AMQP + management console
AthenaIn-process with DuckDB sidecarReal SQL execution over S3 and Glue-backed views
GlueIn-processData Catalog, Schema Registry, tables consumed by Athena
EMRIn-processCluster (job flow) lifecycle, instance groups and fleets, steps, security configurations, tagging
Data FirehoseIn-processStreaming delivery, buffered flush to S3 with GZIP/ZIP/Snappy compression
Managed Service for Apache FlinkReal DockerKinesis Analytics V2 control plane; StartApplication runs a real Flink cluster (JobManager + TaskManager, image per RuntimeEnvironment), pulls the application JAR from local S3, and submits the job
ECSReal DockerClusters, task definitions, tasks, services, capacity providers, task sets
EC2Real DockerRunInstances launches containers, SSH key injection, UserData, IMDS, VPC resources
LightsailIn-processInstances, disks, static IPs, key pairs, ports, tags, regions, blueprints, bundles, operations
ACMIn-processCertificate issuance and validation lifecycle
ECRIn-process with real registryRepositories, docker push / pull, image-backed Lambda functions
Resource Groups Tagging APIIn-processGetResources, tag and untag resources, tag key and value discovery across services
SESIn-processv1 and v2 APIs: send email, raw email, identity verification, DKIM, templates, configuration sets, account sending
OpenSearchReal DockerDomain CRUD, tags, versions, instance types, upgrade stubs
AppConfigIn-processApplications, environments, profiles, hosted versions, deployments
AppConfigDataIn-processConfiguration sessions and dynamic configuration retrieval
BedrockIn-processGuardrail lifecycle, versions, and tags on the control plane
Bedrock RuntimeIn-process stubDummy Converse and InvokeModel responses for local development
Bedrock AgentCoreIn-process stubStateful control plane (agent runtimes, gateways, memory, workload identity); canned InvokeAgentRuntime responses
EKSReal Docker, mock mode availablek3s clusters with live Kubernetes API server
MWAAReal Docker, mock mode availableReal Apache Airflow (LocalExecutor) + Postgres metadata DB per environment; web/CLI proxy; S3-backed DAG sync
ELB v2In-processALB, NLB, target groups, listeners, routing rules, Lambda targets, tags
CodeBuildIn-process with real DockerReal buildspec execution, CloudWatch logs, S3 artifacts
CodeDeployIn-process with Lambda traffic shiftingDeployment groups, configs, lifecycle hooks, auto-rollback
CodePipelineIn-process orchestrationPipelines, executions, S3 artifacts, approvals, local providers, custom workers
AWS Network FirewallIn-processDescribeFirewall with stable emulated endpoint attachments for infrastructure tooling
Service QuotasIn-processGenerated quota catalog with generous static values; real quota codes for CodeBuild and Lambda concurrency
AWS RAMIn-processEnableSharingWithAwsOrganization opt-in
AWS BatchIn-processCompute environments, job queues, job definitions, job submission and lifecycle
Auto ScalingIn-process with reconcilerLaunch configs, ASGs, desired capacity reconciliation, lifecycle hooks
Application Auto ScalingIn-processScalable targets, target-tracking and step scaling policies, CloudWatch alarm creation, tagging (policies are stored but inert)
Elastic BeanstalkIn-processApplications, application versions, environments, configuration templates, platform and solution stack metadata
AWS BackupIn-processVaults, backup plans, selections, simulated job lifecycle, recovery points
AWS FISIn-processAll 26 management APIs for templates, experiments, target accounts, action and target discovery, safety lever, tagging, and pagination; experiment execution is a safe control-plane simulation and does not inject faults into other services
AWS ConfigIn-processConfig rules, evaluation-driven compliance (PutEvaluations, compliance details and summaries), configuration recorders, delivery channels, retention configuration, conformance packs, tagging
OrganizationsIn-processOrganizations, roots, nested OUs, member accounts, all policy types with FullAWSAccess and effective-policy inheritance, trusted service access, delegated administrators, resource policy, and the full invitation/handshake flow; created accounts are usable Floci accounts and member accounts can read the organization they belong to
CloudTrailIn-processTrails, event selectors (S3 data events with bucket/prefix matching), StartLogging/StopLogging, scheduled gzipped log file emission to the destination bucket at AWS-shaped key paths, IAM-deny path emits AccessDenied records
CloudFrontIn-processDistributions, origins, cache behaviors, invalidations, tagging
WAF v2In-processWeb ACLs, IP sets, regex pattern sets, rule groups, logging configs, resource associations, tagging (REGIONAL and CLOUDFRONT scopes)
Resource Explorer 2In-processAll 32 management APIs: index and view lifecycle, multi-Region setup tasks, the full search query grammar, and tagging; 30 services expose their resources for search, gathered live rather than from an index
Route53In-processHosted zones, SOA and NS records, resource record sets, change tracking, tagging
Cloud MapIn-processHTTP and DNS namespaces, services, instance registration, discovery queries, operations, tagging
Transfer FamilyIn-processServer lifecycle, user management, SSH key import, tagging
TextractIn-process stubAPI-compatible stubs, dummy block data, async job simulation
TranscribeIn-process stubTranscription jobs and custom vocabularies; jobs complete immediately, no real audio processing
PricingIn-process with static snapshotProduct discovery, attributes, price list files, pagination
Cost ExplorerIn-processCost synthesized from Floci resource state and pricing snapshots
Cost and Usage ReportsIn-process with floci-duck sidecarCUR 2.0 and FOCUS 1.2 columns, account-scoped storage, Parquet emission
BCM Pricing CalculatorIn-processWorkload estimate create, usage pricing, read, and delete lifecycle
BCM Data ExportsIn-processExport lifecycle, executions, update and delete operations

Real Docker Integration

Floci uses real Docker containers when in-process emulation would reduce fidelity. This applies to stateful databases, connection-heavy protocols, runtimes, and build systems.

ServiceDefault imageWhat is real
Lambdapublic.ecr.aws/lambda/<runtime>AWS runtime environment, execution model, warm container pool
ElastiCachevalkey/valkey:8Redis / Valkey protocol, ACL-based IAM auth, SigV4 validation
RDS PostgreSQLpostgres:16-alpinePostgreSQL engine, IAM auth, JDBC-compatible access
RDS MySQL / Auroramysql:8.0MySQL engine, IAM auth, JDBC-compatible access
RDS MariaDBmariadb:11MariaDB engine, IAM auth, JDBC-compatible access
Neptunetinkerpop/gremlin-server:3.7.3TinkerPop Gremlin Server; Gremlin WebSocket on port 8182; SigV4 auth proxy
Neptune (openCypher)neo4j:5-communityNeo4j backend when FLOCI_SERVICES_NEPTUNE_DB_TYPE=neo4j; openCypher over Bolt
DocumentDBmongo:7.0MongoDB engine; MongoDB wire protocol on port 27017
MSKredpandadata/redpanda:latestKafka-compatible broker via Redpanda
Amazon MQrabbitmq:3-managementRabbitMQ broker; AMQP on port 5672, management console on 15672
Managed Service for Apache Flinkapache/flink:<version>Apache Flink JobManager; image chosen per RuntimeEnvironment (FLINK-1_15 … FLINK-1_20, FLINK-2_0 … FLINK-2_3)
EC2AMI-mapped Linux imagesLinux containers, SSH key injection, UserData, IMDS, IAM credentials
ECSUser-specified task imageContainer lifecycle, start, stop, health checks
EKSrancher/k3s:latestKubernetes API server via k3s
MWAAapache/airflow:<version>-python3.12 + postgres:16-alpineReal Apache Airflow (LocalExecutor: scheduler + webserver) with its own Postgres metadata DB; webserver/CLI reachable via Floci's proxy
CodeBuildUser-specified environment imageBuildspec execution, log streaming, S3 artifact upload
OpenSearchopensearchproject/opensearch:2Full OpenSearch engine with REST API
ECRregistry:2OCI-compatible registry for docker push and docker pull
Verified Permissionsfloci/floci-sidecar-cedar:1.1.0Cedar 4 policy parsing, schema validation and authorization decisions, via a Floci sidecar

Docker-backed services require the Docker socket:

docker run -d --name floci \
  -p 4566:4566 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -u root \
  floci/floci:latest

Overriding default images

VariableDefault
FLOCI_SERVICES_ELASTICACHE_DEFAULT_IMAGEvalkey/valkey:8
FLOCI_SERVICES_RDS_DEFAULT_POSTGRES_IMAGEpostgres:16-alpine
FLOCI_SERVICES_RDS_DEFAULT_MYSQL_IMAGEmysql:8.0
FLOCI_SERVICES_RDS_DEFAULT_MARIADB_IMAGEmariadb:11
FLOCI_SERVICES_MSK_DEFAULT_IMAGEredpandadata/redpanda:latest
FLOCI_SERVICES_OPENSEARCH_DEFAULT_IMAGE(unset — images resolve per requested EngineVersion)
FLOCI_SERVICES_KINESIS_ANALYTICS_DEFAULT_IMAGE(unset; chosen per RuntimeEnvironment)
FLOCI_SERVICES_NEPTUNE_DEFAULT_IMAGEtinkerpop/gremlin-server:3.7.3
FLOCI_SERVICES_NEPTUNE_DEFAULT_NEO4J_IMAGEneo4j:5-community
FLOCI_SERVICES_DOCDB_DEFAULT_IMAGEmongo:7.0
FLOCI_SERVICES_EKS_DEFAULT_IMAGErancher/k3s:latest
FLOCI_SERVICES_MWAA_DEFAULT_POSTGRES_IMAGEpostgres:16-alpine
FLOCI_SERVICES_ECR_REGISTRY_IMAGEregistry:2
FLOCI_SERVICES_LAMBDA_ECR_BASE_URIpublic.ecr.aws

Persistence and Storage Modes

Floci can trade speed for durability depending on the workflow. Configure the default mode with FLOCI_STORAGE_MODE, or override storage per service.

ModeBehaviorBest forDurability
memoryEntirely in RAM. Data is lost when the container stops.CI and ephemeral testsNone
persistentLoaded at startup and flushed to disk immediately on every write operation.Simple local state preservation with immediate persistenceMedium
hybridIn-memory performance with periodic async flushing every 5 seconds.Local developmentGood
walWrite-ahead log. Every mutation is logged before responding.Maximum durabilityHighest

Use memory for fast test runs. Use hybrid when you want state preserved across container restarts without much overhead.

For more detail, see the Storage Configuration documentation.

Multi-Account Isolation

Floci supports per-account resource isolation with no extra setup. If AWS_ACCESS_KEY_ID is exactly 12 digits, Floci uses it as the account ID. Resources created by one account are invisible to another.

AWS_ACCESS_KEY_ID=111111111111 aws sqs create-queue --queue-name orders
AWS_ACCESS_KEY_ID=222222222222 aws sqs create-queue --queue-name orders

Any other key format, such as test or AKIA..., causes Floci to fall back to FLOCI_DEFAULT_ACCOUNT_ID, which defaults to 000000000000.

STS temporary credentials are routed too: credentials from AssumeRole resolve to the assumed role's account, so the cross-account assume-role-then-provision pattern works locally. Resolution precedence is 12-digit AKID → temporary-session lookup → FLOCI_DEFAULT_ACCOUNT_ID.

See the Multi-Account Isolation docs.

SDK Integration

Point your existing AWS SDK at http://localhost:4566.

Java, AWS SDK v2
var client = DynamoDbClient.builder()
    .endpointOverride(URI.create("http://localhost:4566"))
    .region(Region.US_EAST_1)
    .credentialsProvider(StaticCredentialsProvider.create(
        AwsBasicCredentials.create("test", "test")))
    .build();

client.createTable(b -> b
    .tableName("demo-table")
    .billingMode(BillingMode.PAY_PER_REQUEST)
    .attributeDefinitions(
        AttributeDefinition.builder().attributeName("pk").attributeType(ScalarAttributeType.S).build())
    .keySchema(
        KeySchemaElement.builder().attributeName("pk").keyType(KeyType.HASH).build()));

System.out.println(client.listTables().tableNames());
Python, boto3
import boto3

client = boto3.client(
    "ssm",
    endpoint_url="http://localhost:4566",
    region_name="us-east-1",
    aws_access_key_id="test",
    aws_secret_access_key="test",
)

client.put_parameter(
    Name="/demo/app/message",
    Value="hello from floci",
    Type="String",
    Overwrite=True,
)

response = client.get_parameter(Name="/demo/app/message")
print(response["Parameter"]["Value"])
Node.js, AWS SDK v3
import { SQSClient, SendMessageCommand } from "@aws-sdk/client-sqs";

const client = new SQSClient({
  endpoint: "http://localhost:4566",
  region: "us-east-1",
  credentials: { accessKeyId: "test", secretAccessKey: "test" },
});

await client.send(
  new SendMessageCommand({
    QueueUrl: "http://localhost:4566/000000000000/demo-queue",
    MessageBody: "hello from floci",
  }),
);
Go, AWS SDK v2
package main

import (
    "context"
    "fmt"
    "log"

    "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, err := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("us-east-1"),
        config.WithCredentialsProvider(
            credentials.NewStaticCredentialsProvider("test", "test", ""),
        ),
        config.WithBaseEndpoint("http://localhost:4566"),
    )
    if err != nil {
        log.Fatal(err)
    }

    client := s3.NewFromConfig(cfg, func(o *s3.Options) {
        o.UsePathStyle = true
    })

    out, err := client.ListBuckets(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(out.Buckets)
}
Rust, AWS SDK
use aws_sdk_secretsmanager::config::{Credentials, Region};
use aws_sdk_secretsmanager::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = aws_config::defaults(aws_config::BehaviorVersion::latest())
        .region(Region::new("us-east-1"))
        .credentials_provider(Credentials::new("test", "test", None, None, "floci"))
        .endpoint_url("http://localhost:4566")
        .load()
        .await;

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

    client
        .create_secret()
        .name("demo/secret")
        .secret_string("hello from floci")
        .send()
        .await?;

    Ok(())
}
Bash, AWS CLI
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
export AWS_DEFAULT_REGION=us-east-1

aws --endpoint-url http://localhost:4566 s3 mb s3://my-bucket
aws --endpoint-url http://localhost:4566 s3 ls

Testcontainers

Floci has Testcontainers modules for starting isolated Floci instances directly from tests. This avoids shared state, manual daemon setup, and port conflicts.

For Testcontainers 1.x, use the versions as indicated in the table below.

LanguagePackageLatestRegistrySource
Javaio.floci:testcontainers-floci1.14.0Maven CentralGitHub
Node.js@floci/testcontainers0.1.0npmGitHub
Pythontestcontainers-floci0.1.1PyPIGitHub
.NETTestcontainers.Flocisee releasesGitHub PackagesGitHub
GoIn progressIn progressN/AGitHub
Java
<dependency>
    <groupId>io.floci</groupId>
    <artifactId>testcontainers-floci</artifactId>
    <version>1.14.0</version>
    <scope>test</scope>
</dependency>
@Testcontainers
class S3IntegrationTest {

    @Container
    static FlociContainer floci = new FlociContainer();

    @Test
    void shouldCreateBucket() {
        S3Client s3 = S3Client.builder()
                .endpointOverride(URI.create(floci.getEndpoint()))
                .region(Region.of(floci.getRegion()))
                .credentialsProvider(StaticCredentialsProvider.create(
                        AwsBasicCredentials.create(floci.getAccessKey(), floci.getSecretKey())))
                .forcePathStyle(true)
                .build();

        s3.createBucket(b -> b.bucket("my-bucket"));
    }
}

For Testcontainers 2.x / Spring Boot 4.x, use version 2.15.0.

Node.js / TypeScript
npm install --save-dev @floci/testcontainers
import { FlociContainer } from "@floci/testcontainers";
import { S3Client, CreateBucketCommand } from "@aws-sdk/client-s3";

describe("S3", () => {
  let floci: FlociContainer;

  beforeAll(async () => {
    floci = await new FlociContainer().start();
  });

  afterAll(async () => {
    await floci.stop();
  });

  it("creates a bucket", async () => {
    const s3 = new S3Client({
      endpoint: floci.getEndpoint(),
      region: floci.getRegion(),
      credentials: {
        accessKeyId: floci.getAccessKey(),
        secretAccessKey: floci.getSecretKey(),
      },
      forcePathStyle: true,
    });

    await s3.send(new CreateBucketCommand({ Bucket: "my-bucket" }));
  });
});
Python
pip install testcontainers-floci
import boto3
from floci import FlociContainer


def test_s3_create_bucket():
    with FlociContainer() as floci:
        s3 = boto3.client(
            "s3",
            endpoint_url=floci.get_endpoint(),
            region_name=floci.get_region(),
            aws_access_key_id=floci.get_access_key(),
            aws_secret_access_key=floci.get_secret_key(),
        )
        s3.create_bucket(Bucket="my-bucket")

Compatibility Testing

The compatibility-tests directory validates Floci across SDKs and tooling workflows.

ModuleLanguage / ToolSDK / ClientTests
sdk-test-javaJava 17AWS SDK for Java v21,326
sdk-test-nodeNode.jsAWS SDK for JavaScript v3449
sdk-test-pythonPython 3boto3311
sdk-test-goGoAWS SDK for Go v2 + RDS Data API SDK v1157
sdk-test-awscliBashAWS CLI v2205
compat-terraformTerraformv1.10+67
compat-opentofuOpenTofuv1.9+41
compat-cdkAWS CDKv2+20

2,576 automated compatibility tests across 5 SDKs and 3 IaC tools.

Migrating from LocalStack

Floci is a drop-in replacement for LocalStack Community. The port, credentials, SDK configuration, and CLI endpoint pattern work the same way. Swap the image and keep going.

# Before
image: localstack/localstack

# After, standard image
image: floci/floci:latest

# After, if init scripts need AWS CLI or boto3
image: floci/floci:latest-compat

LocalStack environment variables are translated automatically:

LocalStackFloci equivalent
LOCALSTACK_HOSTFLOCI_HOSTNAME
PERSISTENCE=1FLOCI_STORAGE_MODE=persistent
LAMBDA_DOCKER_NETWORKFLOCI_SERVICES_LAMBDA_DOCKER_NETWORK
LAMBDA_REMOVE_CONTAINERS=1FLOCI_SERVICES_LAMBDA_EPHEMERAL=true
DEBUG=1QUARKUS_LOG_LEVEL=DEBUG

Init scripts mounted under /etc/localstack/init/ run unchanged. The /_localstack/init and /_localstack/health endpoints are still served. Once the emulator is up, the log also ends with a LocalStack-style Ready. line, so tooling that watches the log for it, such as the default wait strategy of Testcontainers' LocalStackContainer, works unchanged. Set LOCALSTACK_PARITY=false to opt out of automatic translation.

See the full migration guide.

Image Tags

Every tag combines a variant and a channel.

ChannelStandardBaseline (ARM64 only)Compat with AWS CLI and boto3
Release, floatinglatestlatest-baselinelatest-compat
Release, pinnedx.y.zx.y.z-baselinex.y.z-compat
Nightly, floatingnightlynightly-compat
Nightly, datednightly-mmddyyyynightly-mmddyyyy-compat

Use latest for stable releases, a pinned version for reproducible builds, and nightly to track main.

# Recommended
image: floci/floci:latest

# Includes AWS CLI and boto3
image: floci/floci:latest-compat

# ARM64 baseline for Raspberry Pi 4 / pre-LSE cores
image: floci/floci:latest-baseline

# Pinned release
image: floci/floci:x.y.z

# Track main
image: floci/floci:nightly

Release train

Stable releases ship on the 1st and 3rd Tuesday of each month. Between trains, floci/floci:nightly tracks main. Every merged fix is available the next day, and dated nightly-mmddyyyy tags let you pin a specific night's build.

Versions are derived from Conventional Commits by semantic-release; CHANGELOG.md is generated, never hand-edited. Releases are cut from main only: there are no maintenance branches.

Configuration

All settings are overridable through environment variables with the FLOCI_ prefix.

VariableDefaultDescription
FLOCI_PORT4566Port exposed by the Floci API
FLOCI_DEFAULT_REGIONus-east-1Default AWS region
FLOCI_DEFAULT_ACCOUNT_ID000000000000Default AWS account ID
FLOCI_BASE_URLhttp://localhost:4566Base URL used when Floci returns service URLs
FLOCI_HOSTNAMEUnsetHostname used in returned URLs when Floci runs inside Docker Compose
FLOCI_STORAGE_MODEmemoryStorage mode: memory, persistent, hybrid, or wal
FLOCI_STORAGE_PERSISTENT_PATH./dataDirectory used for persisted state
FLOCI_SERVICES_LAMBDA_ECR_BASE_URIpublic.ecr.awsECR base URI used when pulling Lambda runtime images (legacy name FLOCI_ECR_BASE_URI still works)
FLOCI_SERVICES_S3_ENFORCE_AUTHfalseEnforce S3 public/private read access and reject unknown signed S3 access keys

Full reference: configuration docs

Multi-container Docker Compose

When your application runs in a different container, set FLOCI_HOSTNAME to the Floci service name so returned URLs, such as SQS QueueUrl values, resolve correctly.

services:
  floci:
    image: floci/floci:latest
    ports:
      - "4566:4566"
    environment:
      - FLOCI_HOSTNAME=floci

  my-app:
    environment:
      - AWS_ENDPOINT_URL=http://floci:4566
    depends_on:
      - floci

Without this, services may return URLs using localhost, which points to the wrong container from the application container.

Community

Join the Floci community on Slack or GitHub Discussions. Feature ideas, compatibility questions, design tradeoffs, and rough proposals are welcome.

Sponsors

Floci is independent open source, funded by the people and companies who use it. Sponsorship buys gratitude and nothing else: every emulated service is free for everyone, forever, and no sponsor gets features, priority, or roadmap influence that the rest of the Flock does not.

🥇 Gold

Large logo with top placement in the emulator READMEs and on floci.io, plus a mention in release notes.

IceGuard · Softmax

🥈 Silver

Logo in the emulator READMEs and on floci.io, plus a mention in release notes.

Your logo here. Become a sponsor.

🥉 Community

Name in the emulator READMEs, a sponsor badge on GitHub, and our sincere thanks.

AutoScout24 · Nexxion AI

Every sponsor, including the Friends of the Flock who support Floci outside these tiers, is listed in THANKS.md.

Sponsor Floci

Star History

Star History Chart

Contributors

License

MIT. Use it however you want.

关于 About

Light, fluffy, and always free - The AWS Local Emulator alternative
awsaws-emulationdevopsdockerec2ecslocalstacks3sqstestcontainers

语言 Languages

Java96.8%
Python0.9%
Shell0.8%
TypeScript0.8%
Go0.4%
HCL0.2%
HTML0.0%
Dockerfile0.0%
CSS0.0%
Just0.0%
Makefile0.0%
JavaScript0.0%

提交活跃度 Commit Activity

代码提交热力图
过去 52 周的开发活跃度
2348
Total Commits
峰值: 325次/周
Less
More

核心贡献者 Contributors