All features

Real engines, not mocks

Your function runs. Your database answers queries. Your cluster schedules pods. pogi starts the real engines, and tells you when it can't.

localhost:7644/_pogi/

The problem

A mock that only stores resources can't run your function, answer a SQL query or start a pod. So a test can pass on your machine and still fail in the cloud.

How it works

  1. 01

    Lambda runs your code

    Create a function and call it. pogi runs Python and Node.js on your machine when they are installed, and in Docker when they are not. The answer comes back as it would from AWS.

    localhost:7644/_pogi/
    The console's Lambda page: a function named hello, runtime python3.12, handler app.handler, 128 MB.
    localhost:7644/_pogi/

    Lambda

    Functions

    The Lambda page: a function named hello, runtime python3.12, handler app.handler, 128 MB.
  2. 02

    Databases are real servers

    RDS and Cloud SQL start a real PostgreSQL or MySQL server in a Docker container. Connect with any client, at the address pogi shows.

    localhost:7644/_pogi/
    The console's RDS page: a DB instance named demo, engine postgres 17.4, status available, endpoint localhost:54469.
    localhost:7644/_pogi/

    RDS

    DB instances

    The RDS page: a DB instance named demo, engine postgres 17.4, status available, endpoint localhost:54469.
  3. 03

    Clusters and containers are real too

    EKS, GKE and AKS start a real Kubernetes cluster in Docker, and kubectl talks to it. ECS and Cloud Run run your container images.

    localhost:7644/_pogi/
    The console's EKS page: a cluster named demo, status ACTIVE, version 1.35, endpoint https://127.0.0.1:54491.
    localhost:7644/_pogi/

    EKS

    Clusters

    The EKS page: a cluster named demo, status ACTIVE, version 1.35.
  4. 04

    No Docker? pogi says so

    Without Docker, pogi still stores your databases, clusters and tasks, so your Terraform and SDK calls work. The console says that no database is running behind the instance.

    localhost:7644/_pogi/
    The console's RDS page with Docker off: the instance db1 shows the status available, no database: Docker isn't running.
    localhost:7644/_pogi/

    RDS

    DB instances

    The RDS page with Docker off: the instance db1 shows the status available, no database: Docker isn't running.

Try it

This is real output from a running pogi.

Run a function

# app.py
def handler(event, context):
    return {"hello": event.get("name", "world")}

aws lambda create-function --function-name hello --runtime python3.12 \
  --handler app.handler --role arn:aws:iam::000000000000:role/lambda \
  --zip-file fileb://fn.zip --query '[FunctionName,State]' --output text
hello	Active

aws lambda invoke --function-name hello --payload '{"name":"pogi"}' \
  --cli-binary-format raw-in-base64-out out.json
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
cat out.json
{"hello": "pogi"}

Start a PostgreSQL server

aws rds create-db-instance --db-instance-identifier demo --engine postgres \
  --db-instance-class db.t3.micro --allocated-storage 20 \
  --master-username pogi --master-user-password secret123 \
  --query DBInstance.DBInstanceStatus --output text
creating

aws rds wait db-instance-available --db-instance-identifier demo
aws rds describe-db-instances --db-instance-identifier demo \
  --query 'DBInstances[0].[DBInstanceStatus,Endpoint.Address,Endpoint.Port]' --output text
available	localhost	54469

docker exec -e PGPASSWORD=secret123 pogi-rds-demo \
  psql -U pogi -h 127.0.0.1 -d postgres -c 'select 1 as one'
 one
-----
   1
(1 row)

Start a Kubernetes cluster

aws eks create-cluster --name demo \
  --role-arn arn:aws:iam::000000000000:role/eks \
  --resources-vpc-config subnetIds=$S1,$S2 \
  --query cluster.status --output text
CREATING

aws eks wait cluster-active --name demo
aws eks update-kubeconfig --name demo --kubeconfig eks.kubeconfig
kubectl --kubeconfig eks.kubeconfig get nodes
NAME           STATUS   ROLES           AGE   VERSION
1938f714c510   Ready    control-plane   28s   v1.35.5+k3s1

What to know

  • Docker is optional. Without it, RDS, ECS, EKS, ElastiCache and the like still create and describe, as metadata. Lambda runs Python and Node.js natively when they are installed.
  • RDS and ElastiCache: snapshot restore, read replicas, and engine parameters are not supported.
  • A node group (EKS), node pool (GKE) or agent pool (AKS) is stored but adds no nodes. Each cluster has one node, and it runs one Kubernetes version, whatever version you ask for.
  • ECS: CPU shares, task sets, ECS Exec, and EFS and FSx volumes are not supported.