with an SMS text warning two minutes before interruption, using
CloudWatch Events Rules And SNS
The EC2 Spot instance marketplace has had a number of
enhancements in the last couple months that have made
it more attractive for more use cases. Improvements include:
-
You can run an instance like you normally do for on-demand instances
and add one option to make it a Spot instance! The instance starts
up immediately if your bid price is sufficient given spot market
conditions, and will generally cost much less than on-demand.
-
Spot price volatility has been significantly reduced. Spot prices
are now based on long-term trends in supply and demand instead of
hour-to-hour bidding wars. This means that instances are much less
likely to be interrupted because of short-term spikes in Spot
prices, leading to much longer running instances on average.
-
You no longer have to specify a bid price. The Spot Request will
default to the instance type’s on-demand price in that region. This
saves looking up pricing information and is a reasonable default
if you are using Spot to save money over on-demand.
-
CloudWatch Events can now send a two-minute
warning before a Spot instance is interrupted,
through email, text, AWS Lambda, and more.
Putting these all together makes it easy to take instances you
formerly ran on-demand and add an option to turn them into new Spot
instances. They are much less likely to be interrupted than with the
old spot market, and you can save a little to a lot in hourly costs,
depending on the instance type, region, and availability zone.
Plus, you can get a warning a couple minutes before the instance is
interrupted, giving you a chance to save work or launch an
alternative. This warning could be handled by code (e.g., AWS Lambda)
but this article is going to show how to get the warning by email and
by SMS text message to your phone.
WARNING!
You should not run a Spot instance unless you can withstand having the
instance stopped for a while from time to time.
Make sure you can easily start a replacement instance if the Spot
instance is stopped or terminated. This probably includes regularly
storing important data outside of the Spot instance (e.g., S3).
You cannot currently re-start a stopped or hibernated Spot instance
manually, though the Spot market may re-start it automatically if you
configured it with interruption behavior “stop” (or “hibernate”) and
if the Spot price comes back down below your max bid.
If you can live with these conditions and risks, then perhaps give
this approach a try.
Start An EC2 Instance With A Spot Request
An aws-cli command to launch an EC2 instance can be turned into a Spot
Request by adding a single parameter: --instance-market-options ...
The option parameters we will use do not specify a max bid, so it
defaults to the on-demand price for the instance type in the
region. We specify “stop” and “persistent” so that the instance will
be restarted automatically if it is interrupted temporarily by a
rising Spot market price that then comes back down.
Adjust the following options to suite. The important part for this
example is the instance market options.
ami_id=ami-c62eaabe # Ubuntu 16.04 LTS Xenial HVM EBS us-west-2 (as of post date)
region=us-west-2
instance_type=t2.small
instance_market_options="MarketType='spot',SpotOptions={InstanceInterruptionBehavior='stop',SpotInstanceType='persistent'}"
instance_name="Temporary Demo $(date +'%Y-%m-%d %H:%M')"
instance_id=$(aws ec2 run-instances \
--region "$region" \
--instance-type "$instance_type" \
--image-id "$ami_id" \
--instance-market-options "$instance_market_options" \
--tag-specifications \
'ResourceType=instance,Tags=[{Key="Name",Value="'"$instance_name"'"}]' \
--output text \
--query 'Instances[*].InstanceId')
echo instance_id=$instance_id
Other options can be added as desired. For example, specify an ssh key
for the instance with an option like:
--key $USER
and a user-data script with:
--user-data file:///path/to/user-data-script.sh
If there is capacity, the instance will launch immediately and be
available quickly. It can be used like any other instance that is
launched outside of the Spot market. However, this instance has the
risk of being stopped, so make sure you are prepared for this.
The next section presents a way to get the early warning before the
instance is interrupted.