11

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"?

nab
  • 213
  • 2
  • 5

4 Answers4

11

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.

Matt Houser
  • 10,053
  • 1
  • 28
  • 28
4

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.

bwight
  • 791
  • 1
  • 6
  • 14
4

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

Urjit
  • 163
  • 1
  • 5
3

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'
imriss
  • 131
  • 2