7

There's a AWS metadata service which provides some information about the EC2 instance that issues a request to http://169.254.169.254/. I'm wondering if there's a way to know from that metadata if the instance is "Spot" or "On Demand"?

8

The information is not available inside the metadata.

However, you can get the instance ID from the metadata, then call ec2-describe-instances to get instance information about your instance. Inside that instance description is the spot instance request ID. If blank, then it's not a spot instance, otherwise, it's a spot instance.

  • Nice! Thanks, I've been looking for this for a while and must have overlooked it when looking at the instance data. – SaxDaddy Dec 26 '15 at 9:32
3

I don't believe they have this information in the metadata.

You could assign a different profile for instances you launch as spot instances and use the profile name to determine what type of instance it is. If that doesn't seem like a clean or viable solution you can always grab the instance-id from the meta data then run the command ec2-describe-spot-instance-requests --filter instance-id=<instanceid> if the command returns empty than the instance is not a spot instance, if the command returns with data then it's a spot instance.

2

I know this is super old but if anyone wants a one liner:

aws ec2 describe-spot-instance-requests \
  --filters Name=instance-id,Values="$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)" \
  --region us-east-1 | \
  jq -r '.SpotInstanceRequests | if length > 0 then "spot" else "normal" end'

Adjust --region accordingly

https://gist.github.com/urjitbhatia/c5af8a3d53661cb3d4e896feae23fc1d

1

A little improved version of that of @urjit:

aws ec2 describe-spot-instance-requests \
  --filters Name=instance-id,Values="$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)" \
  --region "$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//')" | \
  jq -r '.SpotInstanceRequests | if length > 0 then "Ec2Spot" else "OnDemand" end'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.