AWS CDKでAPI Gatewayのエラー発生率のCloudWatch Dashboardをつくってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、アノテーション の中野です。

さて、以前のエントリで、4XX/5XX系のエラーをCloudWatch Dashboardに表示するCDKのコードをご紹介しました。

本エントリでは、その続きとして、4XX/5XX系のエラー発生率を表示するCDKのコードのご紹介をします。   注意点として、今回のエントリでは前回作成したコードをそのまま利用して、エラー発生率をダッシュボードへ追加する部分のみをご説明します。
それ以外の箇所のコードを確認したい方は、前回のエントリを参照してください。

環境情報

  • node 16.17.1
  • npm 8.19.2
  • typescript 4.8.4
  • aws-cdk 2.49.1
  • aws-cdk-lib 2.49.1
  • constructs 10.1.146
  • aws-lambda 1.0.7

完成形 ダッシュボード

表示する完成形のダッシュボードです。

CDK ソースコード

コード全体

すぐコード読んで動かしたいという方向けです。
前回投稿したエントリのコードに追記するような形で、実装しています。
自身の環境へクローンして試してみてください。

今回のエントリで作成した差分のみ見たい方は、以下のPRをご覧ください。

CloudWatch Dashboard スタック

エラー率の計算式

エラー率の計算式は以下を利用します。

(4XX系のエラー率) = (API Gatewayの4XXのメトリクス値) / (API GatewayのCountのメトリクス値) × 100
(5XX系のエラー率) = (API Gatewayの5XXのメトリクス値) / (API GatewayのCountのメトリクス値) × 100

計算式としては、単純にAPI Gatewayのエラーの数をリクエスト総数で割ったものを利用します。
例えば、特定の期間に10000リクエストがあって、そのうち100回の5XXエラーが発生した場合は、発生率としては1%になる概算です。

エラー率の数値ウィジェット

数値ウィジェットにてMetric Mathを利用することで、特定の計算式の結果をウィジェットに表示することが可能です。
Metric Mathの使い方などは以下のエントリを参照ください。

では、数値ウィジェットの設定のコードを記載します。

lib/aws-cdk-cloudwatch-dashboard.ts

const single4XXErrorRateWidget = new SingleValueWidget({
            title: 'APIGW 4XX Error Rate',
            height: 4,
            width: 12,
            fullPrecision: true,
            setPeriodToTimeRange: true,
            metrics: [
                new MathExpression({
                    label: '4XXエラー発生率(%)',
                    expression: 'e1/e2*100',
                    usingMetrics: {
                        e1: new Metric({
                            namespace: 'AWS/ApiGateway',
                            metricName: '4XXError',
                            dimensionsMap: {
                                Stage: stageName,
                                ApiName: apiName,
                            },
                            statistic: 'Sum',
                        }),
                        e2: new Metric({
                            namespace: 'AWS/ApiGateway',
                            metricName: 'Count',
                            dimensionsMap: {
                                Stage: stageName,
                                ApiName: apiName,
                            },
                            statistic: 'Sum',
                        }),
                    },
                }),
            ],
        })

ーーー 中略 ーーー

const single5XXErrorRateWidget = new SingleValueWidget({
            title: 'APIGW 5XX Error Rate',
            height: 4,
            width: 12,
            fullPrecision: true,
            setPeriodToTimeRange: true,
            metrics: [
                new MathExpression({
                    label: '5XXエラー発生率(%)',
                    expression: 'e1/e2*100',
                    usingMetrics: {
                        e1: new Metric({
                            namespace: 'AWS/ApiGateway',
                            metricName: '5XXError',
                            dimensionsMap: {
                                Stage: stageName,
                                ApiName: apiName,
                            },
                            statistic: 'Sum',
                        }),
                        e2: new Metric({
                            namespace: 'AWS/ApiGateway',
                            metricName: 'Count',
                            dimensionsMap: {
                                Stage: stageName,
                                ApiName: apiName,
                            },
                            statistic: 'Sum',
                        }),
                    },
                }),
            ],
        })

上記の、10行と46行の部分でexpressionを利用しています。
expressionは、複数メトリクスを組み合わせた計算式を定義できます。
ここでは、e1/e2*100 としています(API Gatewayのエラーの数をリクエスト総数で割る)

定義したエラー率の数値ウィジェットの変数をダッシュボードに追加します。
9,10行のwidgetsの配列に追加しました。

lib/aws-cdk-cloudwatch-dashboard.ts

new cloudwatch.Dashboard(this, 'APIDashboard', {
            dashboardName: 'APIDashBoard',
            periodOverride: cloudwatch.PeriodOverride.AUTO,
            widgets: [
                [singleAPIRequestCountWidget],
                [
                    single4XXWidget,
                    single5XXWidget,
                    single4XXErrorRateWidget,
                    single5XXErrorRateWidget,
                ],
                [graph4XXWidget],
                [graph5XXWidget],
            ],
        })

小数点第2以下を表示する場合

少しだけ困った箇所としては、デフォルトの設定だと小数点第2以下の数値が丸められて表示されてしまうところでした。

Stack Overflowで調査してみたところ、CloudWatchのマネージメントコンソール上の数値ウィジェットのオプションから設定できるとのことでした。

実際にコンソールを確認すると、以下の設定値を見つけました。

では、CDKではどうするんだと思い、CDK公式のドキュメントを調査しました。

CDKだと、fullPrecisiontrueにすることで小数点第2以下を表示することができるみたいです。

fullPrecision
Type: boolean (optional, default: false)
Whether to show as many digits as can fit, before rounding.

以下の5行目に、fullPrecisionを追加しました。

lib/aws-cdk-cloudwatch-dashboard.ts

const single4XXErrorRateWidget = new SingleValueWidget({
            title: 'APIGW 4XX Error Rate',
            height: 4,
            width: 12,
            fullPrecision: true,
            setPeriodToTimeRange: true,
            metrics: [
                new MathExpression({
                    label: '4XXエラー発生率(%)',

--- 以下省略 ---

デプロイ

それでは、ビルドして AWS環境へデプロイします。

$ npm run build
$ npm run test
$ cdk deploy --all

作成されたエンドポイントに対してリクエストを送って、CloudWatch Dashboardが変化するか確認してみましょう。

さいごに

APIのエラー率について、気になる方が結構いるのではないでしょうか。
また、今回のブログと同様の方法で、GoogleのSREが提唱しているSLI、SLO、エラーバジェットをCloudWatch Dashboardに表示させることもできるかと思います。
参考にしてみてはいかがでしょうか。

参考情報

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。