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

能否使用CDK L2构造创建全局Lambda错误指标与告警

转换CDK L1 Lambda全量错误告警到L2构造的实现思路

核心逻辑说明

你的L1代码直接基于AWS/Lambda命名空间的Errors指标创建告警,而L2构造可以通过更模块化的方式实现:先通过MetricFilter从所有Lambda的日志组中过滤错误日志,将匹配的日志转为自定义CloudWatch指标,再基于这个自定义指标创建告警。

具体实现步骤

  • 步骤1:获取目标Lambda的日志组
    • 若告警针对当前CDK栈内的Lambda,直接引用每个Lambda实例的logGroup属性即可。
    • 若要覆盖账户内所有Lambda,需通过自定义资源调用CloudWatch Logs API,获取所有前缀为/aws/lambda/*的日志组。
  • 步骤2:创建MetricFilter过滤错误日志
    针对每个日志组创建MetricFilter,配置匹配错误日志的过滤规则(根据Lambda运行时调整,比如Python匹配Traceback,Node.js匹配Error:),并将匹配的日志计数发送到自定义指标命名空间。
  • 步骤3:基于自定义指标创建L2告警
    使用cloudwatch.Alarm构造,基于自定义指标配置告警触发条件和通知动作。

示例代码

import * as cdk from 'aws-cdk-lib';
import * as logs from 'aws-cdk-lib/aws-logs';
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
import * as sns from 'aws-cdk-lib/aws-sns';

export class LambdaErrorAlarmStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 引用已有的SNS通知主题
    const notifyTopic = sns.Topic.fromTopicArn(this, 'NotifyTopic', 'arn:aws:sns:region:account-id:your-topic');

    // 示例:获取当前栈内所有Lambda的日志组
    const lambdaFunctions = [/* 替换为你的Lambda实例,比如new lambda.Function(...) */];
    const logGroups = lambdaFunctions.map(lambda => lambda.logGroup);

    // 定义自定义指标的命名空间和名称
    const customNamespace = 'Custom/LambdaErrors';
    const errorMetricName = 'TotalErrors';

    // 为每个日志组创建MetricFilter
    logGroups.forEach((logGroup, index) => {
      new logs.MetricFilter(this, `LambdaErrorFilter-${index}`, {
        logGroup: logGroup,
        // 适配多运行时的错误日志过滤规则,可根据实际情况调整
        filterPattern: logs.FilterPattern.anyTerm('ERROR', 'Error', 'Traceback'),
        metricNamespace: customNamespace,
        metricName: errorMetricName,
        metricValue: '1', // 每条匹配日志计数+1
      });
    });

    // 创建自定义指标
    const errorMetric = new cloudwatch.Metric({
      namespace: customNamespace,
      metricName: errorMetricName,
      statistic: 'Sum',
      period: cdk.Duration.minutes(5),
    });

    // 创建L2告警并绑定通知动作
    new cloudwatch.Alarm(this, 'AllLambdaErrorsAlarm', {
      alarmName: 'AllErrors',
      alarmDescription: 'Lambda error alarm',
      metric: errorMetric,
      threshold: 1,
      evaluationPeriods: 1,
      datapointsToAlarm: 1,
      comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
      treatMissingData: cloudwatch.TreatMissingData.MISSING,
      actionsEnabled: true,
    }).addAlarmAction(new cloudwatch.SnsAction(notifyTopic));
  }
}

关键注意点

  • 若要覆盖全账户Lambda,需通过自定义资源调用describeLogGroups接口获取所有符合前缀的日志组,再批量创建MetricFilter。
  • 过滤规则需根据Lambda运行时的错误日志格式调整,确保能精准匹配错误日志。
  • 自定义指标统计建议用Sum(统计错误总数),而非原L1代码中的Average,更符合告警需求。

内容的提问来源于stack exchange,提问作者cyberwombat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:30:40