亚马逊AWS官方博客
基于详细账单的成本监控及优化解决方案
一.背景和挑战
成本的监控,分析以及优化是企业日常运营中的一项重要工作。为了帮助管理成本,AWS提供了监控和报告工具,例如月度账单,详细账单(Detail Billing Report)等。详细账单中提供了关于资源用量和费用的详细信息,但如何有效的处理,分析,展示这些信息,需要用户自己构建相应的应用来实现,因涉及到解析,存储,分析,展示等一系列的步骤,对于用户来说有一定的技术门槛。
为了支持客户进行成本优化,AWS开发了成本优化监控解决方案。此解决方案可自动解析详细账单,抽取账单中的信息,生成可在可自定义的仪表板中进行搜索,分析和可视化的精细度量标准。该解决方案使用Amazon Elasticsearch Service(Amazon ES)并利用其对Kibana的内置支持,使您能够在处理完第一批数据后立即将其可视化。
本篇文章将介绍如何在AWS中国大陆区域(北京和宁夏)部署成本监控及优化的解决方案,并提供适用于中国大陆区域(北京和宁夏)的Cloud Formation模版。对于适用于AWS其他区域的文档和代码,请参考文末的链接。
二.架构设计
该方案基于AWS提供的详细账单(Detail Billing Report)实现。在AWS账单控制台,可以启用详细账单报告并定期上传到用户指定的AWS S3存储桶。本方案将定期扫描存储桶,并将报告经过处理后导入到Amazon Elastic Search服务,以便在Kibana的用户界面进行分析和可视化。
方案的详细架构图如下:
三.方案特点
本方案有如下特点:
-
高可用:
Amazon ES是一种托管服务,可以跨不同的可用区自动复制和分发您的多节点Elasticsearch集群。通过代理服务器管理来自客户端的对Amazon ES Kibana的访问请求,使用Auto Scaling和Elastic Load Balancing维护代理服务器的可用性。
-
可定制:
用户可以根据自己的数据处理量选择不同的ES集群的节点类型。以下为模版中预定义的资源,用户也可以通过修改模版来变更配置
区域 | 部署大小 | ES主节点类型 | ES数据节点类型 | 代理服务器类型 |
北京 | Small | 无 | 1 – m4.large.elasticsearch | 2 – t3.small |
Medium | 3 – m4.large.elasticsearch | 2 – m4.large.elasticsearch | 2 – t3.small | |
Large | 3 – m4.large.elasticsearch | 4 – m4.large.elasticsearch | 2 – m5.large | |
宁夏 | Small | 无 | 1 – m4.large.elasticsearch | 2 – t3.small |
Medium | 3 – t2.small.elasticsearch | 2 – m4.large.elasticsearch | 2 – t3.small | |
Large | 3 – m4.large.elasticsearch | 4 – m4.large.elasticsearch | 2 – m5.large |
-
安全性:
此解决方案使用Nginx代理服务器来限制对Kibana仪表板的访问。同时通过安全组对该代理服务器的访问进行细粒度控制。
-
可扩展:
用户可以随时更改ES集群的节点数目而无需重新部署方案。
-
报告可定制:
本解决方案中默认包含了一些常用的视图,借助Kibana的功能,用户也可以创建,保存和共享自定义可视化视图。
四.部署和配置
本方案使用预定义的Cloud Formation模版部署。模版的下载链接如下:
部署和配置详细步骤:
Step 1: 使用Cloud Formation创建环境
1.登录到AWS的管理控制台,访问“Cloud Formation”控制台,点击创建堆栈。
2.指定模版页面:输入模版的URL (https://aws-quickstart.s3.cn-northwest-1.amazonaws.com.cn/cost-optimization-monitor/v1.1/cost-optimization-monitor-cn.template).也可以将模版下载到本地后进行定制化的修改。
注意:本模版仅适用于AWS中国大陆区域(北京和宁夏),如果需要部署在AWS其他区域,请参考文末的链接。
3.【指定堆栈详细信息】页面:
堆栈名:可自由指定,本例中使用【cost-monitor-cn】
参数:参数在堆栈配置过程中使用,参数的列表及默认值如下表所示,可根据实际情况修改:
参数 | 默认值? | 参数说明 |
User Name | <Requires Input> | 用于访问Ngnix代理服务器的用户名 |
Password | <Requires Input> | 用于访问Ngnix代理服务器的密码 注意: 密码必须至少6个字符,且至少包含一个大写字母,一个小些字母以及一个特殊字符(!@#$%^&+) |
Access CIDR Block | <Requires Input> | 可访问Ngnix代理服务器的CIDR block |
SSH Key | <Requires Input> | 用于以SSH方式访问Ngnix代理服务器的公钥 |
Domain Name | <Requires Input> | 需要创建的Amazon ES集群的domain名 注意: Domain名必须以小些字母开头,包含3-28个字符。有效字符包括a-z(仅小写字符)/0-9/-(中划线) |
Cluster Size | Small | 堆栈的大小,可以选择:Small,Medium,Large,每个选项的具体配置可以参考【三.方案特点】部分 |
Use Existing Bucket? | No | 用于保存详细账单的S3存储桶的名字。选择yes使用已有的桶,选择No将自动创建一个新的桶. |
Existing S3 Bucket Name | <Requires Input> | 如果上个参数选择了yes,这里需要输入已有的S3桶的名字,如果选择No,这里不必填写 |
VPC CIDR Block | 10.255.0.0/16 | 本解决方案使用的VPC的CIDR block;可做必要修改以避免与已有VPC重复. |
1st Subnet Network | 10.250.250.0/24 | VPC可用区1中子网的CIDR block |
2nd Subnet Network | 10.250.251.0/24 | VPC可用区2中子网的CIDR block |
Send Anonymous Usage Data | Yes | 向AWS发送匿名数据,以帮助我们了解整个客户群的解决方案使用情况和相关成本节省。 要取消此功能,请选择No |
配置截图如下:
4.【配置堆栈选项】页面:
在该页面可以指定创建资源的标签以及其它的选项,这里我们均使用默认值。
5.【审核】页面中检查配置项目,选中【我确认,AWS CloudFormation 可能创建 IAM 资源。】的复选框,点击【创建堆栈】。
6.通过控制台【事件】页面监控堆栈的创建过程。整个创建过程大约需要30分钟左右的时间。
7.创建完成后,可以在【输出】选项卡确认访问堆栈的信息。
下面的列表描述了各输出参数的详细信息:
值 | 描述 |
BucketName | 用于存放详细账单文件的S3 存储桶 |
SingleDashboardURL | 对于单个AWS账户:访问Kibana仪表板的代理服务器URL 注意: 账单数据是通过定时任务导入到ES中,因此当创建完成后立即访问Kibana仪表板时,不会立即显示账单数据,需要等待定时任务将详细账单解析完成并导入到ES集群时,才会显示。
|
ConsolidatedDashboardURL | 对于使用统一账单的用户:访问Kibana仪表板的代理服务器URL |
Step 2: 配置详细账单报告
在成本监控堆栈创建完成之后,需要完成详细账单的配置,使详细账单定期保存到Step 1中指定的S3存储桶中。
1.在AWS Cloud Formation控制台中,点击【输出】选项卡,拷贝S3的存储桶名字。
2.打开【我的账单控制面板】->【账单首选项】,选中【接收账单报告】选项
3.点击【配置】,参照提示配置详细账单保存的S3存储桶及权限,点击保存后,系统将自动验证存储桶的有效性。
4.在报告选择界面选择【包含资源和标签的详细账单报告】,点击【保存首选项】。
5.AWS最多可能需要24小时才能开始向S3存储桶发送详细账单报告。新报告生成时将会覆盖S3存储桶中旧的同名文件。生成的报告在下一次的Python脚本运行时会被解析并且导入到ES的集群中。
配置【成本分配标签】,在【账单和成本管理控制面板】中点击左侧导航栏中的【成本分配标签】选项卡,选择需要在详细账单报告中包含的标签信息。通过标签,可以按照部门,应用负载等来查询账单情况。
Step 3: 配置账单解析和导入的定时任务
如果使用默认配置,运行在proxy server上的python脚本将于每天23:00( UTC时间)从S3存储桶中的详细账单导入数据,如需更改,默认配置,可以参考如下步骤。
1.确认运行python脚本的proxy server的IP
账单解析和导入工具运行在proxy server 1上,从Cloud Formation的资源标签页找到proxy server 1的EIP。
2.使用SSH工具访问proxy server 1
访问实例时,需要使用创建堆栈时指定的密钥文件,命令如下:
3.定时任务,在【dbrparser】用户下运行,可以切换到root用户后进行确认或者修改
默认每天的23:00(UTC时间)从S3存储桶中导入当前月份的账单,每月1号的23:30(UTC时间)处理上个月的账单。导入的时间和频率,您可以根据自己的需求通过修改该crontab文件来实现。
Step 4: 访问Kibana仪表板
当数据导入到ES集群中后,用户可以访问Kibana的仪表板进行可视化图表的修改,保存和共享。
1.在Cloud Formation堆栈中的【输出】选项卡,点击SingleDashboardURL或者 ConsolidatedDashboardURL,访问Kibana
2.输入创建堆栈时指定的用户名和密码,认证通过后将转到Kibana的仪表板
3.通过点击右上角的时间图标,自定义视图的时间段
4.该解决方案中默认已经创建了一些账单分析中常用的视图,可以通过点击上方【setting】-> 【Objects】查看。详细的默认视图说明请参考如下的文档:
https://docs.aws.amazon.com/solutions/latest/cost-optimization-monitor/appendix-a.html
用户可以根据自己业务需求在Kibana中定制化自己的视图
Step 5: 创建自定义视图
用户可以基于详细账单的Metrics,创建自定义的视图。本步骤介绍基于用户自定义的标签(Tag),创建基于标签的成本分析视图。
本示例数据中包含用户自定义标签,AppPjCode, 通过该标签来区分资源所属的应用项目,我们将创建一个基于时间轴的柱状图,来展示每个时间点各个应用使用的资源成本情况。
1.更新Index的属性列表:当详细账单中有新的属性(比如新的tag)时,需要在kibana中更新属性列表以便这些属性能在视图中使用。更新方法:点击【Setting】->【Indices】->选中【Billing-*】->点击【Reload Field List】
3.在上方的菜单中选择【Visualize】选项卡,点击【Vertical Bar Chart】创建柱状图
4.【Select a search source】界面,用户可以选择从新的Search或者一个已有的Search来创建。这里我们使用从新的Search创建,Index使用【billing-*】,该index包含详细账单的所有属性信息。
5.在视图编辑界面,用户可以设置视图的横轴和纵轴的信息,对象Metrics信息.同时Kibana也提供了一些聚合函数来方便用户对数据进行查询,处理或者展示。
适用于Vertical Bar Chart组件的聚合函数可以参考下面的文档:
https://www.elastic.co/guide/en/kibana/4.1/vertical-bar-chart.html
在本实例中,Y轴我们基于【UnblendedCost】属性使用sum来获得一段时间内的费用的合计值;X轴我们基于时间,同时在特定时间段按照资源所属的【AppPjCode】标签来分组展示各应用的成本情况。配置过程,如下图所示:①配置metrics,②点击【Apply Changes】使配置生效,③确认视图的预览。
确认无误后点击右上角【Save Visualization】,输入视图名【TagVisualizationSample】,保存视图。
6.在Dashboad中使用新添加的自定义视图:打开Dashboard,点击右上角【Add Visualization】,选择视图【TagVisualizationSample】。
视图将被添加到该Dashboard的底部。
以上为如何创建自定义视图及将视图添加到Dashboard的步骤。用户可以参照Kibana的文档,结合自己的业务需求,灵活创建自定义视图。
五.总结
本解决方案使用AWS Elastic Search和其内嵌的Kibana工具,实现了基于AWS详细账单的成本监控和分析,同时通过可视化图表的方式展示。用户也可以根据自己的业务需求创建自定义视图,满足定制化的需求。
六.附录本解决方案中使用的工具及参考资料
1.详细账单报告解析工具DBRParser
https://github.com/awslabs/aws-detailed-billing-parser
2.适用于AWS Global Region的成本优化及监控解决方案
https://aws.amazon.com/jp/solutions/cost-optimization-monitor/
3.AWS ElasticSearch开发人员指南
4.Kibana用户文档
https://www.elastic.co/guide/en/kibana/4.1/index.html