🏸

AWSモニタリング ダッシュボードをCDK5行で作成する

2023/04/16に公開

追記

時代はcdk-monitoring-constructsのようです

intro

AWSでシステム構築をしたとき、cloudwatchでダッシュボードを作られることがあるかと思います。(DataDogとか高いし..)

無料なのでとっつきやすいですが、「結構作るのがめんどくさいなぁ」と思われるかたもいらっしゃるのではないでしょうか。

そんなあなたに、CDKで一瞬でそれっぽいダッシュボードを作成できるcdk-watchfulのご紹介です。

cdk-watchful

lambdaやRDSについて、以下のようなモニタリングダッシュボードを一瞬で作ってくれます
ダッシュボード
アラーム基準など設定できるのはもちろん、AWS SNSを用いたアラーム通知メール送信もついでに作ってくれます。すごい!

使い方

install

CDKでインフラ記述を行っているプロジェクトで、追加でcdk-watchfulをインストールしましょう

npm install --save-dev cdk-watchful

watchfulの作成

コード例として、S3とLambda関数の監視を行うダッシュボード + アラーム通知メール送信機能を作成します。

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Watchful } from 'cdk-watchful';

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

    const myFunction = new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.NODEJS_16_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda'),
    });

    // watchfulコンストラクタを呼び出す
    const watchful = new Watchful(this, 'MyWatchful', {
      // アラームメールの通知先
      alarmEmail: 'your-email@example.com',
      dashboard: true
    });

    // lambdaをwatchfulモニタリング対象に追加
    watchful.watchLambdaFunction('MyFunction', myFunction);
  }
}

たったこれだけで、以下の項目をモニタリングするダッシュボードを作成してくれます。

  • 呼び出し数
  • エラー数 (アラーム付き)
  • スロットル数 (アラーム付き)
  • 呼び出し時間 (アラーム付き)

また、アラーム発生時にはyour-email@example.com宛のSNSメッセージも飛んできます。
あまりにも簡単ですね!
今回は割愛しますが、アラーム条件の修正やカスタムアラームの作成ももちろん可能です。

カスタム通知

デフォルトではメール通知を行ってくれましたが、別途SNSトピック及び通知先を作成することで、お好みのアラーム通知を行うことが可能です。
例として、TeamsのIncoming Webhook宛の通知を行うようにしてみましょう。
構成図は以下のとおりです

まずはSNSメッセージをTeams宛にpostするlambdaを用意します。

import type { SNSEvent } from 'aws-lambda'
import axios from 'axios'

export const handler = async (event: SNSEvent): Promise<void> => {
  console.log(event.Records)
  try {
    const snsMessage = { text: event.Records[0].Sns.Message }
    // 受け取ったメッセージをそのまま転送
    await axios.post(process.env.TEAMS_WEBHOOK_ENDPOINT as string, snsMessage)
  } catch (error) {
    console.error(error)
  }
}

続いてCDKのコードはこちら

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Watchful } from 'cdk-watchful';

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

    // 先程と同様
    const myFunction = ... 
    
    const teamsEndpoint = process.env.TEAMS_WEBHOOK_ENDPOINT ?? ''
    const topic = new sns.Topic(this, 'topic')
    const alarmHandler = new nodeLambda.NodejsFunction(this, 'alarmHandler', {
      runtime: Runtime.NODEJS_16_X,
      entry: path.join(__dirname, `./lambda/webhook/alarm/index.ts`),
      handler: 'index.handler',
      environment: {
        TEAMS_WEBHOOK_ENDPOINT: teamsEndpoint
      }
    })
    alarmHandler.addToRolePolicy(
      new PolicyStatement({
        effect: Effect.ALLOW,
        actions: ['iam:ListAccountAliases'],
        resources: ['*']
      })
    )
    // alarmHandlerの呼び出し元としてSNSトピックを指定
    alarmHandler.addEventSource(new SnsEventSource(topic))

    // watchfulコンストラクタを呼び出す
    const watchful = new Watchful(this, 'MyWatchful', {
      // 自作のSNSトピックをアラーム時の呼び出し先として指定
      alarmSns: topic,
      dashboard: true
    });

    // lambdaをwatchfulモニタリング対象に追加
    watchful.watchLambdaFunction('MyFunction', myFunction);
  }
}

これで、アラーム時にTeams宛に通知が飛ぶようになりました。
SNSメッセージを元にいい感じのアラームカードを送信したい場合、Teamsを叩くlambda内でよしなにpostするメッセージをカスタムしてあげて下さい。

対応リソース

現在、watchfulでモニタリング設定可能なリソースは以下の通りです。

  • lambda
  • DynamoDB
  • ApiGateway (REST API)
  • StepFunctions
  • RDS (Aurora)
  • ECS on EC2 / Fargate

他のリソースも気になるあなた、contributeチャンスですよ

終わりに

ということで、一瞬でcloudwatch ダッシュボード及びアラーム通知環境を作成してくれるcdk-watchfulのご紹介でした。
取り急ぎでアラーム監視をしないといけないあなた、ぜひ活用してみて下さい。

Discussion