こんにちは、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 のダッシュボード変数がサポートされたので試してみました。
リソースごとのメトリクスを表示するダッシュボードを参照したい場合に、ダッシュボード変数を使うことで、複数のダッシュボードを作成する手間を省くことができそうです。
以上