本文介绍如何基于E-HPC节点扩容事件,结合事件总线和函数计算实现扩容水位超量告警。
背景信息
E-HPC配合事件总线EventBridge,可以将E-HPC集群的操作投递到云服务专用事件总线。在此基础上,结合函数计算,可以更加灵活地将E-HPC事件进行二次定制投递,例如可以使用E-HPC节点扩容事件制定扩容水位告警策略,并通过自定义事件总线将告警通过钉钉进行通知。示例场景如下:
准备工作
配置前,请完成以下准备工作:
开通EventBridge服务。具体操作,请参见开通事件总线EventBridge并授权。
开通函数计算服务。具体操作,请参见开通函数计算服务。
步骤一:创建钉钉机器人
创建钉钉机器人后会生成专属的Webhook地址,通过Webhook地址可以关联到其他服务(如事件总线EventBridge)接收通知。
打开需要接收事件通知的钉钉群。
进入机器人设置页面。
单击钉钉群右上角的图标。
在群设置页面,单击智能群助手。
在智能群助手面板,单击添加机器人。
在群机器人对话框中的添加机器人区域,单击图标。
在选择要添加的机器人区域,单击自定义。
在机器人详情对话框,单击添加。
按页面提示完成机器人设置,单击完成。
您可以自定义设置机器人名称,安全设置请选择加签并复制加签密钥。
复制并保存Webhook地址。
步骤二:创建自定义事件总线
创建自定义事件总线,用于接收函数计算投递的告警事件,并将告警信息推送到钉钉进行通知。
进入创建自定义事件总线面板。
登录事件总线控制台。
在左侧导航栏选择事件总线。
在顶部菜单栏选择地域。
在右上角的自定义事件总线区域,单击快速创建。
在总线配置页,输入名称和描述,单击下一步。
在事件源配置页,输入事件源名称,事件提供方选择自定义应用,然后单击下一步。
在规则配置页,输入规则名称,单击下一步。
在目标配置页,完成相关配置,然后单击创建。
配置目标时,需要注意的参数如下:
服务类型:选择钉钉。
地址:填入步骤一保存的Webhook地址。
密钥:填入步骤一保存的加签密钥。
推送内容:请按以下示例配置。更多信息,请参见事件内容转换。
变量
{ "content": "$.data.content" }
模板
{ "msgtype": "text", "text": { "content": "${content}" } }
步骤三:创建函数
在函数计算服务中创建函数,用于接收云服务专用事件总线投递的E-HPC集群扩容事件,同时判断扩容数量是否超出设置的水位,如果超出,则将告警事件投递到自定义事件总线。
创建函数计算服务。
具体操作,请参见创建服务。创建时,请在高级选项中配置服务角色,该角色需要具备访问事件总线EventBridge的权限,例如AliyunFcDefaultRole。
创建函数。
具体操作,请参见创建函数。创建时,请在函数代码处将运行环境请选择为Python 3.6,其他参数保持默认。
编写函数。
在函数详情页,单击函数代码页签。
在右下方的终端处,执行以下命令,安装EventBridge python SDK。
pip install alibabacloud_eventbridge -t . pip install alibabacloud_tea_console -t .
在左侧资源管理器中,打开index.py,编写函数代码,编写完成后,单击部署代码。
index.py中默认为您创建函数时选择的示例代码,需替换为投递扩容水位超量事件的代码。
代码示例如下,请根据实际配置替换代码中的参数。
参数
示例值
说明
MAX_COUNT
5
扩容水位。扩容数量超出该值时将投递告警事件。
config.endpoint
eventbridge.cn-hangzhou.aliyuncs.com
事件总线的endpoint。
event.source
my.event
自定义事件总线的事件源名称。
aliyuneventbusname
test
自定义事件总线的名称。
# -*- coding: utf-8 -*- import logging import json from alibabacloud_eventbridge.client import Client as EventBridgeClient from alibabacloud_eventbridge import models as event_bridge_models from alibabacloud_tea_console.client import Client as ConsoleClient from alibabacloud_tea_util.client import Client as UtilClient MAX_COUNT = 5 def create_client(creds): """ Create client初始化公共请求参数 """ config = event_bridge_models.Config() config.access_key_id = creds.access_key_id config.access_key_secret = creds.access_key_secret config.security_token = creds.security_token config.endpoint = "eventbridge.cn-hangzhou.aliyuncs.com" return EventBridgeClient(config) def put_events(client, content): """ PutEvents 投递自定义总线事件 """ event = event_bridge_models.CloudEvent() data = json.dumps(content) event.datacontenttype = "application/json" event.data = UtilClient.to_bytes(data) event.id = "a5074581-7e74-4e4c-868f-47e7afdf****" # 自定义事件总线的事件源 event.source = "my.event" event.specversion = "1.0" event.type = "ui:Created:PostObject" event.time = "2022-08-30T03:48:37.492Z" event.subject = "my:subject" # 自定义事件总线的名称 event.extensions = { "aliyuneventbusname": "test" } try: resp = client.put_events([event]) ConsoleClient.log("--------------------Publish event to the aliyun EventBus--------------------") ConsoleClient.log(UtilClient.to_jsonstring(resp.to_map())) except Exception as error: ConsoleClient.log(error) def handler(event, context): logger = logging.getLogger() evt = json.loads(event) actual_count = evt['data']['Count'] # 实际扩容数量超过预设水位,则投递告警事件到自定义总线事件 if actual_count > MAX_COUNT: creds = context.credentials client = create_client(creds) content = { 'content': '您的集群 %s(%s) 于 %s 单次扩容数量为 %d,已超过您设置的水位 %d, 此次扩容请求ID为 %s' % (evt['data']['ClusterName'], evt['data']['ClusterId'], evt['data']['CreateTime'], actual_count, MAX_COUNT, evt['data']['RequestId'])} put_events(client, content) return 'call putevent!' else: return 'do nothing!'
步骤四:配置云服务专用总线事件触发器
在云服务专用总线事件中创建规则,将E-HPC集群扩容事件投递到函数计算。
在事件总线控制台的事件总线页面,单击default。
在左侧导航栏选择事件规则,然后单击创建规则。
在创建规则面板,完成规则配置。
在配置基本信息页面,输入名称和描述,单击下一步。
在配置事件模式页面,参考参数说明完成配置,单击下一步。
参数说明如下,未提及的参数保持默认。
事件源类型:选择阿里云官方事件源。
事件源:选择acs.ehpc。
事件类型:选择ehpc:NodeOperation:NodeCreate事件。
在配置事件目标页面,参考参数说明完成配置,单击创建。
参数说明如下,未提及的参数保持默认。
服务类型:选择函数计算。
服务:选择步骤三创建的函数计算服务。
函数:选择步骤三创建的函数。
结果验证
本文采用的示例为E-HPC集群扩容超过5台时,通过钉钉发送告警通知,以下为验证步骤。
对某个集群进行手动扩容节点。具体操作,请参见扩容集群。
查看钉钉群的消息通知。