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:
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:
- Change the service's listen address from
127.0.0.1to the instance's private address. - In the instance's security group, allow the service's port only from your application's security group or CIDR range.
- 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:
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.
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:
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.