Isaac Sim 6 on a bare EC2 instance

The marketplace workstation AMI pins you to Isaac Sim 5.1.0 on Ubuntu 24.04. Standing up a custom g6e.4xlarge — GRID driver, Docker, NVIDIA Container Toolkit — to run 6.0.0-dev2 with WebRTC streaming instead.

2026-05-26

Motivation

To address limitations with the preconfigured NVIDIA Isaac Sim Development Workstation (Linux) AMI available on AWS Marketplace. Namely, the AMI is configured strictly for Isaac Sim 5.1.0 on Ubuntu 24.04. This is not ideal for applications that want to leverage:

  • Cesium for Omniverse — quickstart and documentation are written for Isaac Sim 6.0.0. Experiencing tile rendering and sim crashing issues on 5.1.0, see issue.
  • Replicator RTSPWriter — a missing RGBA-to-yuv420p conversion in the spawned FFmpeg causes grey RTSP output, see issue and my writeup. 6.0 uses a different architecture for this pipeline.
  • ROS 2 Humble / rosbridge HIL — our ROS stack is based on Humble, which targets Ubuntu 22.04 rather than Ubuntu 24.04.

Below sets up a custom AWS EC2 instance for testing Isaac Sim 6.0.0-dev2 on Ubuntu 22.04 with NVIDIA L40S GPU support, Docker-based deployment, and WebRTC streaming. The working image used here is:

nvcr.io/nvidia/isaac-sim:6.0.0-dev2

The current setup is suitable as a testbed for Isaac Sim 6 / Kit 109 behavior, Cesium compatibility testing, and RTSPWriter debugging. Docker runs inside the EC2 instance. It uses the EC2 instance’s local CPU, RAM, disk, and attached L40S GPU via NVIDIA Container Toolkit. It is not using local workstation compute.

EC2 instance configuration

Used configuration:

Region:         us-west-2 / Oregon
Instance type:  g6e.4xlarge
GPU:            NVIDIA L40S, 48 GB VRAM
OS:             Ubuntu Server 22.04 LTS, x86_64 / amd64
Root volume:    300–500 GiB gp3 recommended
SSH user:       ubuntu

Selected Ubuntu AMI:

AMI name: ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20260521
AMI ID:   ami-0ababc7e5826abb79
Owner:    099720109477  # Canonical

Security group

Restrict all inbound rules to the local client IP, not 0.0.0.0/0.

Required:

22/tcp      SSH
49100/tcp   Isaac Sim WebRTC signaling
47998/udp   Isaac Sim WebRTC media stream

Optional:

8210/tcp    Browser-based web viewer
8443/tcp    NICE DCV remote desktop

NVIDIA livestream endpoints do not provide authentication/encryption by themselves, so do not expose them publicly.

Host setup

1. Update Ubuntu

sudo apt update
sudo apt upgrade -y
sudo reboot

2. Install NVIDIA GRID / RTX Enterprise driver

Largely follow the AWS documentation.

Install prerequisites:

sudo apt update
sudo apt install -y \
  gcc make build-essential \
  linux-headers-$(uname -r) \
  linux-modules-extra-$(uname -r) \
  awscli \
  pkg-config \
  libglvnd-dev

Update AWS kernel and reboot:

sudo apt-get upgrade -y linux-aws
sudo reboot

Disable nouveau:

cat <<'NOUVEAU' | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
NOUVEAU

sudo update-grub
sudo reboot

Download and install the GRID driver:

mkdir -p ~/nvidia-grid
cd ~/nvidia-grid
aws s3 cp --recursive s3://ec2-linux-nvidia-drivers/latest/ .
chmod +x NVIDIA-Linux-x86_64*.run
sudo /bin/sh ./NVIDIA-Linux-x86_64*.run
sudo reboot

Validate:

nvidia-smi

Expected: NVIDIA L40S visible.

Docker setup

1. Install Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world
sudo systemctl enable docker
sudo systemctl start docker

2. Install NVIDIA Container Toolkit

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Validate GPU passthrough:

docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

Expected: NVIDIA L40S visible inside Docker.

Isaac Sim container image

Pull image:

