导言
在云计算时代,灵活的资源使用和付费模式是其吸引力之一。然而,为了避免意外高额费用的出现,我们需要对云服务的费用进行监控和预警。AWS提供了强大的Cost Explorer API,可以帮助我们实时监控费用的变化。本文将介绍如何利用AWS Cost Explorer API实现费用监控,并通过DingDing发送告警通知。
创建AWS Cost Explorer客户端
首先,我们需要创建AWS Cost Explorer客户端。这可以通过Boto3库实现。Boto3是AWS SDK for Python,用于与AWS服务进行交互。
import boto3
client = boto3.client('ce')
获取DingDing Token
为了向DingDing发送告警通知,我们需要一个DingDing机器人的Token。将Token存储在AWS Secrets Manager中,并使用Boto3获取。
import json
def get_secret(secret_name, region_name):
session = boto3.session.Session()
client = session.client(service_name='secretsmanager', region_name=region_name)
get_secret_value_response = client.get_secret_value(SecretId=secret_name)
return json.loads(get_secret_value_response['SecretString'])
secrets = get_secret('your_secret_name', 'your_region')
dingding_token = secrets['DINGDING_TOKEN']
获取费用数据
我们定义了一个函数get_cost_and_usage
来获取指定日期范围内的每日服务费用。在这个示例中,我们获取了前两天和前一天的费用数据。
def get_cost_and_usage(start, end):
response = client.get_cost_and_usage(
TimePeriod={'Start': start, 'End': end},
Granularity='DAILY',
Metrics=['UnblendedCost'],
GroupBy=[{'Type': 'DIMENSION', 'Key': 'SERVICE'}]
)
costs = {group['Keys'][0]: float(group['Metrics']['UnblendedCost']['Amount']) for group in response['ResultsByTime'][0]['Groups']}
return costs
today = datetime.now()
day1_ago_str = (today - timedelta(days=1)).strftime('%Y-%m-%d')
day2_ago_str = (today - timedelta(days=2)).strftime('%Y-%m-%d')
costs_day1 = get_cost_and_usage(day2_ago_str, day1_ago_str)
costs_day2 = get_cost_and_usage(day3_ago_str, day2_ago_str)
处理费用数据
我们将费用数据转换为Pandas DataFrame,以便更容易进行分析。然后,计算费用差异,并筛选出费用差异大于50的服务。
import pandas as pd
def format_df(costs_day):
df = pd.DataFrame(list(costs_day.items()), columns=["service", "fee"])
return df
df1 = format_df(costs_day1)
df2 = format_df(costs_day2)
df = pd.merge(df1, df2, on='service', suffixes=('_day2', '_day3'))
df["surge"] = df['fee_day2'] - df['fee_day3']
df = df[df["surge"] > 50]
发送DingDing告警
最后,我们通过DingDing机器人发送告警通知,提醒费用变化超过阈值。
import requests
def send_dingding_message(token):
headers = {'Content-Type': 'application/json'}
data = {
"msgtype": "markdown",
"markdown": {
"title": f"AWS Daily Cost Surge Alarm",
"text": f"<font face='黑体' color='#FF0000'>AWS Daily cost growth greater than 50 USD</font>\n"
}
}
response = requests.post(f"https://oapi.dingtalk.com/robot/send?access_token={token}", headers=headers, data=json.dumps(data))
print(response.text)
# 从Secrets Manager获取DingDing token
secrets = get_secret('your_secret_name', 'your_region')
token = secrets['DINGDING_TOKEN']
send_dingding_message(token)
结论
通过AWS Cost Explorer API、Pandas和DingDing机器人,我们可以建立一个强大的AWS费用监控系统。及时发现费用异常,有助于避免不必要的开支。
这个示例只是一个基础框架,实际项目中可能需要根据具体需求进行更多的定制和优化。希望这个实战案例对你在AWS费用监控和告警方面提供一些启示。