前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Lambda实现EC2状态变更通知

使用Lambda实现EC2状态变更通知

作者头像
叔牙
发布2024-05-21 20:25:06
870
发布2024-05-21 20:25:06
举报

一、背景

在有些场景,需要频繁的启动、关机服务器,并且需要感知服务器启停的动作,比如项目迭代有有新服务器的启动和老服务器的停止,以及一些工具服务为了节省成本的手动和自动启停,然后需要感知这些动作,来关注服务器状态的正常和非正常变更,比如业务机器的状态变更是非常高危的动作等。

那我们要做的就是感知机器状态的变更,然后调用相应平台的webhook或者机器人接口,推送服务器元数据以及变更状态的通知群。

二、实现

1.事件总线

Amazon EventBridge 事件总线是一种无服务器事件总线,可帮助您接收、筛选、转换、路由和交付事件。事件总线是接收事件并将其传送到零个或多个目的地或目标的路由器。如果您需要将事件从多个来源路由到多个目标,可使用事件总线,在将事件传送到目标之前还可以选择转换事件。

你的账户包含一个默认事件总线,该总线可自动接收来自 AWS 服务的事件。

事件总线的常见使用场景包括:

  • 使用事件总线作为不同工作负载、服务或系统之间的代理。
  • 在应用程序中使用多条事件总线来分配事件流量。例如,创建一条总线来处理包含个人身份信息 (PII) 的事件,创建另一条总线来处理其他事件。
  • 将事件从多个事件总线发送到集中式事件总线来聚合事件。该集中式总线可以与其他总线位于同一账户中,也可以位于不同的账户或区域中。

为了解决上述问题,我们可以基于EventBridge事件总线来做,创建事件总线的规则,事件总线监听接收到资源状态变更后,来匹配规则,满足规则的会调用规则对应的目标动作,这里我们使用lambda作为target来执行。

2.创建lambda函数

先创建一个运行环境为python的lambda:

由于lambda函数发送消息通知要用到requests库,以及时区函数库pytz等,而lambda本身运行环境不提供这些函数库,所以要先本地编写,并且要把函数库安装一起打包到压缩文件中,然后上传到lambda函数,才能正确运行。

本地把依赖函数库安装到lambda脚本目录:

代码语言:javascript
复制
pip3 install requests -t /xxx/Documents/develops/sublime/Ec2StateChangeLambda
pip3 install pytz -t /xxx/Documents/develops/sublime/Ec2StateChangeLambda

编写lambda脚本:

代码语言:javascript
复制
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)

该脚本主要做了以下事情:

  • 从事件内容中解析实例id和状态变更信息
  • 调用webhook或机器人接口发送消息通知

然后进入lambda脚本目录,将脚本连同依赖的函数库一起压缩成zip文件:

代码语言:javascript
复制
zip -r Ec2StateChange.zip *

然后进入aws lambda函数把本地的lambda脚本文件上传上去:

上传成功后,脚本文件被解析,依赖的函数库也被加载:

然后点击deploy发布lambda函数,这样这个lambda脚本就可以被其他组件或者模块使用了。

3.创建事件总线规则

进入EventBridge控制台,创建事件总线规则:

填入规则名称,选择default事件总线,规则类型选择“具有事件模式的规则”,点击下一步:

事件源选择aws事件。

创建方法选择表单模式,然后事件模式选择running、stopped和terminated等,也就是监控这几个类型的状态变更事件。

目标类型选择aws服务,目标选择lambda函数,并且选中上一步我们创建的状态变更通知的lambda函数。最后按照指引完成规则的创建。

4.测试验证

我们找一台机器进行开关机测试,短暂延迟后可以看到如下的通知:

这样,我们也就基于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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、实现
    • 1.事件总线
      • 2.创建lambda函数
        • 3.创建事件总线规则
          • 4.测试验证
          • 参考
          相关产品与服务
          事件总线
          腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档