AWS CDK で Amazon CloudWatch dashboards のダッシュボード変数がサポートされました

2023.08.02

こんにちは、CX事業本部 Delivery部の若槻です。

最近の Amazon CloudWatch dashboards のアップデートで、「ダッシュボード変数」を指定してウィジェットの表示を切り替えることができるようになりました。

そして AWS CDK でも2週間前の更新でこのダッシュボード変数機能がサポートされ CDK で実装できるようになったので、試してみました。

cloudwatch: dashboard variables (#26285) (73f2741), closes #26200

試してみた

CDK コード

Lambda 関数の各種メトリクスおよびログをウィジェットで表示するダッシュボードを作成してみます。下記は CDK スタックのコードです。

lib/lambda-cloudwatch-dashboard-stack.ts

import { Stack, StackProps } from "aws-cdk-lib";
import {
  GraphWidget,
  Dashboard,
  LogQueryWidget,
  TextWidget,
} from "aws-cdk-lib/aws-cloudwatch";
import { Function, Runtime, AssetCode } from "aws-cdk-lib/aws-lambda";
import * as cw from "aws-cdk-lib/aws-cloudwatch";
import { Construct } from "constructs";

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

    // ウィジェットにメトリクスを既定で表示する Lambda 関数
    const lambdaFunction = new Function(this, "SampleLambda", {
      handler: "lambda-handler.handler",
      runtime: Runtime.PYTHON_3_11,
      code: new AssetCode(`./lambda`),
    });

    // ダッシュボード変数
    const variables = new cw.DashboardVariable({
      id: "functionName",
      type: cw.VariableType.PROPERTY,
      label: "Function",
      inputType: cw.VariableInputType.SELECT,
      value: "FunctionName",
      values: cw.Values.fromSearchComponents({
        namespace: "AWS/Lambda",
        dimensions: ["FunctionName"],
        metricName: "Duration",
        populateFrom: "FunctionName",
      }),
      defaultValue: cw.DefaultValue.FIRST,
      visible: true,
    });

    // ダッシュボード
    const dashboard = new Dashboard(this, "SampleLambdaDashboard", {
      dashboardName: "myLambdaDashboard",
      variables: [variables],
    });

    // テキストウィジェット
    dashboard.addWidgets(
      new TextWidget({
        markdown: `# Dashboard: ${lambdaFunction.functionName}`,
        height: 1,
        width: 24,
      })
    );

    // Invocations, Errors, Duration, Throttles のグラフウィジェット
    dashboard.addWidgets(
      new GraphWidget({
        title: "Invocations",
        left: [lambdaFunction.metricInvocations()],
        width: 24,
      })
    );
    dashboard.addWidgets(
      new GraphWidget({
        title: "Errors",
        left: [lambdaFunction.metricErrors()],
        width: 24,
      })
    );
    dashboard.addWidgets(
      new GraphWidget({
        title: "Duration",
        left: [lambdaFunction.metricDuration()],
        width: 24,
      })
    );
    dashboard.addWidgets(
      new GraphWidget({
        title: "Throttles",
        left: [lambdaFunction.metricThrottles()],
        width: 24,
      })
    );

    // ログクエリウィジェット
    dashboard.addWidgets(
      new LogQueryWidget({
        logGroupNames: [lambdaFunction.logGroup.logGroupName],
        queryLines: [
          "fields @timestamp, @message",
          "sort @timestamp desc",
          "limit 20",
        ],
        width: 24,
      })
    );
  }
}
  • DashboardVariableクラスで作成した変数を、Dashboardクラスのvariablesプロパティに指定することにより、ダッシュボードで変数を使用することができるようになります。
    • typeプロパティでは、プロパティ変数(PROPERTY)またはパターン変数(PATTERN)を指定できます。
    • valueプロパティでは、変数の変更により置き換えをしたいダッシュボード上の文字列を指定します。
    • valuesプロパティでは、変数の選択肢を指定できます。今回はfromSearchComponentsを使って Lambda 関数のメトリクス一覧を動的に取得するようにしています。

スタックをデプロイします。

cdk deploy

動作確認

作成されたダッシュボードを確認すると、変数のウィジェットが表示され、選択中の Lambda 関数のメトリクスが下部のグラフウィジェットに表示されています。

ドロップダウンリストで選択を変更できるようになっています。

変更すると、グラフウィジェットの表示が別の Lambda 関数のメトリクスのものに変わりました。良さそうですね。

注意点として、テキストウィジェットやログクエリウィジェットは、グラフウィジェットと異なりダッシュボード変数により表示を切り替えることができません。CDK コード上で指定した値が固定で表示されます。

おわりに

AWS CDK で Amazon CloudWatch dashboards のダッシュボード変数がサポートされたので試してみました。

リソースごとのメトリクスを表示するダッシュボードを参照したい場合に、ダッシュボード変数を使うことで、複数のダッシュボードを作成する手間を省くことができそうです。

以上