export ISAAC_IMAGE=nvcr.io/nvidia/isaac-sim:6.0.0-dev2
docker pull $ISAAC_IMAGE

Persistent folders

Host folders are mounted into the container so logs, cache, configs, and work files persist across container restarts.

mkdir -p ~/docker/isaac-sim/cache/main/ov
mkdir -p ~/docker/isaac-sim/cache/main/warp
mkdir -p ~/docker/isaac-sim/cache/computecache
mkdir -p ~/docker/isaac-sim/config
mkdir -p ~/docker/isaac-sim/data/documents
mkdir -p ~/docker/isaac-sim/data/Kit
mkdir -p ~/docker/isaac-sim/logs
mkdir -p ~/docker/isaac-sim/pkg
mkdir -p ~/isaac-projects

sudo chown -R 1234:1234 ~/docker/isaac-sim ~/isaac-projects

Container user is UID/GID 1234:1234, so ownership matters.

Reusable host script: start Isaac container

Create the script without using nano:

mkdir -p ~/bin
cat > ~/bin/start-isaac-container.sh <<'HOSTSCRIPT'
#!/usr/bin/env bash
set -euo pipefail

export ISAAC_IMAGE="nvcr.io/nvidia/isaac-sim:6.0.0-dev2"

mkdir -p ~/docker/isaac-sim/cache/main/ov
mkdir -p ~/docker/isaac-sim/cache/main/warp
mkdir -p ~/docker/isaac-sim/cache/computecache
mkdir -p ~/docker/isaac-sim/config
mkdir -p ~/docker/isaac-sim/data/documents
mkdir -p ~/docker/isaac-sim/data/Kit
mkdir -p ~/docker/isaac-sim/logs
mkdir -p ~/docker/isaac-sim/pkg
mkdir -p ~/isaac-projects

sudo chown -R 1234:1234 ~/docker/isaac-sim ~/isaac-projects

docker run --name isaac-sim \
  --entrypoint bash \
  -it \
  --gpus all \
  -e ACCEPT_EULA=Y \
  -e PRIVACY_CONSENT=Y \
  --rm \
  --network=host \
  -v ~/docker/isaac-sim/cache/main:/isaac-sim/.cache:rw \
  -v ~/docker/isaac-sim/cache/computecache:/isaac-sim/.nv/ComputeCache:rw \
  -v ~/docker/isaac-sim/logs:/isaac-sim/.nvidia-omniverse/logs:rw \
  -v ~/docker/isaac-sim/config:/isaac-sim/.nvidia-omniverse/config:rw \
  -v ~/docker/isaac-sim/data:/isaac-sim/.local/share/ov/data:rw \
  -v ~/docker/isaac-sim/pkg:/isaac-sim/.local/share/ov/pkg:rw \
  -v ~/isaac-projects:/workspace:rw \
  -u 1234:1234 \
  "$ISAAC_IMAGE"
HOSTSCRIPT

chmod +x ~/bin/start-isaac-container.sh

Start container:

~/bin/start-isaac-container.sh

Reusable container script: start WebRTC Isaac Sim

Inside the Isaac container, create:

cat > /workspace/run-webrtc.sh <<'WEBRTCSCRIPT'
#!/usr/bin/env bash
set -euo pipefail

PUBLIC_IP=$(curl -4 -s ifconfig.me)

echo "Using public IP: ${PUBLIC_IP}"

cd /isaac-sim

./runheadless.sh -v \
  --/exts/omni.kit.livestream.app/primaryStream/publicIp="${PUBLIC_IP}" \
  --/exts/omni.kit.livestream.app/primaryStream/signalPort=49100 \
  --/exts/omni.kit.livestream.app/primaryStream/streamPort=47998
WEBRTCSCRIPT

chmod +x /workspace/run-webrtc.sh

Run Isaac Sim:

/workspace/run-webrtc.sh

Use the numeric public IPv4 address / Elastic IP, not public DNS, for WebRTC.

Current verified status

The system successfully reached:

Isaac Sim Full Streaming App is loaded.
app ready
Client connected to WebRTC server

The Isaac Sim WebRTC client connected successfully and displayed the Isaac Sim UI.

Other writing