今回はCDKで、CloudWatchの任意のメトリクスの閾値を超えた場合にSlackに自動通知するような仕組みの構築方法について紹介していきます。
AWS
におけるアプリケーションの状態監視といえばCloudWatch
ですが、そこから更に「特定の閾値を超えた場合に◯◯する」といったような設定をすることができます。
所謂CloudWatch
のアラーム機能です。
今回はアラームを起点に、SNS
のトピックへの通知を行い、さらにそこからChatbot
経由でSlack
に通知するまでの仕組みをCDK
で構築していきます。
CDK
なので大部分はコード化できるのですが、下記の手順についてはCDK
のコードの範疇では扱いません。
従って、下記については手動で行うようにしましょう。
Slack
通知用のワークスペースとチャンネルの作成
CDK
上で必要になってくるのはチャンネルのIDですので、どこかに控えておきましょうChatbot
クライアントの作成
Chatbot
を開き【チャットクライアント】を【Slack】で作成しますSlack
ワークスペースへの認証を求められます実際のコードは下記のようになります。
import * as cdk from 'aws-cdk-lib';
import * as sns from "aws-cdk-lib/aws-sns";
import * as chatbot from 'aws-cdk-lib/aws-chatbot';
import * as apigaetway from 'aws-cdk-lib/aws-apigateway';
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
import * as cwActions from 'aws-cdk-lib/aws-cloudwatch-actions';
export class HogeStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 事前に作成したAPI Gatewayの参照
let api: apigaetway.RestApi;
const slackWorkspaceId = '【ワークスペースID】';
const slackChannelId = '【SlackのチャンネルID】'
// SNSのトピックを作成する
const errorTopic = new sns.Topic(this, `ErrorTopic`, {
displayName: `ErrorTopic`,
topicName: `ErrorTopic`
});
// Chatbot設定の作成
const cb = new chatbot.SlackChannelConfiguration(this, `SlackChannelConfiguration`, {
// 設定名
slackChannelConfigurationName: `SlackChannelConfiguration`,
// ワークスペースID
slackWorkspaceId: slackWorkspaceId,
// チャンネルID
slackChannelId: slackChannelId,
// 紐づけるSNSトピック一覧
notificationTopics: [errorTopic]
});
// CloudWatchのアラームを作成
const apiServerErrorAlarm = new cloudwatch.Alarm(this, `ApiServerErrorAlarm`, {
// 閾値
threshold: 5,
// 計測点(5分に1回)
evaluationPeriods: 1,
// メトリクス(ここではAPIの5XXエラーの回数を指定)
metric: api.metricServerError(),
});
// アラームの条件を満たした場合のアクション設定(SNSトピックへの通知を行うよう設定)
apiServerErrorAlarm.addAlarmAction(new cwActions.SnsAction(errorTopic));
}
}
コメントに書いてある通りですが、流れとして「アラームの条件を満たす」→「トピックへの通知が行われる」→「チャットボットからSlackに通知がいく」というものになります。
今回はCDK
を使ってAPI Gateway
のサーバエラーメトリクスをCloudWatch
のアラームとして指定し、それを満たした場合にSNS
とChatbot
を経由して最終的にSlack
に通知される仕組みの構築を紹介しました。
本来はここにEC2
やRDS
などのメトリクスも絡めた状態監視を行っていくかと思います。
ただ、全体的な宣言は今回の内容のもので殆どなので今回は割愛します。
今回の内容が役立ちましたら、幸いです。