如何通过 aws-cdk 向 AWS Lambda 函数添​​加自定义指标和警报

elb*_*bik 5 amazon-web-services aws-cloudformation amazon-cloudwatch aws-cdk

我有点坚持配置cdk一个常见用例:为Lambda 函数设置警报指标

import lambda = require("@aws-cdk/aws-lambda")
import { Duration } from "@aws-cdk/core"
import lambda = require("@aws-cdk/aws-lambda")
import { Duration } from "@aws-cdk/core";
import { LogGroup } from '@aws-cdk/aws-logs'
import { MetricFilter, FilterPattern } from '@aws-cdk/aws-logs'
import { Alarm, ComparisonOperator, TreatMissingData } from "@aws-cdk/aws-cloudwatch"

const lambdaFn = new lambda.Function(this, "VouchersPayoutQueueConsumer", {
    functionName: 'lambda-custom-name',
    runtime: lambda.Runtime.NODEJS_10_X,
    code: lambda.Code.fromAsset("dir_name"),
    timeout: Duration.seconds(15),
    memorySize: 1024,
    handler: "handler.handlerMethod",
})

const METRIC_NAME = 'metric-name'
const METRIC_NAMESPACE = 'metric-namespace'

new MetricFilter(this, `MetricFilterId`, {
    metricName: METRIC_NAME,
    metricNamespace: METRIC_NAMESPACE,
    logGroup: LogGroup.fromLogGroupName(this, "LambdaLogGroupId", `/aws/lambda/${lambdaFn.functionName}`),
    filterPattern: FilterPattern.stringValue("$.params.name", "==", "ReportErrorsToS3"),
    metricValue: "$.params.value"
})

new Alarm(this, "AlarmId", {
    metric,
    evaluationPeriods: 1,
    actionsEnabled: true,
    alarmName: `alarms-s3errors`,
    alarmDescription: "Alarm ReportErrorsToS3",
    comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,
    treatMissingData: TreatMissingData.IGNORE,
    period: Duration.hours(1),
    threshold: 1,
    statistic: "max"
})
Run Code Online (Sandbox Code Playgroud)
  1. 从哪里获取指标以及如何使用MetricFilter映射它?
  2. 如何正确设置logGroupMetricFilter来解决这一问题:

    1/4 | 上午 11:02:05 | CREATE_FAILED | AWS::Logs::MetricFilter | MetricFilter (MetricFilter8E0FEF2B) 指定的日志组不存在。(服务:AWSLogs;状态代码:400;错误代码:ResourceNotFoundException;请求 ID:a1395551-5768-40c3-baaa-cbb133effe7b)

AWS CDK AWS 1.22.0

elb*_*bik 5

  • 该指标是单独声明的,但metricName命名空间 必须与MetricFilter使用的相同
  • LogGroup也必须单独实例化,但logGroupName与 lambda 将创建的相同。

结果:

import { Metric } from "@aws-cdk/aws-cloudwatch";
import lambda = require("@aws-cdk/aws-lambda")
import { Duration } from "@aws-cdk/core";
import { LogGroup } from '@aws-cdk/aws-logs'
import { MetricFilter, FilterPattern } from '@aws-cdk/aws-logs'
import { Alarm, ComparisonOperator, TreatMissingData } from "@aws-cdk/aws-cloudwatch"

const LAMBDA_CUSTOM_NAME = `lambda-custom-name`

let logGroup = new LogGroup(this, 'LogGroup', {
  logGroupName: `/aws/lambda/${LAMBDA_CUSTOM_NAME}`
})

const lambdaFn = new lambda.Function(this, "VouchersPayoutQueueConsumer", {
    functionName: LAMBDA_CUSTOM_NAME,
    runtime: lambda.Runtime.NODEJS_10_X,
    code: lambda.Code.fromAsset("dir_name"),
    timeout: Duration.seconds(15),
    memorySize: 1024,
    handler: "handler.handlerMethod",
});


const METRIC_NAME = 'metric-name'
const METRIC_NAMESPACE = 'metric-namespace'

const metric = new Metric({
    namespace: METRIC_NAMESPACE,
    metricName: METRIC_NAME
})

new MetricFilter(this, `MetricFilterId`, {
    metricName: METRIC_NAME,
    metricNamespace: METRIC_NAMESPACE,
    logGroup: logGroup,
    filterPattern: FilterPattern.stringValue("$.params.name", "==", "ReportErrorsToS3"),
    metricValue: "$.params.value"
})

new Alarm(this, "AlarmId", {
    metric,
    evaluationPeriods: 1,
    actionsEnabled: true,
    alarmName: `alarms-s3errors`,
    alarmDescription: "Alarm ReportErrorsToS3",
    comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,
    treatMissingData: TreatMissingData.IGNORE,
    period: Duration.hours(1),
    threshold: 1,
    statistic: "max"
})
Run Code Online (Sandbox Code Playgroud)