如何通过AWS CloudWatch告警触发Lambda并获取对应EC2实例ID
1 配置CloudWatch告警触发Lambda函数
和你现有SNS主题触发邮件推送的逻辑完全对齐,有两种实现方式,按需选择即可:
- 方式一:复用现有SNS主题(无需修改原有告警配置)
进入你用来触发邮件推送的SNS主题配置页,点击「创建订阅」,协议选择Lambda,端点选择你要触发的目标Lambda函数,保存订阅即可。后续告警触发SNS推送时,会同时给订阅端发邮件和调用Lambda函数。 - 方式二:直接给告警添加Lambda通知目标
- 先给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 - 进入对应CloudWatch告警的编辑页面,找到「通知」配置模块,和你之前添加SNS通知的操作一致,点击添加新通知,触发条件选择
ALARM状态,目标类型选择Lambda函数,下拉选择你的目标Lambda函数,保存告警配置即可。
- 先给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
相关产品推荐
相关产品推荐

