CloudWatchアラームをSlackに通知する方法:ステップバイステップガイド
![CloudWatch-lambda](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Blogアイキャッチ画像-1.png?resize=1280%2C720&ssl=1)
今さらながら、CloudWatchのアラームをSlackに連携する手順を記載します。
今回は、AWSのアプリケーションロードバランサーの「UnHealthyHostCount」 が1以上のときにSlackに通知されるようにします。具体的にはロードバランサー配下にEC2が2台配置されており、そのEC2のどちらかがエラーでアクセス出来ない場合にその状態を検知するイメージです。
Slackへ連携する方法としては、「AWS Chatbot」を使用する方法と「AWS Lambda」を使用する方法がありますが、今回は「AWS Lambda」を使用してみます。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image.png?resize=825%2C73&ssl=1)
AWS CloudWatchアラームをSNSトピック経由でLambda関数に連携し、Lambda関数がSlackのWebhookに通知を送信することで、リアルタイムでアラートを受信します。
AWS SNSのトピックを作成
SNS(Simple Notification Service) でトピックの新規作成をします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-7.png?resize=686%2C396&ssl=1)
a.トピックの作成をします。
- タイプで[スタンダード]を選択する。
- 名前を記入する。
- 表示名を記入する。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-6.png?resize=1024%2C547&ssl=1)
[トピックの作成]をクリックし、トピックの作成が一旦完了です。
CloudWatchアラームの設定
CloudWatchで新しいアラームを作成し、作成したSNSトピックを通知先として設定します。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-7.png?resize=801%2C155&ssl=1)
CloudWatchでアラームの新規作成をします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-1.png?resize=1024%2C142&ssl=1)
ステップ1:メトリクスと条件の指定
メトリクスと条件の指定で [メトリクスの選択] をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-2.png?resize=1024%2C308&ssl=1)
メトリクスで「UnHealthyHostCount」を検索し、[ApplicationELB > AppELB 別、TG 別メトリクス] をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-3.png?resize=1024%2C458&ssl=1)
引き続き、メトリクスと条件の指定を行います。
- 名前空間は「AWS/ApplicationELB」が設定される。
- メトリクス名を入力する。
- TargetGroupを選択する。
- LoadBalancerを選択する。
- 統計は「最大」を選択する。
- 期間は「1分」を選択する。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-4.png?resize=843%2C669&ssl=1)
条件を設定します。
- しきい値の種類は「静的」を選択する。
- UnHealthyHostCount が次の時…は「以上」を選択する。
- …よりも「1」を入力する。
[次へ]をクリックします。
![条件](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-9.png?resize=830%2C563&ssl=1)
ステップ2:アクションの設定
通知を設定します。
- アラーム状態トリガーは「アラーム状態」を選択する。
- 次のSNSトピックに通知を送信は「既存のSNSトピックを選択」を選択する。
- 通知の送信先を選択する。(先ほど作成したSNSトピック)
[次へ]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-10.png?resize=839%2C645&ssl=1)
ステップ3:名前と説明を追加
名前と説明を設定します。
- アラーム名を入力する。
[次へ]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-5.png?resize=1024%2C760&ssl=1)
ステップ4:プレビューと作成
プレビューを確認し、設定内容に問題無ければ、[アラームの作成]をクリックします。
SlackのIncoming Webhookの作成
Slackの「Incoming Webhooks」アプリをインストールし、Webhook URLを取得します。
Slackの[ ツールと設定 > アプリを管理する ]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-6.jpg?resize=841%2C1024&ssl=1)
Slack側の画面に遷移するので、[カスタムインテグレーション]を選択します。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-11.png?resize=1024%2C368&ssl=1)
[Incoming Webhook]を選択します。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-12.png?resize=1024%2C362&ssl=1)
[Salckに追加]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-13.jpg?resize=1024%2C533&ssl=1)
Slackチャンネルを選択し[Incoming Webhook インテグレーションの追加]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-14.jpg?resize=1024%2C822&ssl=1)
「Webhook URL」の確認をします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-15.jpg?resize=1024%2C710&ssl=1)
「Webhook URL」は、後ほどLambda関数で使用します。
Lambda関数の作成
AWS Lambda関数を作成し、SNSトピックからの通知を受信してSlack Webhookに送信するロジックを実装します。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-6.png?resize=693%2C131&ssl=1)
[関数の作成]をクリックします。
関数を作成します。
- 「一から作成」を選択する。
- 関数名を入力する。
- ランタイムは「Node.js 20.x」を選択する。
- アーキテクチャは「x86_64」を選択する。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-16.png?resize=845%2C742&ssl=1)
上記設定後、[関数の作成]をクリックします。
コードを書きます。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-17.png?resize=1014%2C752&ssl=1)
コードは下記で動きます。
※ /services/YOUR/SLACK/WEBHOOK
は「Webhook URL」で置き換えます。
import https from 'https';
export const handler = async (event) => {
const message = JSON.parse(event.Records[0].Sns.Message);
const postData = JSON.stringify({
text: `CloudWatch Alert: ${message.AlarmName}\n${message.NewStateReason}`
});
const options = {
hostname: 'hooks.slack.com',
path: '/services/YOUR/SLACK/WEBHOOK',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': postData.length
}
};
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
res.on('data', (d) => process.stdout.write(d));
res.on('end', resolve);
});
req.on('error', (e) => reject(e));
req.write(postData);
req.end();
});
};
Lambdaのテストイベント作成
ここまでの設定が正しいかどうか、テストイベントを作成して動作確認します。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/image-8.png?resize=1024%2C369&ssl=1)
テストを作成します。
- イベントアクションをテストで「新しいイベントを作成」を選択する。
- イベント名を入力する。
- イベント共有の設定は「プライベート」を選択する。
- イベントJSONの内容は下記に記します。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-18.png?resize=843%2C958&ssl=1)
下記がテストイベント用JSONです。
{
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:us-west-2:123456789012:example-topic",
"Sns": {
"Type": "Notification",
"MessageId": "11112222-3333-4444-5555-666677778888",
"TopicArn": "arn:aws:sns:us-west-2:123456789012:example-topic",
"Subject": "Test SNS Notification",
"Message": "{\"AlarmName\":\"ExampleAlarm\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 datapoint (5.0) was greater than or equal to the threshold (5.0).\"}",
"Timestamp": "2024-05-23T12:34:56.789Z",
"SignatureVersion": "1",
"Signature": "EXAMPLE",
"SigningCertUrl": "EXAMPLE",
"UnsubscribeUrl": "EXAMPLE",
"MessageAttributes": {
"key": {
"Type": "String",
"Value": "value"
}
}
}
}
]
}
上記で保存し、テスト実行すると、下記のようにSlackに通知されました。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-19.png?resize=1024%2C91&ssl=1)
SNSトピックをトリガーとしてLambda関数に追加
作成済のSNS「UnHealthyHostCount」にサブスクリプションを作成しするため[サブスクリプションの作成]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-20.png?resize=1024%2C438&ssl=1)
サブスクリプションを作成します。
詳細
- トピックARNは既存のSNSのものが設定する。
- プロトコルで[AWS Lambda]を選択する。
- エンドポイントは先ほど作成した関数のARNを入力する。
上記を設定し、[サブスクリプションの作成]をクリックします。
![](https://i0.wp.com/owani.net/wp-content/uploads/2024/05/Untitled-21.png?resize=1024%2C738&ssl=1)
以上で設定完了です。