Files
spinifex/scripts/start-then-terminate-pending.sh
T
2026-05-05 09:32:29 +10:00

58 lines
2.1 KiB
Bash
Executable File

#!/bin/sh
# Launch instance then terminate it while still in `pending` state.
set -e
export AWS_PROFILE=spinifex
ARCH=$(uname -m)
case "$ARCH" in
x86_64) IMAGE_NAME="ami-ubuntu-26.04-x86_64" ;;
aarch64|arm64) IMAGE_NAME="ami-ubuntu-26.04-arm64" ;;
*) echo "Unknown arch $ARCH, default x86_64"; IMAGE_NAME="ami-ubuntu-26.04-x86_64" ;;
esac
INSTANCE_TYPE=$(aws ec2 describe-instance-types \
--query "InstanceTypes[?contains(InstanceType, '.micro')].InstanceType | [0]" \
--output text)
[ -z "$INSTANCE_TYPE" ] || [ "$INSTANCE_TYPE" = "None" ] && { echo "no micro type"; exit 1; }
AMI=$(aws ec2 describe-images --query "Images[?Name=='$IMAGE_NAME'].ImageId" --output text)
[ -z "$AMI" ] && { echo "no AMI $IMAGE_NAME"; exit 1; }
SUBNET=$(aws ec2 describe-subnets --query 'Subnets[0].SubnetId' --output text)
SG=$(aws ec2 describe-security-groups --query 'SecurityGroups[0].GroupId' --output text)
[ -z "$SUBNET" ] || [ "$SUBNET" = "None" ] && { echo "no subnet"; exit 1; }
[ -z "$SG" ] || [ "$SG" = "None" ] && { echo "no SG"; exit 1; }
echo "Launch: ami=$AMI type=$INSTANCE_TYPE subnet=$SUBNET sg=$SG"
INSTANCE_ID=$(aws ec2 run-instances \
--image-id "$AMI" \
--instance-type "$INSTANCE_TYPE" \
--key-name spinifex-key \
--security-group-ids "$SG" \
--subnet-id "$SUBNET" \
--count 1 \
--query 'Instances[0].InstanceId' \
--output text)
echo "Launched: $INSTANCE_ID — waiting for QEMU"
# Wait until QEMU process exists (LaunchInstance.StartInstance fired) but
# BEFORE TransitionState moves to running. Poll tight; terminate on first hit.
TIMEOUT=60
DEADLINE=$(( $(date +%s) + TIMEOUT ))
QEMU_PID=""
while [ "$(date +%s)" -lt "$DEADLINE" ]; do
QEMU_PID=$(pgrep -f "qemu.*$INSTANCE_ID" | head -1 || true)
[ -n "$QEMU_PID" ] && break
done
[ -z "$QEMU_PID" ] && { echo "ERR: QEMU never appeared"; exit 1; }
echo "QEMU pid=$QEMU_PID — terminate now"
aws ec2 terminate-instances --instance-ids "$INSTANCE_ID" \
--query 'TerminatingInstances[0].[InstanceId,PreviousState.Name,CurrentState.Name]' \
--output text