Quick start
Prerequisites
A container runtime: oblako runs services as local containers. Docker is the default; Podman, Colima, Kubernetes and Apple’s
containeralso work (see Container runtimes).Python 3.10+
Install
pip install oblako
Or from source:
git clone https://github.com/almostly/oblako && cd oblako
pip install -e .
Start the services
oblako up # start all services
oblako configure # write the `oblako` AWS profile
export AWS_PROFILE=oblako # point boto3 and the AWS CLI at oblako
oblako pull qwen2.5:0.5b # pull a model into the Bedrock (Ollama) engine
oblako dashboard # web UI at http://localhost:8000
oblako configure writes a profile whose per-service endpoints are oblako’s. With
it selected, boto3 and the AWS CLI reach the local services; select another
profile and the same code talks to AWS.
Your AWS code just works
Each service is reached through its normal boto3 client. With the oblako
profile selected (or in oblako notebook, which sets the endpoints itself),
unmodified boto3 transparently hits the local service, no endpoint_url:
import boto3
s3 = boto3.client("s3") # -> S3Proxy
s3.create_bucket(Bucket="demo")
ddb = boto3.client("dynamodb") # -> DynamoDB Local
ddb.list_tables()
Or go through the service handles, which also expose native drivers:
from oblako.services import Oblako
o = Oblako()
o.redshift.get_client() # boto3.client("redshift") -> moto control plane
o.redshift.connect() # psycopg2 / redshift-connector -> the real engine
Start a single service
oblako up redshift # just Redshift
oblako logs opensearch # tail a service's logs
oblako down stepfunctions # stop one service
Service names: bedrock, opensearch, redshift, rds, moto, s3,
dynamodb, kinesis, stepfunctions, iceberg (the Iceberg REST catalog) and
trino (Athena’s engine; it also starts the Glue engine). ollama aliases
bedrock; aurora aliases rds (it also starts the RDS API on :8014, which
runs a PostgreSQL container per DB instance), redshift starts the Redshift API on
:8015, which runs multi-node clusters, and dynamodb starts the proxy on :8007
that adds vector search and tags. A bare oblako up starts all of these
except iceberg and trino.
The API engines that oblako runs in Python rather than in a container start the
same way, each on its canonical port, so plain boto3 or the AWS CLI can reach
them without any oblako code in the client: s3vectors, s3tables, athena,
firehose, eventbridge, appconfig, sagemaker, glue,
dynamodb-vectors, redshift-data, redshift-control, rds-data, rds-control,
mwaa, ecs, bedrock-runtime, cloudformation, ecs-metadata, s3-ext
(oblako up s3 starts s3-ext itself).
oblako up s3vectors # S3 Vectors on :8012, in the background
oblako logs s3vectors # its log (~/.oblako/logs/s3vectors.log)
oblako down s3vectors
(Code that uses oblako’s Python API starts these engines on demand.)
When a port is taken
Every service has a fixed port (oblako/ports.py), so code and profiles can rely on
it. If another program already holds one, a local PostgreSQL on 5432 for example,
oblako up stops with an error that names the port. Stop the other program, or
move oblako’s service with OBLAKO_PORT_<NAME>, where <NAME> is the port’s name
in oblako/ports.py:
export OBLAKO_PORT_RDS_PG=5433 # in your shell profile, so every oblako command sees it
oblako up rds
oblako configure # rewrites the profile's endpoints with the new port
Every oblako process reads the variable, so the service, the engines and the profile agree. An unknown name or a value that is not a port fails at once.
Network exposure
oblako listens on your machine only. Its services use fixed local credentials, so
their containers publish their ports on 127.0.0.1, and oblako dashboard and
oblako notebook, which have no login and can run code against your services,
listen there too. Containers still reach each other through the host
(host.docker.internal): Docker Desktop routes that to the host’s loopback, and on
other engines (native Linux Docker, Colima, Podman) the ports also listen on the
docker bridge’s gateway, an address internal to the machine.
To share oblako with other machines on purpose, such as a server your team uses,
set OBLAKO_BIND_ADDRESS (one address, or a comma-separated list) before oblako up, and keep that network trusted:
export OBLAKO_BIND_ADDRESS=0.0.0.0
Containers keep the addresses they were created with; oblako down and oblako up
recreate them.
If an Ollama already runs on port 11434, installed on your machine say, oblako up
uses it instead of starting its own container, and oblako down leaves it alone.
CLI reference
Command |
Description |
|---|---|
|
Start all services, or one (a container service like |
|
Stop all services (or a specific one) |
|
Show service status |
|
Write an AWS profile (default |
|
Start the web dashboard (default: 8000), on |
|
Launch JupyterLab wired to oblako (default: 8888), with its workspace in |
|
Start the Redshift Data API server (default: 8002) |
|
Start the Bedrock Runtime server (default: 8004) |
|
Start the RDS Data API server (default: 8006) |
|
Start the CloudFormation server (default: 8017) |
|
Run a local AgentCore agent (default: 8080) |
|
Send a JSON payload to a running AgentCore agent |
|
Trust the local Redshift’s TLS certificate in a venv’s |
|
Show the last |
|
Pull a model into the engine (default: |
|
List available Ollama models |
|
Run unit tests |
|
Run integration tests (requires services running) |
Environment variables
Variable |
Default |
Description |
|---|---|---|
|
|
Container runtime: |
|
|
Namespace for the Kubernetes backend |
|
|
Address, or comma-separated addresses, the services’ ports listen on |
|
see |
Move one service off its default port |
|
|
Region oblako reports in ARNs and endpoints |
|
|
Account ID oblako reports in ARNs |
|
|
Bedrock runtime backend: |
|
|
Ollama server the Bedrock runtime uses |
|
|
Workspace for |