Skip to the content.

AWS CLI Autoscaling Cheatsheet

Userdata:

$ cat userdata.txt
#!/bin/bash
CLUSTER_NAME="aws-qa-ecs"
ENVIRONMENT_NAME="qa"
MY_HOSTNAME="$(curl -s http://169.254.169.254/latest/meta-data/local-hostname)"
INSTANCE_ID="$(curl -s http://instance-data/latest/meta-data/instance-id)"
INSTANCE_LIFECYCLE="$(curl -s http://169.254.169.254/latest/meta-data/instance-life-cycle)"
REGION="$(curl -s http://instance-data/latest/meta-data/placement/availability-zone | rev | cut -c 2- | rev)"

echo "ECS_CLUSTER=${CLUSTER_NAME}" >> /etc/ecs/ecs.config
echo "ECS_AVAILABLE_LOGGING_DRIVERS=[\"json-file\",\"awslogs\"]" >> /etc/ecs/ecs.config
echo "ECS_INSTANCE_ATTRIBUTES={\"environment\":\"${ENVIRONMENT_NAME}\"}" >> /etc/ecs/ecs.config

I am multiplying the current spot price with 2 to set my maximum bid price, so alter according to your needs:

#!/usr/bin/env bash

launch_config_name="ecs-dev-cap-spot-lc.v1"
instance_type="t2.medium"
ssh_key_name="infra"
userdata="userdata.txt"
security_group="sg-00000000000000000"
instance_profile="ecs-instance-role"

ecs_ami_id="$(aws --profile dev ssm get-parameter --name '/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id' | jq -r '.Parameter.Value')"
spot_price=$(aws --profile dev ec2 describe-spot-price-history --instance-types ${instance_type} --product-descriptions "Linux/UNIX" --max-items 1 | jq -r '.SpotPriceHistory[].SpotPrice')

get_bid_price(){
    spot_price=$(aws --profile dev ec2 describe-spot-price-history --instance-types ${instance_type} --product-descriptions "Linux/UNIX" --max-items 1 | jq -r '.SpotPriceHistory[].SpotPrice')
    echo ${spot_price} 2 | awk '{printf "%4.3f\n",$1*$2}'
}

aws --profile dev autoscaling create-launch-configuration \
  --launch-configuration-name ${launch_config_name} \
  --image-id ${ecs_ami_id} \
  --instance-type ${instance_type} \
  --key-name ${ssh_key_name} \
  --user-data file://${userdata} \
  --security-groups ${security_group} \
  --instance-monitoring Enabled=true \
  --iam-instance-profile ${instance_profile} \
  --spot-price "$(get_bid_price)"

Create the Auto Scaling Group:

asg_name="ecs-dev-cap-spot"
subnets="subnet-00000000000000000,subnet-11111111111111111,subnet-22222222222222222"

aws --profile dev autoscaling create-auto-scaling-group \
  --auto-scaling-group-name ${asg_name} \
  --launch-configuration-name ${launch_config_name} \
  --min-size 0 \
  --max-size 3 \
  --vpc-zone-identifier "${subnets}"