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