腾讯云费用预算计算脚本
import os
import datetime
import time
import json
import pymysql
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
def all_balance(account):
from tencentcloud.billing.v20180709 import billing_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "billing.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = billing_client.BillingClient(cred, "", clientProfile)
req = models.DescribeAccountBalanceRequest()
params = {
}
req.from_json_string(json.dumps(params))
resp = client.DescribeAccountBalance(req)
allBalance = json.loads(resp.to_json_string())
return allBalance.get('Balance')
except TencentCloudSDKException as err:
print(err)
def sqlDescribeDBInstances(account):
from tencentcloud.cdb.v20170320 import cdb_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "cdb.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cdb_client.CdbClient(cred, "ap-shanghai", clientProfile)
req = models.DescribeDBInstancesRequest()
params = {
}
req.from_json_string(json.dumps(params))
resp = client.DescribeDBInstances(req)
sql_inp_dict = json.loads(resp.to_json_string())
return sql_inp_dict
except TencentCloudSDKException as err:
print(err)
def get_db_price(god_num,mem,vol,account):
from tencentcloud.cdb.v20170320 import cdb_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "cdb.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cdb_client.CdbClient(cred, "ap-shanghai", clientProfile)
req = models.DescribeDBPriceRequest()
params = {
"Zone": "ap-shanghai-2",
"GoodsNum": god_num,
'Memory': mem,
"Volume": vol,
"PayType": "PRE_PAID",
"Period": 1
}
req.from_json_string(json.dumps(params))
resp = client.DescribeDBPrice(req)
retsql = json.loads(resp.to_json_string())
return retsql
except TencentCloudSDKException as err:
print(err)
def red_DescribeInstances(account):
from tencentcloud.redis.v20180412 import redis_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "redis.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = redis_client.RedisClient(cred, "ap-shanghai", clientProfile)
req = models.DescribeInstancesRequest()
params = {
}
req.from_json_string(json.dumps(params))
resp = client.DescribeInstances(req)
red_inp_dict = json.loads(resp.to_json_string())
return red_inp_dict
except TencentCloudSDKException as err:
print(err)
def get_redis_price(id,account):
from tencentcloud.redis.v20180412 import redis_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "redis.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = redis_client.RedisClient(cred, "ap-shanghai", clientProfile)
req = models.InquiryPriceRenewInstanceRequest()
params = {
"Period": 1,
"InstanceId": id
}
req.from_json_string(json.dumps(params))
resp = client.InquiryPriceRenewInstance(req)
redis_resp=json.loads(resp.to_json_string())
return redis_resp
except TencentCloudSDKException as err:
print(err)
def Price_inquiry(ins_id,account,region):
from tencentcloud.cvm.v20170312 import cvm_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "cvm.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cvm_client.CvmClient(cred, region, clientProfile)
req = models.InquiryPriceRenewInstancesRequest()
params = {
"InstanceIds": [ins_id, ],
"InstanceChargePrepaid": {
"Period": 1,
"RenewFlag": "NOTIFY_AND_AUTO_RENEW"
},
"RenewPortableDataDisk": True
}
req.from_json_string(json.dumps(params))
resp = client.InquiryPriceRenewInstances(req)
resp_dict = json.loads(resp.to_json_string())
price_sh = int(resp_dict['Price']['InstancePrice']['DiscountPrice']) *100
return price_sh
except TencentCloudSDKException as err:
print(err)
def Renewal_inquiry(account,region):
from tencentcloud.cvm.v20170312 import cvm_client, models
try:
cred = credential.Credential(account["secretId"], account["secretKey"])
httpProfile = HttpProfile()
httpProfile.endpoint = "cvm.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cvm_client.CvmClient(cred, region, clientProfile)
req = models.DescribeInstancesRequest()
params = {
"Filters": [
{
"Values": ["PREPAID"],
"Name": "instance-charge-type"
}
]
}
req.from_json_string(json.dumps(params))
resp = client.DescribeInstances(req)
ret = json.loads(resp.to_json_string())
return ret
except TencentCloudSDKException as err:
print(err)
global cur
global conn
def connect():
try:
global conn
J_DB_OPS = os.environ.get("DB_OPS")
DB = json.loads(J_DB_OPS)
conn = pymysql.connect(host=DB['HOST'], port=DB['PORT'],user=DB['USER'], password=DB['PASSWORD'], db=DB['NAME'], charset='utf8')
except Exception as e:
print("无法链接数据库连接" + e)
else:
print("数据库连接成功")
global cur
cur = conn.cursor()
def clean():
global cur
global conn
sql = 'truncate table tencent_balance_predict'
try:
cur.execute(sql)
conn.commit()
print("删除数据成功")
except Exception as e:
print("删除数据失败:case%s"%e)
conn.rollback()
def write_data(data):
global cur
global conn
try:
sql = 'insert into tencent_balance_predict(dt,account,balance_predict) values (%s,%s,%s);'
sql_params = (data[0], '余额预算', data[1])
try:
cur.execute(sql, sql_params)
except Exception as e:
conn.rollback()
raise e
else:
conn.commit()
except Exception as e:
raise e
def close():
global cur
global conn
cur.close()
conn.close()
if __name__ == '__main__':
t_start = time.perf_counter()
J_Tencent_Account = os.environ.get("Tencent_Account")
Tencent_Account = json.loads(J_Tencent_Account)
Tencent_Account = Tencent_Account['tecent_cloud_accounts'][0]
today_time = datetime.datetime.now()
today_Banlace = all_balance(Tencent_Account)
ins_dict = sqlDescribeDBInstances(Tencent_Account)
price_predict_list = []
for day in range(30):
after_time = datetime.timedelta(day)
test_time_str = str(today_time + after_time)
for ins_redis in red_DescribeInstances(Tencent_Account)['InstanceSet']:
if ins_redis['DeadlineTime'][:10] == test_time_str[:10]:
price_redisdict = get_redis_price(ins_redis['InstanceId'], Tencent_Account)
price_sql = price_redisdict['Price']
today_Banlace = today_Banlace - price_sql
for ins_sql in ins_dict['Items']:
if ins_sql['DeadlineTime'][:10] == test_time_str[:10]:
price_sqldict = get_db_price(ins_sql['Cpu'], ins_sql['Memory'], ins_sql['Volume'], Tencent_Account)
today_Banlace = today_Banlace - price_sqldict['Price']
for region in ["ap-shanghai","eu-frankfurt"]:
for ins_ser_sh in Renewal_inquiry(Tencent_Account,region)["InstanceSet"]:
if ins_ser_sh['ExpiredTime'][:10] == test_time_str[:10]:
price_server_sh = Price_inquiry(ins_ser_sh['InstanceId'],Tencent_Account,region)
today_Banlace = today_Banlace - price_server_sh
print((test_time_str[:10], round(today_Banlace / 100, 2)))
price_predict_list.append((test_time_str[:10], round(today_Banlace / 100, 2)))
connect()
clean()
for price_predict in price_predict_list:
write_data(price_predict)
else:
close()
print('数据插入完成')
t_end = time.perf_counter()
t_all = t_end - t_start
print('总共耗时%s秒' % t_all)