Skip to content

Launch kit

Copy-paste commands and one CloudFormation template to launch any Software Sushi image privately and open a shell on it. You get an instance with no inbound ports, an encrypted root volume, IMDSv2 and a Session Manager role.

You need: an AWS account, the AWS CLI v2 and the Session Manager plugin on your computer, and permission to launch EC2 instances and create IAM roles.

Subscribe first

Open the product on AWS Marketplace, choose View purchase options and subscribe. The launch is refused until the subscription is active.

Pick your product in the table and note its Product ID, the instance type and the root volume size. The examples use LiteLLM Proxy (prod-naquy5izxj4lw).

1. Create the Session Manager role (once per account)

Session Manager needs an instance profile with the AWS managed policy AmazonSSMManagedInstanceCore. Skip this step if you already have one.

aws iam create-role --role-name SushiSsmInstanceRole \
  --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
aws iam attach-role-policy --role-name SushiSsmInstanceRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
aws iam create-instance-profile --instance-profile-name SushiSsmInstanceProfile
aws iam add-role-to-instance-profile \
  --instance-profile-name SushiSsmInstanceProfile --role-name SushiSsmInstanceRole

2. Create a security group with no inbound rules

Pick a VPC and a subnet that can reach the internet over HTTPS (or that has Systems Manager VPC endpoints). A new security group has no inbound rules.

VPC=<vpc-id>
SUBNET=<subnet-id>
SG=$(aws ec2 create-security-group --group-name sushi-no-inbound \
  --description "Software Sushi AMI, no inbound" --vpc-id $VPC \
  --query GroupId --output text)

3. Launch

PRODUCT=prod-naquy5izxj4lw      # Product ID from the table
AMI=$(aws ssm get-parameter --name /aws/service/marketplace/$PRODUCT/latest \
  --query Parameter.Value --output text)

aws ec2 run-instances --image-id $AMI --instance-type t3.medium \
  --subnet-id $SUBNET --security-group-ids $SG \
  --iam-instance-profile Name=SushiSsmInstanceProfile \
  --metadata-options HttpTokens=required,HttpEndpoint=enabled \
  --block-device-mappings 'DeviceName=/dev/sda1,Ebs={VolumeSize=20,VolumeType=gp3,Encrypted=true,DeleteOnTermination=true}' \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=sushi-litellm}]' \
  --query 'Instances[0].InstanceId' --output text

Use the instance type and root volume size from the table. The /aws/service/marketplace/<product-id>/latest parameter always points at the newest version of the product.

4. Connect

First boot takes about two minutes. Wait for the instance to appear in Systems Manager, then open a shell and run the walkthrough:

INSTANCE=<instance-id>
aws ssm describe-instance-information \
  --filters Key=InstanceIds,Values=$INSTANCE \
  --query 'InstanceInformationList[0].PingStatus' --output text   # Online

aws ssm start-session --target $INSTANCE

In the session:

sudo -iu ubuntu
cloud-init status --wait
bash /opt/sushi/docs/demo.sh

The walkthrough ends with a line that finishes in DEMO_PASSED (for example SUSHI_CUSTOMER_DEMO_PASSED). Each product's Getting started page says what to do next, and where the generated passwords and keys are (always root-only, read with sudo cat).

5. Reach a web page or API from your computer

Every Software Sushi service listens on the instance itself. Forward its port through Session Manager, then use localhost on your computer. The port for each product is in the table.

aws ssm start-session --target $INSTANCE \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["4000"],"localPortNumber":["4000"]}'

Leave that command running. Session Manager forwards TCP only.

6. Reach it from another host in your VPC

By default no other machine can connect, which is the safe state. To serve your applications, open the product's Configuration page (linked in the table) and follow its network section. The pattern is the same everywhere:

  1. Change the service's listen address from 127.0.0.1 to the instance's private address.
  2. In the instance's security group, allow the service's port only from your application's security group or CIDR range.
  3. If the service uses TLS, give your clients the instance's CA file, and add the private address to the server certificate where the page says so.

Do not listen on 0.0.0.0 behind a security group that allows 0.0.0.0/0.

7. Clean up

Billing runs while the instance runs. When you are done:

aws ec2 terminate-instances --instance-ids $INSTANCE

Delete the security group once the instance is gone. Keep the Session Manager role for your next launch.

Or: one CloudFormation stack

The template creates the instance role, a no-inbound security group and the instance. It takes the product's Marketplace alias, for example /aws/service/marketplace/prod-naquy5izxj4lw/latest.

Download launch-kit.yaml

aws cloudformation create-stack --stack-name sushi-litellm \
  --template-body file://launch-kit.yaml --capabilities CAPABILITY_IAM \
  --parameters \
    ParameterKey=ImageParameter,ParameterValue=/aws/service/marketplace/prod-naquy5izxj4lw/latest \
    ParameterKey=InstanceType,ParameterValue=t3.medium \
    ParameterKey=VolumeSize,ParameterValue=20 \
    ParameterKey=VpcId,ParameterValue=<vpc-id> \
    ParameterKey=SubnetId,ParameterValue=<subnet-id>

When the stack is created, the Connect output holds the aws ssm start-session command. Delete the stack to remove everything:

aws cloudformation delete-stack --stack-name sushi-litellm
AWSTemplateFormatVersion: "2010-09-09"
Description: >-
  Software Sushi launch kit. Launches one Software Sushi AMI from AWS Marketplace
  with no inbound ports, an encrypted gp3 root volume, IMDSv2 and a Session
  Manager instance role. Connect with AWS Systems Manager Session Manager.

Parameters:
  ImageParameter:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Description: >-
      Marketplace AMI alias of the product, for example
      /aws/service/marketplace/prod-naquy5izxj4lw/latest (see the table in the
      launch kit for each product). You must be subscribed to the product.
  InstanceType:
    Type: String
    Default: t3.medium
    Description: Use the instance type in the product table (t3.medium for most, t3.large for Langfuse).
  VolumeSize:
    Type: Number
    Default: 40
    MinValue: 16
    MaxValue: 500
    Description: Root volume in GiB. 40 covers every Software Sushi AI image; 16 is enough for the utility images.
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC for the instance's security group.
  SubnetId:
    Type: AWS::EC2::Subnet::Id
    Description: >-
      Subnet in that VPC with outbound internet access (a public subnet that
      assigns public IPs, or a private subnet behind a NAT gateway), or one
      that reaches Systems Manager through VPC endpoints.
  InstanceName:
    Type: String
    Default: sushi-ami
    Description: Name tag for the instance.

Resources:
  InstanceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
  InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref InstanceRole
  NoInboundSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Software Sushi AMI. No inbound rules. Session Manager uses outbound HTTPS.
      VpcId: !Ref VpcId
  Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageParameter
      InstanceType: !Ref InstanceType
      SubnetId: !Ref SubnetId
      SecurityGroupIds:
        - !GetAtt NoInboundSecurityGroup.GroupId
      IamInstanceProfile: !Ref InstanceProfile
      MetadataOptions:
        HttpTokens: required
        HttpEndpoint: enabled
      BlockDeviceMappings:
        - DeviceName: /dev/sda1
          Ebs:
            VolumeSize: !Ref VolumeSize
            VolumeType: gp3
            Encrypted: true
            DeleteOnTermination: true
      Tags:
        - Key: Name
          Value: !Ref InstanceName

Outputs:
  InstanceId:
    Value: !Ref Instance
  Connect:
    Description: Open a shell (needs the AWS CLI and the Session Manager plugin).
    Value: !Sub aws ssm start-session --target ${Instance}
  Walkthrough:
    Description: Run inside the session, after first boot finishes.
    Value: sudo -iu ubuntu bash /opt/sushi/docs/demo.sh

Products

Product Product ID Instance Root volume Port to forward Guide
Aider prod-3gscn7xn3kurm t3.medium 16 GiB - Guide
Ansible Core Runner prod-coyzhqh3mc3um t3.medium 16 GiB - Guide
AnythingLLM prod-6em7p7rlvqhvk t3.medium 40 GiB 3001 Guide
Caddy HTTPS Gateway prod-k7wnowoerhb6w t3.medium 16 GiB 8443 Guide
DuckDB Analytics prod-eybqioxqollgg t3.medium 16 GiB - Guide
Flowise prod-b55c3ccypgcre t3.medium 32 GiB 8443 Guide
Fluent Bit Log Gateway prod-n3uh5pwfowbiq t3.medium 16 GiB 9880 Guide
Gatus Status Page prod-zgklmgktx3dmc t3.medium 16 GiB 8443 Guide
Goose prod-atikolmk7akdy t3.medium 16 GiB - Guide
Gotify Notification Server prod-k6xdvap23xuhy t3.medium 16 GiB 8443 Guide
HAProxy Community LTS prod-eirb7efewifvu t3.medium 16 GiB 8404 (stats) Guide
Langfuse prod-hfptd3emjkmh6 t3.large 40 GiB 3000 Guide
LiteLLM Proxy prod-naquy5izxj4lw t3.medium 20 GiB 4000 Guide
Mosquitto MQTT Broker prod-y6f3naqckzklg t3.medium 16 GiB 8883 Guide
NATS Core Broker prod-4v7pt6qtnjzqq t3.medium 16 GiB 4222 Guide
Open Interpreter prod-oxcssxf4pp3xu t3.medium 16 GiB - Guide
Open WebUI prod-3asfh7prlv5cy t3.medium 24 GiB 8080 Guide
OpenSSH SFTP Drop Box prod-3oatqxc743yrq t3.medium 16 GiB 2222 Guide
OpenTelemetry Collector Gateway prod-elvlzfwe6jobi t3.medium 16 GiB 4318 Guide
OpenTofu Runner prod-kb2bvjgxzijgo t3.medium 16 GiB - Guide
PgBouncer Connection Pooler prod-i5hgiqs742fgk t3.medium 16 GiB 6432 Guide
Qdrant prod-bbmooy4pynjry t3.medium 16 GiB 6333 Guide
Rclone Transfer Worker prod-f2gsp3anrssi2 t3.medium 16 GiB - Guide
Restic Backup Worker prod-yrn3o5izd4lfo t3.medium 16 GiB - Guide
Tabby prod-nvw4q4ks3cv7g t3.medium 16 GiB 8080 Guide
Unbound DNS Resolver prod-5jjbhqrwnkody t3.medium 16 GiB - (UDP and TCP 53) Guide
Uptime Kuma Monitoring prod-vk2mgnn5mheq6 t3.medium 16 GiB 8443 Guide
Valkey Single-Node Cache prod-mml6muhwfxmki t3.medium 16 GiB 6379 Guide
Vector Log Pipeline prod-5gso6rlr7bsmc t3.medium 16 GiB 8687 Guide
WireGuard Private Access prod-l7q7qsf7xmru4 t3.medium 16 GiB - (UDP 51820) Guide

A dash means the product is a command-line tool or a background service with nothing to open in a browser. UDP services (WireGuard, Unbound) cannot be forwarded; use their guide.