Last Updated on May 14, 2021
The Python code below gets the on-demand price (in USD) of the EC2 instance type t2.micro in the Asia Pacific (Mumbai) region with Linux operating system.
Note: There are more examples below where we get the hourly price of different on-demand EC2 Instances like other operating system or EC2 Instances that are running on Dedicated Instances or Dedicated Hosts.
import boto3
import json
from pkg_resources import resource_filename
def get_region_name(region_code):
endpoint_file = resource_filename('botocore', 'data/endpoints.json')
with open(endpoint_file, 'r') as f:
endpoint_data = json.load(f)
region_name = endpoint_data['partitions'][0]['regions'][region_code]['description']
region_name = region_name.replace('Europe', 'EU')
return region_name
def get_ec2_instance_hourly_price(region_code,
instance_type,
operating_system,
preinstalled_software='NA',
tenancy='Shared',
is_byol=False):
region_name = get_region_name(region_code)
if is_byol:
license_model = 'Bring your own license'
else:
license_model = 'No License required'
if tenancy == 'Host':
capacity_status = 'AllocatedHost'
else:
capacity_status = 'Used'
filters = [
{'Type': 'TERM_MATCH', 'Field': 'termType', 'Value': 'OnDemand'},
{'Type': 'TERM_MATCH', 'Field': 'capacitystatus', 'Value': capacity_status},
{'Type': 'TERM_MATCH', 'Field': 'location', 'Value': region_name},
{'Type': 'TERM_MATCH', 'Field': 'instanceType', 'Value': instance_type},
{'Type': 'TERM_MATCH', 'Field': 'tenancy', 'Value': tenancy},
{'Type': 'TERM_MATCH', 'Field': 'operatingSystem', 'Value': operating_system},
{'Type': 'TERM_MATCH', 'Field': 'preInstalledSw', 'Value': preinstalled_software},
{'Type': 'TERM_MATCH', 'Field': 'licenseModel', 'Value': license_model},
]
pricing_client = boto3.client('pricing', region_name='us-east-1')
response = pricing_client.get_products(ServiceCode='AmazonEC2', Filters=filters)
for price in response['PriceList']:
price = json.loads(price)
for on_demand in price['terms']['OnDemand'].values():
for price_dimensions in on_demand['priceDimensions'].values():
price_value = price_dimensions['pricePerUnit']['USD']
return float(price_value)
return None
if __name__ == "__main__":
region_code = 'ap-south-1'
instance_type = 't2.micro'
operating_system = 'Linux'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
t2.micro Linux ap-south-1
0.0124
You can check if the result is correct in AWS EC2 On-Demand Pricing page.
- Code Explained
- Shared
- Previous Generation
- Metal
- SQL Server Enterprise
- SQL Server Standard
- Windows Bring Your Own Licences (BYOL)
- SUSE Linux
- Red Hat Enterprise Linux
- Red Hat Enterprise Linux with HA
- Dedicated Instance
- Dedicated Host
- All Regions Test
Code Explained
The get_ec2_instance_hourly_price
uses the AWS Price List API of boto3.
The price changes based on different considerations like region, instance type and operating system for EC2 Instances. The get_ec2_instance_hourly_price
takes these considerations as parameters and outputs the on-demand hourly price of an EC2 Instance as float
.
If the parameters does not match any EC2 Instance on the given region then it will return None
.
The parameters, its purpose and possible values are listed below.
region_code
(string)
Takes the region in the format of the region code such as ap-south-1
, us-east-1
or eu-west-1
.
The region code is then converted to a format that the AWS Price List API accepts, before being used in the filters
for boto3 pricing.
Possible values for region_code
are as follows.
af-south-1
ap-east-1
ap-northeast-1
ap-northeast-2
ap-northeast-3
ap-south-1
ap-southeast-1
ap-southeast-2
ca-central-1
eu-central-1
eu-north-1
eu-south-1
eu-west-1
eu-west-2
eu-west-3
me-south-1
sa-east-1
us-east-1
us-east-2
us-west-1
us-west-2
instance_type
(string)
The instance type of the EC2 Instance.
There are a lot of possible values and these increases almost every year. Possible values can be found here.
Note: Not all instance types can be found in all regions.
operating_system
(string)
The operating system of the target EC2 Instance.
Possible values for operating_system.
Linux
Red Hat Enterprise Linux with HA
RHEL
SUSE
Windows
preinstalled_software
(string)
This is for EC2 Instances that uses an EC2 Image (AMI) that has a preinstalled SQL Server.
Possible values
Value | Description |
NA | No preinstalled software |
SQL Ent | SQL Server Enterprise |
SQL Std | SQL Server Standard |
SQL Web | SQL Server Web Edition |
By default this is set to NA
, no preinstalled software.
tenancy
(string)
For specifying the tenancy of the target EC2 Instance.
Possible values
Values | Tenancy Type |
Shared | Shared Hardware |
Dedicated | Dedicated Instance or single-tenant hardware |
Host | Dedicated Host, an isolated server with configurations you can control |
To learn more about EC2 Instance Tenancy, visit the AWS Documentation here.
is_byol
(Boolean)
Checks to see if the target EC2 Instance price is for Bring your own license (BYOL).
Possible Values: True
, False
By default is_byol
is set to False
.
More Examples to get the On-Demand Price of EC2 Instances
The examples below uses the get_ec2_instance_hourly_price
function and the get_region_name
functions to get the different on-demand price of an EC2 Instance.
Get the hourly price of a normal EC2 Instance Type (Shared)
if __name__ == "__main__":
region_code = 'me-south-1'
instance_type = 't3.nano'
operating_system = 'Linux'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
t3.nano Linux me-south-1
0.0063
Get the hourly price of a previous generation EC2 Instance Type
if __name__ == "__main__":
region_code = 'us-west-1'
instance_type = 'c1.xlarge'
operating_system = 'Linux'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
c1.xlarge Linux us-west-1
0.592
To check if the price for Previous Generation EC2 Instance Types is correct visit the AWS page about Previous Generation EC2 Instance Types.
Get the hourly price of a metal EC2 Instance Type
if __name__ == "__main__":
region_code = 'ap-southeast-1'
instance_type = 'm6g.metal'
operating_system = 'Linux'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
m6g.metal Linux ap-southeast-1
3.072
Get the hourly price of an EC2 Instance that is using Windows Server with SQL Server Enterprise.
if __name__ == "__main__":
region_code = 'us-east-2'
instance_type = 'r5d.2xlarge'
operating_system = 'Windows'
preinstalled_software = 'SQL Ent'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
preinstalled_software=preinstalled_software
)
print(instance_type, operating_system, preinstalled_software, region_code)
print(ec2_instance_price)
Output
r5d.2xlarge Windows SQL Ent us-east-2
3.944
Get the hourly price of an EC2 Instance that is using Linux with SQL Server Standard.
if __name__ == "__main__":
region_code = 'ca-central-1'
instance_type = 'x1e.8xlarge'
operating_system = 'Linux'
preinstalled_software = 'SQL Std'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
preinstalled_software=preinstalled_software
)
print(instance_type, operating_system, preinstalled_software, region_code)
print(ec2_instance_price)
Output
x1e.8xlarge Linux SQL Std ca-central-1
11.174
Get the hourly price of an EC2 Instance running in Windows bring your own license (BYOL)
if __name__ == "__main__":
region_code = 'ap-southeast-1'
instance_type = 'm5.xlarge'
operating_system = 'Windows'
is_byol=True
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
is_byol=is_byol
)
print(instance_type, operating_system, is_byol, region_code)
print(ec2_instance_price)
Output
m5.xlarge Windows True ap-southeast-1
0.24
Get the hourly price of an EC2 Instance running SUSE Linux Enterprise Server (SLES)
if __name__ == "__main__":
region_code = 'ap-south-1'
instance_type = 'c4.large'
operating_system = 'SUSE'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
c4.large SUSE ap-south-1
0.2
Get the hourly price of an EC2 Instance running Red Hat Enterprise Linux (RHEL)
if __name__ == "__main__":
region_code = 'af-south-1'
instance_type = 'c5ad.xlarge'
operating_system = 'RHEL'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
c5ad.xlarge RHEL af-south-1
0.294
Get the hourly price of an EC2 Instance running Red Hat Enterprise Linux with HA
if __name__ == "__main__":
region_code = 'sa-east-1'
instance_type = 'm6g.16xlarge'
operating_system = 'Red Hat Enterprise Linux with HA'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(instance_type, operating_system, region_code)
print(ec2_instance_price)
Output
m6g.16xlarge Red Hat Enterprise Linux with HA sa-east-1
4.0818
Get the hourly price of a Dedicated Instance
if __name__ == "__main__":
region_code = 'ap-northeast-3'
instance_type = 'r4.2xlarge'
operating_system = 'Linux'
tenancy = 'Dedicated'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
tenancy=tenancy
)
print(instance_type, operating_system, tenancy, region_code)
print(ec2_instance_price)
Output
r4.2xlarge Linux Dedicated ap-northeast-3
0.704
To check if the price for Dedicated Instances is correct visit the AWSpricing page about Dedicated Instances.
Get the hourly price of a Dedicate Host EC2 Instance
if __name__ == "__main__":
region_code = 'ap-southeast-2'
instance_type = 'r5'
operating_system = 'Linux'
tenancy = 'Host'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
tenancy=tenancy
)
print(instance_type, operating_system, tenancy, region_code)
print(ec2_instance_price)
Output
r5 Linux Host ap-southeast-2
7.973
To check if the price for Dedicated Host EC2 Instance is correct visit the AWS pricing page for Dedicated Hosts.
Get the On-Demand EC2 Instance Price in All Regions
Using the listing of all regions in boto3, we can create a Python Script to get the price of a specific Instance Type and operating system across all regions.
The code below will print the hourly price of an m5.large instance running Linux for all regions. Regions are alphabetically sorted by their region codes.
if __name__ == "__main__":
ec2_client = boto3.client('ec2')
response = ec2_client.describe_regions(AllRegions=True)
regions = response['Regions']
region_code_list = []
for region in regions:
region_code = region['RegionName']
region_code_list.append(region_code)
region_code_list = sorted(region_code_list)
for region_code in region_code_list:
instance_type = 'm5.large'
operating_system = 'Linux'
ec2_instance_price = get_ec2_instance_hourly_price(
region_code=region_code,
instance_type=instance_type,
operating_system=operating_system,
)
print(ec2_instance_price, '\t', instance_type, '\t', operating_system, '\t', region_code, '\t', get_region_name(region_code))
Output
0.127 m5.large Linux af-south-1 Africa (Cape Town)
0.132 m5.large Linux ap-east-1 Asia Pacific (Hong Kong)
0.124 m5.large Linux ap-northeast-1 Asia Pacific (Tokyo)
0.118 m5.large Linux ap-northeast-2 Asia Pacific (Seoul)
0.124 m5.large Linux ap-northeast-3 Asia Pacific (Osaka)
0.101 m5.large Linux ap-south-1 Asia Pacific (Mumbai)
0.12 m5.large Linux ap-southeast-1 Asia Pacific (Singapore)
0.12 m5.large Linux ap-southeast-2 Asia Pacific (Sydney)
0.107 m5.large Linux ca-central-1 Canada (Central)
0.115 m5.large Linux eu-central-1 EU (Frankfurt)
0.102 m5.large Linux eu-north-1 EU (Stockholm)
0.112 m5.large Linux eu-south-1 EU (Milan)
0.107 m5.large Linux eu-west-1 EU (Ireland)
0.111 m5.large Linux eu-west-2 EU (London)
0.112 m5.large Linux eu-west-3 EU (Paris)
0.118 m5.large Linux me-south-1 Middle East (Bahrain)
0.153 m5.large Linux sa-east-1 South America (Sao Paulo)
0.096 m5.large Linux us-east-1 US East (N. Virginia)
0.096 m5.large Linux us-east-2 US East (Ohio)
0.112 m5.large Linux us-west-1 US West (N. California)
0.096 m5.large Linux us-west-2 US West (Oregon)
I hope the above helps in getting the hourly price of on-demand EC2 Instances.
3 responses to “How to get the On-Demand price of EC2 Instances using Python and Boto3”
great work,
please also include the cpu core details along with ram size.
Very usefull. Thanks!
You’re welcome Lázaro. Glad to help. 🙂