在有些场景,需要频繁的启动、关机服务器,并且需要感知服务器启停的动作,比如项目迭代有有新服务器的启动和老服务器的停止,以及一些工具服务为了节省成本的手动和自动启停,然后需要感知这些动作,来关注服务器状态的正常和非正常变更,比如业务机器的状态变更是非常高危的动作等。
那我们要做的就是感知机器状态的变更,然后调用相应平台的webhook或者机器人接口,推送服务器元数据以及变更状态的通知群。
Amazon EventBridge 事件总线是一种无服务器事件总线,可帮助您接收、筛选、转换、路由和交付事件。事件总线是接收事件并将其传送到零个或多个目的地或目标的路由器。如果您需要将事件从多个来源路由到多个目标,可使用事件总线,在将事件传送到目标之前还可以选择转换事件。
你的账户包含一个默认事件总线,该总线可自动接收来自 AWS 服务的事件。
事件总线的常见使用场景包括:
为了解决上述问题,我们可以基于EventBridge事件总线来做,创建事件总线的规则,事件总线监听接收到资源状态变更后,来匹配规则,满足规则的会调用规则对应的目标动作,这里我们使用lambda作为target来执行。
先创建一个运行环境为python的lambda:
由于lambda函数发送消息通知要用到requests库,以及时区函数库pytz等,而lambda本身运行环境不提供这些函数库,所以要先本地编写,并且要把函数库安装一起打包到压缩文件中,然后上传到lambda函数,才能正确运行。
本地把依赖函数库安装到lambda脚本目录:
pip3 install requests -t /xxx/Documents/develops/sublime/Ec2StateChangeLambda
pip3 install pytz -t /xxx/Documents/develops/sublime/Ec2StateChangeLambda
编写lambda脚本:
from datetime import datetime
import requests
import json
import os
import boto3
import pytz
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
ec2 = boto3.client('ec2')
now = datetime.now()
shanghai_tz = pytz.timezone('Asia/Shanghai')
instance_id = event['detail']['instance-id']
state = event['detail']['state']
desc = ""
if state == 'running':
desc = "启动"
elif state == 'stopped':
# 发送 Lark 消息通知
desc = "停机"
elif state == 'terminated':
desc = "销毁"
title = 'Ec2状态变更提示'
content = "**内容**: xxx"+instance_id + desc +"\n" \
+ "**当前时间**: " + str(now.astimezone(shanghai_tz))
data_alert = {
"msg_type": 'interactive',
"card": {
"config": {
"wide_screen_mode": True
},
"header": {
"template": "red",
"title": {
"tag": "plain_text",
"content": title
}
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": content
}
},
]
}
}
try:
response = requests.post(
"https://open.feishu.com/open-apis/bot/v2/hook/xxxxxx",
json=data_alert)
print(response)
print(response.json())
except Exception as e:
print("err=" + str(e))
return {"error": e}
print("已发送通知到feishu机器人。Response: " + response.text)
该脚本主要做了以下事情:
然后进入lambda脚本目录,将脚本连同依赖的函数库一起压缩成zip文件:
zip -r Ec2StateChange.zip *
然后进入aws lambda函数把本地的lambda脚本文件上传上去:
上传成功后,脚本文件被解析,依赖的函数库也被加载:
然后点击deploy发布lambda函数,这样这个lambda脚本就可以被其他组件或者模块使用了。
进入EventBridge控制台,创建事件总线规则:
填入规则名称,选择default事件总线,规则类型选择“具有事件模式的规则”,点击下一步:
事件源选择aws事件。
创建方法选择表单模式,然后事件模式选择running、stopped和terminated等,也就是监控这几个类型的状态变更事件。
目标类型选择aws服务,目标选择lambda函数,并且选中上一步我们创建的状态变更通知的lambda函数。最后按照指引完成规则的创建。
我们找一台机器进行开关机测试,短暂延迟后可以看到如下的通知:
这样,我们也就基于aws的EventBridge和lambda函数实现了对Ec2状态变更的监控和通知能力,在有服务器状态发生变更时就会推送相应的通知到告警群。
https://aws.amazon.com/cn/eventbridge/
https://docs.aws.amazon.com/zh_cn/eventbridge/latest/userguide/eb-what-is-how-it-works-concepts.html
https://aws.amazon.com/cn/blogs/china/automatically-create-cloudwatch-alarm-using-eventbridge-and-lambda/
https://repost.aws/zh-Hans/knowledge-center/lambda-import-module-error-pythonhttps://segmentfault.com/q/1010000043221875https://developer.apple.com/forums/thread/673827https://apple.stackexchange.com/questions/254380/why-am-i-getting-an-invalid-active-developer-path-when-attempting-to-use-git-a
本文分享自 PersistentCoder 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!