You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS CloudWatch告警触发Lambda并获取对应EC2实例ID

1 配置CloudWatch告警触发Lambda函数

和你现有SNS主题触发邮件推送的逻辑完全对齐,有两种实现方式,按需选择即可:

  • 方式一:复用现有SNS主题(无需修改原有告警配置)
    进入你用来触发邮件推送的SNS主题配置页,点击「创建订阅」,协议选择Lambda,端点选择你要触发的目标Lambda函数,保存订阅即可。后续告警触发SNS推送时,会同时给订阅端发邮件和调用Lambda函数。
  • 方式二:直接给告警添加Lambda通知目标
    1. 先给Lambda配置调用权限:在Lambda函数的权限配置页添加信任主体为cloudwatch.amazonaws.com的lambda:InvokeFunction权限,也可以通过CLI执行以下命令配置:
      aws lambda add-permission --function-name <替换为你的Lambda函数名> --statement-id allow-cloudwatch-invoke --action lambda:InvokeFunction --principal cloudwatch.amazonaws.com
    2. 进入对应CloudWatch告警的编辑页面,找到「通知」配置模块,和你之前添加SNS通知的操作一致,点击添加新通知,触发条件选择ALARM状态,目标类型选择Lambda函数,下拉选择你的目标Lambda函数,保存告警配置即可。
2 提取触发告警的EC2实例ID传入Lambda

默认CloudWatch日志指标过滤告警不会自动携带实例ID参数,需要你先调整日志采集和指标过滤的配置,把实例ID作为指标维度关联,步骤如下:

  • 步骤1:确保CloudWatch Agent上报日志时携带实例ID
    检查你的EC2上部署的CloudWatch Agent配置文件,在logs配置块中添加"append_instance_id": true,配置生效后所有上报到日志组的日志都会自动附加instance-id元数据字段,值为当前EC2的实例ID。
  • 步骤2:修改指标过滤规则,按实例ID维度统计错误次数
    进入对应日志组的「指标过滤器」页面,编辑你用来匹配错误模式的过滤规则:
    • 在指标配置项中找到「维度」配置,新增一条维度,键填InstanceId,值选择日志中的$.instance-id元数据字段
    • 保存过滤规则后,后续上报的错误日志会按不同实例ID分别统计计数,每个实例的错误次数会生成独立的时间序列指标
  • 步骤3:调整告警规则关联带维度的指标
    编辑你的CloudWatch告警,把告警关联的指标替换为上一步生成的带InstanceId维度的错误计数指标,原有触发阈值(累计3次)保持不变,保存告警配置。
  • 步骤4:Lambda侧解析入参提取实例ID
    CloudWatch告警触发Lambda时会把指标的维度信息完整传入入参中,根据你触发方式的不同,提取逻辑分别为:
    • 走SNS主题订阅触发Lambda的Python示例代码:
    import json
    def lambda_handler(event, context):
        # 解析SNS消息中的告警详情
        alarm_msg = json.loads(event['Records'][0]['Sns']['Message'])
        # 遍历维度匹配InstanceId
        instance_id = ""
        for dim in alarm_msg['Trigger']['Dimensions']:
            if dim['name'] == "InstanceId":
                instance_id = dim['value']
                break
        # 后续业务逻辑可直接使用instance_id参数
        print(f"触发告警的实例ID: {instance_id}")
    
    • 告警直接触发Lambda的Python示例代码:
    def lambda_handler(event, context):
        instance_id = ""
        for dim in event['Trigger']['Dimensions']:
            if dim['name'] == "InstanceId":
                instance_id = dim['value']
                break
        print(f"触发告警的实例ID: {instance_id}")
    

内容的提问来源于stack exchange,提问作者learn.amzn21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:48:05