Skip to content
cloudemu
Services

Compute

Run, stop, and terminate VMs on EC2, Azure Virtual Machines, and Compute Engine, driven with the real cloud SDKs

aws EC2azr Virtual Machinesgcp Compute Engine

Emulates managed virtual machines — the EC2 instance, Azure VM, or Compute Engine instance you'd launch to run a workload. You run instances from an image, then start, stop, reboot, and terminate them; the full VPC networking stack (subnets, security groups, gateways, volumes) is available alongside so instances have somewhere to live.

Reach for it in tests when your code provisions capacity, waits on instance state, or reacts to lifecycle events — so you can exercise those paths without paying for real VMs or waiting on real boot times. Under the hood each instance is a state machine that walks the same pending → running → stopped → terminated transitions the real services enforce.

ProviderServiceSDK-compatDriver
AWSEC2 + full VPC stack✓ Liveaws.EC2
AzureVirtual Machines + Disks/Snapshots/Images/SSH Keys✓ Liveazure.VirtualMachines
GCPCompute Engine + Disks/Snapshots/Images✓ Livegcp.GCE

Run and manage instances#

The recommended path points the real SDK at the SDK-compat server, so the same client code you ship in production talks to the emulator. RunInstances launches capacity from an AMI; StopInstances moves them out of running without terminating, mirroring how EC2 lets you pause billing while keeping the instance:

import (
    "github.com/aws/aws-sdk-go-v2/service/ec2"
    "github.com/aws/aws-sdk-go-v2/service/ec2/types"
    "github.com/stackshy/cloudemu/v2"
    awsserver "github.com/stackshy/cloudemu/v2/server/aws"
)

cloud := cloudemu.NewAWS()
ts := httptest.NewServer(awsserver.New(awsserver.Drivers{
    EC2: cloud.EC2, VPC: cloud.VPC,
}))

client := ec2.NewFromConfig(cfg, func(o *ec2.Options) {
    o.BaseEndpoint = aws.String(ts.URL)
})

out, _ := client.RunInstances(ctx, &ec2.RunInstancesInput{
    ImageId:      aws.String("ami-0abcdef1234"),
    InstanceType: types.InstanceTypeT3Large,
    MinCount:     aws.Int32(1),
    MaxCount:     aws.Int32(3),
})

client.StopInstances(ctx, &ec2.StopInstancesInput{
    InstanceIds: []string{*out.Instances[0].InstanceId},
})

The same pattern works with armcompute for Azure and cloud.google.com/go/compute/apiv1 for GCP — only the endpoint changes. See the SDK-Compat Server.

Portable Go API#

Use the Portable API when you want direct in-process calls without the HTTP hop — handy for setting up fixtures fast. RunInstances takes a count as its last argument and returns the created instances; stop and terminate take instance IDs:

import computedriver "github.com/stackshy/cloudemu/v2/services/compute/driver"

instances, _ := aws.EC2.RunInstances(ctx, computedriver.InstanceConfig{
    ImageID: "ami-0abcdef1234", InstanceType: "t3.large",
}, 3)
aws.EC2.StopInstances(ctx, []string{instances[0].ID})
aws.EC2.TerminateInstances(ctx, []string{instances[0].ID})

Behavior & fidelity#

BehaviorWhat happens
Valid state transitionsInstances walk pending → running → stopped → terminated. Illegal transitions error, so stopping a terminated instance fails just like real EC2.
Automatic lifecycle metricsRunInstances and every start/stop/reboot/terminate push CPU, network, and disk metrics to the monitoring service — assert on metric-driven alarms end-to-end.
Full VPC stackSubnets, security groups, gateways, route tables, volumes, snapshots, AMIs, launch templates, and auto-scaling groups all live on aws.EC2 / aws.VPC. See Networking.
Managed-resource visibilityEC2 models the managed instances an AWS service (ECS, EKS Auto Mode) provisions. SetManagedResourceVisibility("hidden") drops them from DescribeInstances unless you pass IncludeManagedResources=true — how an ECS container instance surfaces as a real EC2 instance (Container Orchestration).

SDK-compat — Live#

Real ec2, armcompute, and compute/apiv1 clients drive the emulator end-to-end:

ProviderCoverage
AWS EC2Instance lifecycle, filtered describe, attribute modify, and the full VPC stack
Azure VMsVirtual machines, power actions, disks, snapshots, images, SSH keys
GCP Compute EngineInstances, disks, snapshots, and images with LRO envelopes

See SDK-Compat for the full per-operation list.

On this page

On this page