Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import requests
- import json
- import boto3
- import concurrent.futures
- # Constants for database connection and URLs
- DATABASE_NAME = ''
- DB_CLUSTER_ARN = ''
- DB_CREDENTIALS_SECRETS_STORE_ARN = ''
- RDS_CLIENT = boto3.client('rds')
- # Define URL templates for different regions
- REGION_URLS = {
- ["US East (N. Virginia)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20East%20(N.%20Virginia)/Linux/index.json?timestamp=1695335197182"],
- ["US East (N. California)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20West%20(N.%20California)/Linux/index.json?timestamp=1695335943885"],
- ["US West (Oregon)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20West%20(Oregon)/Linux/index.json?timestamp=1695336005767"],
- ["Canada (Central)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Canada%20(Central)/Linux/index.json?timestamp=1695336038545"],
- ["AWS GovCloud (US-East)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/AWS%20GovCloud%20(US-East)/Linux/index.json?timestamp=1695336076977"],
- ["AWS GovCloud (US-West)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/AWS%20GovCloud%20(US)/Linux/index.json?timestamp=1695336143250"]
- ["Africa (Cape Town)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Africa%20(Cape%20Town)/Linux/index.json?timestamp=1695336201165"]
- ["Asia Pacific (Hong Kong)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Hong%20Kong)/Linux/index.json?timestamp=1695336236566"],
- ["Asia Pacific (Hyderabad)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Hyderabad)/Linux/index.json?timestamp=1695336267211"],
- ["Asia Pacific (Jakarta)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Jakarta)/Linux/index.json?timestamp=1695336335452"],
- ["Asia Pacific (Melbourne)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Melbourne)/Linux/index.json?timestamp=1695336377353"],
- ["Asia Pacific (Mumbai)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Mumbai)/Linux/index.json?timestamp=1695336414559"],
- ["Asia Pacific (Osaka)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Osaka)/Linux/index.json?timestamp=1695336448367"],
- ["Asia Pacific (Seoul)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Seoul)/Linux/index.json?timestamp=1695336489384"],
- ["Asia Pacific (Singapore)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Singapore)/Linux/index.json?timestamp=1695336516652"],
- ["Asia Pacific (Sydney)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Australia%20(Sydney)/Linux/index.json?timestamp=1695336549342"],
- ["Asia Pacific (Tokyo)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Australia%20(Tokyo)/Linux/index.json?timestamp=1695336572681"]
- ["Europe (Frankfurt)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Frankfurt)/Linux/index.json?timestamp=1695336606682"],
- ["Europe (Ireland)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Ireland)/Linux/index.json?timestamp=1695336640824"],
- ["Europe (London)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(London)/Linux/index.json?timestamp=1695336671834"],
- ["Europe (Milan)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Milan)/Linux/index.json?timestamp=1695336709113"],
- ["Europe (Paris)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Paris)/Linux/index.json?timestamp=1695336734334"],
- ["Europe (Spain)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Spain)/Linux/index.json?timestamp=1695336756525"],
- ["Europe (Stockholm)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Stockholm)/Linux/index.json?timestamp=1695336795677"],
- ["Europe (Zurich)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Zurich)/Linux/index.json?timestamp=1695336817871"]
- ["Middle East (Bahrain)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Middle%20East%20(Bahrain)/Linux/index.json?timestamp=1695336880976"],
- ["Middle East (UAE)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Middle%20East%20(UAE)/Linux/index.json?timestamp=1695336906621"]
- ["South America (Sao Paulo)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/South%20America%20(Sao%20Paulo)/Linux/index.json?timestamp=1695336944637"]
- }
- def create_tables_if_not_exists():
- # Define SQL statements for table creation
- # Execute these statements using excute_sql function with parameters
- regions = 'CREATE TABLE IF NOT EXISTS regions (region_id INT PRIMARY KEY,region_long_name VARCHAR(15));'
- execute_sql(regions)
- operating_systems = 'CREATE TABLE IF NOT EXISTS operating_systems (operating_system_id INT PRIMARY KEY,operating_system_name VARCHAR(25));'
- execute_sql(operating_systems)
- vcpu_cores = 'CREATE TABLE IF NOT EXISTS vcpu_cores (vcpu_id INT PRIMARY KEY,core_count INT);'
- execute_sql(vcpu_cores)
- ec2_instances = 'CREATE TABLE IF NOT EXISTS ec2_instances (instance_id INT PRIMARY KEY,vcpu_id INT,memory FLOAT,storage VARCHAR(20),network_performance DECIMAL(10, 5),operating_system_id INT,instance_name VARCHAR(15),FOREIGN KEY (vcpu_id) REFERENCES vcpu_cores(vcpu_id),FOREIGN KEY (operating_system_id) REFERENCES operating_systems(operating_system_id));'
- execute_sql(ec2_instances)
- region_instances = 'CREATE TABLE IF NOT EXISTS region_instances (region_id INT,instance_id INT,price_per_hour DECIMAL(6, 4),FOREIGN KEY (region_id) REFERENCES regions(region_id),FOREIGN KEY (instance_id) REFERENCES ec2_instances(instance_id));'
- execute_sql(region_instances)
- def execute_sql(sql, parameters=[]):
- response = RDS_CLIENT.execute_statement(
- secretArn=DB_CREDENTIALS_SECRETS_STORE_ARN,
- database=DATABASE_NAME,
- resourceArn=DB_CLUSTER_ARN,
- sql=sql,
- parameters=parameters
- )
- return response
- def fetch_data(region_name, url):
- response = requests.get(url)
- if response.status_code == 200:
- data_info = response.json()
- region_data = data_info['regions'].get(region_name, {})
- instances = []
- for instance_name, instance_attributes in region_data.items():
- # Process and insert data into the database
- save_data(instance_name, instance_attributes, region_name)
- return instances
- else:
- return None
- def save_data(instance_name, instance_attributes, region_name):
- # Extract data from instance_attributes
- memory = float(instance_attributes.get('Memory', '').replace(' GiB', ''))
- storage = instance_attributes.get('Storage', '')
- network_performance = float(instance_attributes.get('Network Performance', '').replace(' Gigabit', ''))
- operating_system_name = instance_attributes.get('Operating System', '')
- vcpu_cores_count = int(instance_attributes.get('vCPU', ''))
- price = float(instance_attributes.get('Price', '').replace('$', ''))
- # sql
- insert_region_sql = "INSERT INTO regions (region_long_name) VALUES (:region_name)"
- insert_os_sql = "INSERT INTO operating_systems (operating_system_name) VALUES (:os_name)"
- insert_vcpu_sql = "INSERT INTO vcpu_cores (core_count) VALUES (:core_count)"
- # parameters
- insert_region_params = [region_name]
- insert_os_params = [operating_system_name]
- insert_vcpu_params = [vcpu_cores_count]
- # execute
- execute_sql(insert_region_sql, insert_region_params)
- execute_sql(insert_os_sql, insert_os_params)
- execute_sql(insert_vcpu_sql, insert_vcpu_params)
- # sql
- select_region_sql = "SELECT region_id FROM regions WHERE region_long_name = :region_name"
- select_os_sql = "SELECT operating_system_id FROM operating_systems WHERE operating_system_name = :os_name"
- select_vcpu_sql = "SELECT vcpu_id FROM vcpu_cores WHERE core_count = :core_count"
- # parameters
- select_region_params = [region_name]
- select_os_params = [operating_system_name]
- select_vcpu_params = [vcpu_cores_count]
- # execute
- region_id = execute_sql(select_region_sql, select_region_params)
- os_id = execute_sql(select_os_sql, select_os_params)
- vcpu_id = execute_sql(select_vcpu_sql, select_vcpu_params)
- # sql
- insert_instance_sql = "INSERT INTO ec2_instances (vcpu_id, memory, storage, network_performance, operating_system_id, instance_name) VALUES (:vcpu_id, :memory, :storage, :network_performance, :os_id, :instance_name)"
- # parameters
- insert_instance_params = [vcpu_id, memory, storage, network_performance, os_id, instance_name]
- # execute
- execute_sql(insert_instance_sql, insert_instance_params)
- # sql
- select_instance_sql = "SELECT instance_id FROM ec2_instances WHERE instance_name = :instance_name"
- # parameters
- select_instance_params = [instance_name]
- # execute
- instance_id = execute_sql(select_instance_sql, select_instance_params)
- # sql
- insert_region_instance_sql = "INSERT INTO region_instances (region_id, instance_id, price_per_hour) VALUES (:region_id, :instance_id, :price)"
- # parameters
- insert_region_instance_params = [region_id, instance_id, price]
- # execute
- execute_sql(insert_region_instance_sql, insert_region_instance_params)
- def main():
- create_tables_if_not_exists()
- # Fetch data from different regions in parallel
- with concurrent.futures.ThreadPoolExecutor() as executor:
- futures = [executor.submit(fetch_data, region_name, url) for region_name, url in REGION_URLS.items()]
- # Wait for all futures to complete
- concurrent.futures.wait(futures)
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement