AWSモニタリング ダッシュボードをCDK5行で作成する
追記
時代は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