LambdaからCloudWatchに自動で送信されるメトリクスを使ってアラームの作成を試してみた

2024.04.05

はじめに

以前、私はLambdaの異常監視を行う際にCloudWatchLogsにログを出力し、そのログにメトリクスフィルター設置して監視したいメトリクスを含んだログにフィルターをかけてました。
このフィルターしたメトリクスにアラームを仕込む形です。
しかし、Lambda関数毎に自動的にCloudWatchに送信されるメトリクスを活用することで、よりシンプルに上記と同じようにアラームの設定が可能であることを知りましたので当ブログで紹介したいと思います。
コンソールからの場合とCDKによる実装の2通りを紹介します。

やりたいこと

Lambda関数が設定した実行時間を超えた場合の監視をするため、Durationメトリクスにアラームを設定します。
メトリクスに関する詳細は以下のリンク先のAWS公式ドキュメントでも確認できます。
メトリクスの種類

コンソールを使用した方法

メトリクスの選択

CloudWatch コンソールを使用して、関数名でメトリクスをフィルタリング可能で、今回はこの方法を使用したいと思います。
公式ドキュメントでの説明は以下から確認です。
CloudWatch コンソールでのメトリクスの表示

CloudWatchコンソールにアクセスし、左側のメニューからメトリクスのメニュー内のすべてのメトリクスをクリックします。 するとCloudWatchで利用可能なすべてのメトリクスが表示されます。

次に、Lambdaをクリックします。これでLambdaのメトリクスを使用する事が指定できます。

次に関数名別をクリックします。

メトリクス取得可能な関数名とそのメトリクスが表示されので、今回監視したいDurationのチェックボックスにチェックを入れます。
次に画面右上のアラーム作成をクリックしてアラームの設定に進みます。

アラームの作成

前項に引き続きこの項ではアラーム設定と作成を行っていきます。 まずステップ1で画面でアラームの設定を行っていきます。 設定内容は以下の通りにします。 設定したら次へボタンをクリックし、ステップ2に進みます。

項目 設定内容 説明
統計 平均
期間 1分
しきい値の種類 静的
アラーム条件 より大きい
しきい値 10000 ミリ秒
アラームの説明 任意の説明


ステップ2で設定できるアクションの設定は今回はスキップします。何も設定しないで次へボタンをクリックします。

ステップ3でアラーム名を記入して次へボタンをクリックします。

ステップ4で設定したアラームのプレビューが表示されますので問題なければアラームの作成ボタンをクリックします。

以上でアラームの作成が完了です。

CDKを使用した方法

CDKを使用して同様の設定を行う方法を紹介します。
まずCDKのスタック全体のコードは以下の通りです。 31行目〜49行目でCloudWatchのメトリクスを取得し、そのメトリクスをアラームの条件に設定しています。

import {
  aws_lambda,
  aws_lambda_nodejs,
  aws_apigateway,
  aws_cloudwatch,
  Duration,
} from 'aws-cdk-lib';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class AlarmWithCwMetricsStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    const testFunc = new aws_lambda_nodejs.NodejsFunction(this, 'testFunc', {
      functionName: 'testFunc',
      runtime: aws_lambda.Runtime.NODEJS_20_X,
      architecture: aws_lambda.Architecture.ARM_64,
      entry:
        './src/lambda/handler.ts',
    });

    new aws_apigateway.LambdaRestApi(this, 'RestApi', {
      handler: testFunc,
      deployOptions: {
        stageName: 'v1',
        tracingEnabled: true,
      }
    });

    const metric =new aws_cloudwatch.Metric({
      namespace: `AWS/Lambda`,
      dimensionsMap: {
        FunctionName: testFunc.functionName,
      },
      metricName: 'Duration',
      period: Duration.minutes(1),
      statistic: 'Average',
    });

    new aws_cloudwatch.Alarm(
      this,
      `LambdaDurationAlarm`,
      {
        alarmName: `LambdaDurationAlarm`,
        metric,
        threshold: 10000,
        evaluationPeriods: 1,
      }
    );
  }
}

CloudWatchメトリクス取得設定

CloudWatchからメトリクスを取得するためにaws_cloudwatch.Metric()を使用してます。 全体のコードの中の以下の箇所でメトリクス取得の設定をしています。

const metric =new aws_cloudwatch.Metric({
  namespace: `AWS/Lambda`,
  dimensionsMap: {
    FunctionName: testFunc.functionName,
  },
  metricName: 'Duration',
  period: Duration.minutes(1),
  statistic: 'Average',
});

以下が各プロパティの説明となります。

  • namespace
    • AWS/Lambdaと指定する事でLambda関数のメトリクスを取得できます。
  • dimensionsMap
    • 取得したいメトリクスの対象の関数名を指定しています。今回はスタック内で作成しているLambda関数の名前を指定してます。
  • metricName
    • 取得したいメトリクスを指定しています。ここで今回取得したいメトリクスのDurationを指定しています。
  • period
    • 下に指定する統計の適応期間を指定します。
  • statistic
    • データ評価の統計方法を平均で指定しています。前項で指定した1分間のデータの平均値で評価するように指定します。

アラームの設定

アラームの設定は全体コードの以下の箇所でaws_cloudwatch.Alarm()を使用して行います。

new aws_cloudwatch.Alarm(
  this,
  `LambdaDurationAlarm`,
  {
    alarmName: `LambdaDurationAlarm`,
    metric,
    threshold: 10000,
    evaluationPeriods: 1,
  }
);

以下が各プロパティの説明となります。

  • alarmName
    • アラームの名前を指定します。
  • metric
    • 先ほどaws_cloudwatch.Metricで作成したメトリクスを指定します。
  • threshold
    • アラームのしきい値を指定します。ここで指定した値を超えた場合アラームが発生します。単位はミリ秒です。10000msを指定します。
  • evaluationPeriods
    • しきい値を何回超えたらアラームとするかを指定します。ここでは1回超えたらアラームとするように指定しています。

この設定でデプロイすると、先程コンソールで作成たものと同様の設定のアラームが作成されます。 CDK用いる場合の設定方法は以上となります。

最後に

今回はロググロープやメトリクスフィルターを使用せずにLambda監視の目的でメトリクスを取得し、そのメトリクスにアラームを設定する方法を紹介しました。
CloudWatchに自動で送信されるメトリクスに関してはこの方法がシンプルに構築できるため良いと思います。
Lambda以外のリソースについても自動で送られるメトリクスがありますので、同様の構築が可能となります。
例) DynamoDBから自動で送信されるメトリクスはこちらから確認できます。