ec2-spot-price: retrieve Amazon EC2 spot instance price
Project description
ec2-spot-price: Retrieve Amazon EC2 spot instance price
This Python module provides simple functions and commands to retrieve Amazon EC2 spot instance price by AWS API.
Install
Install by pip
. Or pipx
may be convenient to use as a CLI application.
pip install ec2-spot-price
Setup
You need to setup AWS authentication credentials which have permissions to access ec2:DescribeSpotPriceHistory
and ec2:DescribeRegions
APIs.
A simple way to do is to create a new IAM user and attach AmazonEC2ReadOnlyAccess
policy directly to the user. Or you can use existent credentials which have permissions to access ec2:DescribeSpotPriceHistory
and ec2:DescribeRegions
APIs.
Create a new IAM user
Create a new IAM user like the following.
- Go to IAM console
- Click
Users
andAdd user
- User name:
myuser
(whatever you want) - Access type:
Programmatic access
- Click
Next: Permissions
- Set permissions:
Attach existing policies directly
- Policy name:
AmazonEC2ReadOnlyAccess
- Click
Next: Tags
- Click
Next: Review
- Click
Create user
- Click
Download .csv
- Click
Close
Note: custom policy
If you don't want to attach AmazonEC2ReadOnlyAccess
policy, you can create a new policy that only allows to access ec2:DescribeSpotPriceHistory
and ec2:DescribeRegions
APIs. Then attach this policy instead of AmazonEC2ReadOnlyAccess
policy.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeSpotPriceHistory",
"ec2:DescribeRegions"
],
"Resource": "*"
}
]
}
Edit ~/.aws/credentials
You can use "named profile" to have multiple credentials settings.
[myprofile] # whatever you want, or [default]
aws_access_key_id=[copy from csv]
aws_secret_access_key=[copy from csv]
region=us-east-2 # wherever you want
If you use "named profile", you need to specify AWS_PROFILE
environment variable.
export AWS_PROFILE=myprofile
Usage
ec2_spot_price
command
You can run ec2_spot_price
(or python /path/to/ec2_spot_price.py
) command to retrieve spot instance prices.
-h
option shows help message.
% ec2_spot_price -h
usage: ec2_spot_price [-h] [-r REGION] [-i INSTANCE] [-o OS] [-csv] [-d] [-V]
retrieve Amazon EC2 spot instance price.
optional arguments:
-h, --help show this help message and exit
-r REGION, --region REGION
filter by regions. if "" is specified, retrieve all of
the regions. (default: "us-east-1,us-east-2,us-
west-1,us-west-2")
-i INSTANCE, --instance INSTANCE
filter by instance types e.g. "g3.4xlarge,p2.xlarge".
(default: retrieve all of the instance types)
-o OS, --os OS filter by OS types. (default: "Linux/UNIX")
-csv, --csv output by CSV format. (default: False)
-d, --debug show debug information.
-V, --version show version.
You can specify region names by -r
, instance types by -i
and OS types by -o
. For example, the following command shows table of us-east-1,us-east-2
regions, c5.xlarge,c5d.xlarge
instances and Linux/UNIX
OS (default value).
% ec2_spot_price -r "us-east-1,us-east-2" -i "c5.xlarge,c5d.xlarge"
───────────────────────────────────────────────────────────────────────
Price Zone Instance OS Timestamp
───────────────────────────────────────────────────────────────────────
0.038000 us-east-2a c5.xlarge Linux/UNIX 2021-02-24 03:59:14
0.038000 us-east-2a c5d.xlarge Linux/UNIX 2021-02-24 18:23:40
0.038000 us-east-2b c5.xlarge Linux/UNIX 2021-02-24 03:59:14
0.038000 us-east-2b c5d.xlarge Linux/UNIX 2021-02-24 20:49:32
0.038000 us-east-2c c5.xlarge Linux/UNIX 2021-02-24 03:59:14
0.038000 us-east-2c c5d.xlarge Linux/UNIX 2021-02-24 08:06:21
0.066500 us-east-1c c5.xlarge Linux/UNIX 2021-02-24 15:56:41
0.066800 us-east-1f c5d.xlarge Linux/UNIX 2021-02-24 18:38:06
0.069600 us-east-1a c5d.xlarge Linux/UNIX 2021-02-24 17:55:16
0.069700 us-east-1d c5.xlarge Linux/UNIX 2021-02-24 19:28:40
0.069900 us-east-1b c5.xlarge Linux/UNIX 2021-02-24 21:10:11
0.072100 us-east-1a c5.xlarge Linux/UNIX 2021-02-24 16:55:41
0.079600 us-east-1c c5d.xlarge Linux/UNIX 2021-02-24 21:01:42
0.079600 us-east-1d c5d.xlarge Linux/UNIX 2021-02-24 14:31:55
0.083700 us-east-1f c5.xlarge Linux/UNIX 2021-02-24 14:48:41
0.090300 us-east-1b c5d.xlarge Linux/UNIX 2021-02-24 03:58:17
───────────────────────────────────────────────────────────────────────
In this case, you should use c5.xlarge
at us-east-2
region.
Another example to retrieve all of the spot prices in all regions with verbose option.
% ec2_spot_price -r "" -i "" -o "" -csv > spot_prices.csv
% wc -l spot_prices.csv
49822 spot_prices.csv
% head spot_prices.csv
SpotPrice,AvailabilityZone,InstanceType,ProductDescription,Timestamp
0.000800,ap-south-1a,t4g.nano,Linux/UNIX,2021-02-24 17:41:52
0.000800,ap-south-1a,t4g.nano,SUSE Linux,2021-02-24 17:41:52
0.000800,ap-south-1b,t4g.nano,Linux/UNIX,2021-02-24 17:41:52
0.000800,ap-south-1b,t4g.nano,SUSE Linux,2021-02-24 17:41:52
0.000800,ap-south-1c,t4g.nano,Linux/UNIX,2021-02-24 17:41:52
0.000800,ap-south-1c,t4g.nano,SUSE Linux,2021-02-24 17:41:52
0.000900,ap-south-1a,t3a.nano,Linux/UNIX,2021-02-24 17:06:18
0.000900,ap-south-1a,t3a.nano,SUSE Linux,2021-02-24 17:06:18
0.000900,ap-south-1b,t3a.nano,Linux/UNIX,2021-02-24 17:06:18
Then open spot_prices.csv
with spread sheet application like Excel.
ec2_spot_price
module
There are three functions.
Function spot_prices
retrieves spot prices as list.
Function print_csv
prints spot prices with CSV format.
Function print_table
prints spot prices with table format.
% python
>>> import ec2_spot_price as ec2sp
>>> df = ec2sp.spot_prices(['us-east-1', 'us-east-2'], ['c5.xlarge', 'c5d.xlarge'], ['Linux/UNIX'])
>>> len(df)
16
>>> ec2sp.print_table(df)
───────────────────────────────────────────────────────────────────────
Price Zone Instance OS Timestamp
───────────────────────────────────────────────────────────────────────
0.038000 us-east-2a c5.xlarge Linux/UNIX 2021-02-24 03:59:14
0.038000 us-east-2a c5d.xlarge Linux/UNIX 2021-02-24 18:23:40
0.038000 us-east-2b c5.xlarge Linux/UNIX 2021-02-24 03:59:14
0.038000 us-east-2b c5d.xlarge Linux/UNIX 2021-02-24 20:49:32
0.038000 us-east-2c c5.xlarge Linux/UNIX 2021-02-24 03:59:14
0.038000 us-east-2c c5d.xlarge Linux/UNIX 2021-02-24 08:06:21
0.066500 us-east-1c c5.xlarge Linux/UNIX 2021-02-24 15:56:41
0.066800 us-east-1f c5d.xlarge Linux/UNIX 2021-02-24 18:38:06
0.069600 us-east-1a c5d.xlarge Linux/UNIX 2021-02-24 17:55:16
0.069700 us-east-1d c5.xlarge Linux/UNIX 2021-02-24 19:28:40
0.069900 us-east-1b c5.xlarge Linux/UNIX 2021-02-24 21:10:11
0.072100 us-east-1a c5.xlarge Linux/UNIX 2021-02-24 16:55:41
0.079600 us-east-1c c5d.xlarge Linux/UNIX 2021-02-24 21:01:42
0.079600 us-east-1d c5d.xlarge Linux/UNIX 2021-02-24 14:31:55
0.082500 us-east-1f c5.xlarge Linux/UNIX 2021-02-24 21:35:41
0.090300 us-east-1b c5d.xlarge Linux/UNIX 2021-02-24 03:58:17
───────────────────────────────────────────────────────────────────────
>>> ec2sp.print_csv(df)
SpotPrice,AvailabilityZone,InstanceType,ProductDescription,Timestamp
0.038000,us-east-2a,c5.xlarge,Linux/UNIX,2021-02-24 03:59:14
0.038000,us-east-2a,c5d.xlarge,Linux/UNIX,2021-02-24 18:23:40
0.038000,us-east-2b,c5.xlarge,Linux/UNIX,2021-02-24 03:59:14
0.038000,us-east-2b,c5d.xlarge,Linux/UNIX,2021-02-24 20:49:32
0.038000,us-east-2c,c5.xlarge,Linux/UNIX,2021-02-24 03:59:14
0.038000,us-east-2c,c5d.xlarge,Linux/UNIX,2021-02-24 08:06:21
0.066500,us-east-1c,c5.xlarge,Linux/UNIX,2021-02-24 15:56:41
0.066800,us-east-1f,c5d.xlarge,Linux/UNIX,2021-02-24 18:38:06
0.069600,us-east-1a,c5d.xlarge,Linux/UNIX,2021-02-24 17:55:16
0.069700,us-east-1d,c5.xlarge,Linux/UNIX,2021-02-24 19:28:40
0.069900,us-east-1b,c5.xlarge,Linux/UNIX,2021-02-24 21:10:11
0.072100,us-east-1a,c5.xlarge,Linux/UNIX,2021-02-24 16:55:41
0.079600,us-east-1c,c5d.xlarge,Linux/UNIX,2021-02-24 21:01:42
0.079600,us-east-1d,c5d.xlarge,Linux/UNIX,2021-02-24 14:31:55
0.082500,us-east-1f,c5.xlarge,Linux/UNIX,2021-02-24 21:35:41
0.090300,us-east-1b,c5d.xlarge,Linux/UNIX,2021-02-24 03:58:17
Another example to retrieve all of the spot prices in all regions.
You can use pd.DataFrame
methods to manipulate them.
>>> import ec2_spot_price as ec2sp
>>> df = ec2sp.spot_prices([], [], [])
>>> len(df)
49817
>>> df = df.query('ProductDescription == "Linux/UNIX"')
>>> df = df.drop(['Timestamp', 'ProductDescription'], axis=1)
>>> df = df.sort_values(by=['SpotPrice', 'AvailabilityZone', 'InstanceType'])
>>> df = df.query('InstanceType.str.match("c5.?\.xlarge")')
>>> len(df)
187
>>> df.head(20)
SpotPrice AvailabilityZone InstanceType
42061 0.038000 us-east-2a c5.xlarge
40121 0.038000 us-east-2a c5d.xlarge
40650 0.038000 us-east-2a c5n.xlarge
42060 0.038000 us-east-2b c5.xlarge
39630 0.038000 us-east-2b c5d.xlarge
40649 0.038000 us-east-2b c5n.xlarge
42059 0.038000 us-east-2c c5.xlarge
41712 0.038000 us-east-2c c5d.xlarge
40648 0.038000 us-east-2c c5n.xlarge
39716 0.042400 us-east-2c c5a.xlarge
39592 0.044100 us-east-2b c5a.xlarge
3105 0.052800 ap-south-1c c5a.xlarge
3104 0.053200 ap-south-1b c5a.xlarge
2505 0.053500 ap-south-1a c5a.xlarge
2831 0.054000 ap-south-1a c5n.xlarge
3430 0.054000 ap-south-1b c5d.xlarge
3768 0.054100 ap-south-1a c5d.xlarge
1765 0.054100 ap-south-1b c5n.xlarge
1727 0.054100 ap-south-1c c5d.xlarge
2981 0.054100 ap-south-1c c5n.xlarge
Links
- https://aws.amazon.com/ec2/spot/pricing/
- https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances-history.html
- https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-spot-price-history.html
- https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotPriceHistory.html
- https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRegions.html
- https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html?highlight=describe%20spot#EC2.Client.describe_spot_price_history
Author
Susumu OTA
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file ec2-spot-price-0.2.3.tar.gz
.
File metadata
- Download URL: ec2-spot-price-0.2.3.tar.gz
- Upload date:
- Size: 12.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.4 CPython/3.7.6 Darwin/19.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 39cf99a8646e914eae99c499e1356a6b2929c2bb5641bfe1fa45f8f465bc95b5 |
|
MD5 | 3331562392bd8bf84c11cae099f62e6c |
|
BLAKE2b-256 | 5bd2e995b13b36aededd513fec747a612e68368e2279f1ddf88ee80aa6d71c3e |
File details
Details for the file ec2_spot_price-0.2.3-py3-none-any.whl
.
File metadata
- Download URL: ec2_spot_price-0.2.3-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.4 CPython/3.7.6 Darwin/19.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7437f53dd8d4acbd77292c413e70c94741025e87d5c4c9eb05512237a621955d |
|
MD5 | 701afd3cb6f1ba07b4d2476f90ec0443 |
|
BLAKE2b-256 | 8aaa64cbdb699a46f379bd3e5127a8932f3a002ddd91568a15e8a791a5ff35b0 |