LambdaのBlueprintを使って、CloudWatchのアラームをSlackに投稿

記事タイトルとURLをコピーする

 こんにちは。運用2課の坂本(@t_sakam)です。  運用しているEC2のCPU使用率をAWS マネジメントコンソールに入らずに、「Slackで簡単に確認できるといいなぁ」と思っていたところ、「Lambda」の「Blueprint」にいいものがありました。  Blueprintは日本語で「青写真」。計画や設計図、という意味で使われています。LambdaのBlueprintは、「イベントソース※1」の設定と「Lambda Functionのコードのテンプレート」の2つがセットになったものです。このセットを使うことで、AWSの他のサービスとの連携を一から考えたり、コードを一から書かなくて済みます。Lambdaを使ったベストプラクティスがせっかくデフォルトで用意されているので、今回のようにやりたいことが既にBlueprintにある場合は、使わない手はありません。    ※1 Lambda Functionの呼び出しを発生させるイベント    今回は、「cloudwatch-alarm-to-slack」というBlueprintを使って、CloudWatchのアラームをSlackに投稿させたいと思います。  

  1. 「cloudwatch-alarm-to-slack」の処理の流れ
  2. 手順
  3. まとめ

1. 「cloudwatch-alarm-to-slack」の処理の流れ

 まずは、今回使うBlueprint、「cloudwatch-alarm-to-slack」の処理の流れを見てみましょう。  

CloudWatchのアラームの通知先をSNSにし、そのSNSをトリガーにLambda Functionをキック、Slackに投稿、という流れになっています。  

2. 手順

1. 作業のおおまかな流れ

 今回のおおまかな作業手順です。  

  1. SNSでトピックを作成
  2. CloudWatchでアラームを作成
  3. Slack APIの「Incoming WebHooks」の設定
  4. IAMのKMSで暗号キーを作成
  5. AWS CLIで「Webhook URL」 を暗号キーを使って暗号化
  6. Lambdaの設定(設定中に新しいロールを作成)
  7. 作成したロールにポリシーを追加

それでは、上記の流れのとおりにひとつずつ設定していきましょう。  

1. SNSでトピックを作成

 最初に、SNSでトピックを作成します。マネジメントコンソールの「SNS」のページで「Create Topic」を選択します。  

 次のページの「Topic name」に任意のトピック名(今回は、「topic-slack-cpu50」)を入れて、トピックを作成します。このトピックはCloudWatchとLambdaをつなぐだけのものなので、何も設定せずトピックを作成するだけで完了です。  

2. CloudWatchでアラームを作成

 次に、Slackに投稿したいEC2のCPU使用率のアラームをCloudWatchで作成します。アラーム名やCPU使用率のしきい値などを設定します。  

「アクション」の設定の「通知の送信先」で最初に作成したSNSのトピック、「topic-slack-cpu50」を選択してアラームを作成します。    

3. Slack APIの「Incoming WebHooks」の設定

 次は、Slackの設定です。ブラウザで「https://(your-team-domain).slack.com/services/new」に移動し、「Incoming WebHooks」を検索/選択します。  

画面遷移にしたがって設定をしていくと、投稿したいチャンネルを選択するページがでてくるので、今回は「#bot」チャンネルを選択して進みます。  

 設定の最後のページで「Webhook URL」 が表示されます。あとで必要になるので、これをコピーして控えておきましょう。  

 最後に投稿時に使う名前やアイコンを設定して、Slackの設定は完了です。    

4. IAMのKMSで暗号キーを作成

 次は、IAMのKMSで暗号キーを作成します。マネジメントコンソールの「IAM」のページの左メニューで「暗号キー」を選択します。使いたいリージョンでフィルターをかけ、暗号キーの作成をおこないます。  

 キーの「エイリアス名」を決めて入力します。入力したキーの「エイリアス名」もあとで使うので、これも控えておきましょう。    

5. AWS CLIで「Webhook URL」 を暗号キーを使って暗号化

 AWS CLIで「Webhook URL」 を先ほど作成した暗号キーで暗号化します。ここで、いままでの手順で控えていた「Webhook URL」 とキーの「エイリアス名」が必要になります。  

aws kms encrypt --key-id alias/alarm-to-slack --plaintext "hooks.slack.com/services/T0295XXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX"
CiCnQYHaorF2blLDoJtlPk40++Z7CZlYtfhq5Jti0hIhIxLQAQEBAgB4p0GB2qKxdm5Sw6CbZT5ONPvmewmZWLX4auSbYtISISMAAACnMIGkBgkqhkiG9w0BBwaggZYwgZMCAQAwgY0GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6YaOAl/IPhc24CeCAgEQgGAyQq7VCI0sEaGc517F93YWuC0FLdPqMUUVNQEkaS8RaRuPpmzXnKOKLRmknf/ZxeUQp7g4KwNtSe2/BxsoE35xDYpaNgsVinrqT7QvDZfeasLFca9VjSCOGOhEDpP93hg=    arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:key/XXXXXXXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX

 コマンドをたたくと、「暗号化されたWebhook URL」と「ARN」が出力されます。2つともあとで必要になるので、控えておきます。  

6. Lambdaの設定

 マネジメントコンソールの「Lambda」のページのBlueprint選択画面で「cloudwatch-alarm-to-slack」を検索/選択します。今回、言語はPythonにしました。  

 イベントソースの設定ページでは、「イベントソースのタイプ」で既に「SNS」が選択されているのでそのままいじらずにしておきます。「SNSトピック」で最初に作成した「topic-slack-cpu50」を選択します。  

 Lambda Functionの設定ページで、既に用意されているコード上の「kmsEncyptedHookUrl」の箇所に「暗号化されたWebhook URL」を、「slackChannel」の箇所に「Slackのチャンネル名」をそれぞれ入力します。    

kmsEncyptedHookUrl
CiCnQYHaorF2blLDoJtlPk40++Z7CZlYtfhq5Jti0hIhIxLQAQEBAgB4p0GB2qKxdm5Sw6CbZT5ONPvmewmZWLX4auSbYtISISMAAACnMIGkBgkqhkiG9w0BBwaggZYwgZMCAQAwgY0GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6YaOAl/IPhc24CeCAgEQgGAyQq7VCI0sEaGc517F93YWuC0FLdPqMUUVNQEkaS8RaRuPpmzXnKOKLRmknf/ZxeUQp7g4KwNtSe2/BxsoE35xDYpaNgsVinrqT7QvDZfeasLFca9VjSCOGOhEDpP93hg=

 

slackChannel
#bot

 コードのコメントの中に、あとで使うことになるポリシーのサンプルがあるので、これも控えておきましょう。  

 そのままLambda Functionの設定ページで、新しいロールを作成します。プルダウンメニューで「*Basic execution role」を選択しましょう。「IAM」の設定ページに移動するので、デフォルトの設定のまま、新しいロールを作成します。  

 設定の最後のページでLambda Functionの有効化を聞かれるので、今回は、「Enable now」を選択して進めます。  ※設定後すぐにCloudWatchのアラームが発動しても次の手順で作成するポリシーを追加しないとSlackに投稿されません。  「Enable later」を選択した場合は、ポリシー追加後に「Lambda」のページに戻って、有効化してください。  

7. 作成したロールにポリシーを追加

 最後に、先ほどIAMで作成したロールにポリシーを追加します。  

 次のページで、「Policy Generator」か「カスタムポリシー」かを聞かれるので、「カスタムポリシー」を選択します。「暗号化されたWebhook URL」をKMSのARNで復号化するためのポリシーを追加します。ここで、控えていた「ポリシーのサンプル」と「ARN」を使います。  

 これで、CloudWatchのアラームをSlackに投稿することができます。    

3. まとめ

 LambdaのBlueprintを使って、CloudWatchのアラームをSlackに投稿することができました。今回は、BlueprintのLambda Functionのコードをといじることなく、変数に値を2つ入れただけで簡単にやりたいことが実現できました。    同じ手順でしきい値の違う設定を追加していけば、気になるEC2のCPU使用率がどのくらい上がったのかをSlackで確認できて便利かと思います。   ※イメージ画像    CloudWatchでアラームが設定できるものであればどれでも同じことができるので、ELBのRequestCountのアラームを設定して、リクエストがどれくらいきているかを確認するのもいいかもしれません。    今回は、使い方がいろいろ工夫できそうなLambdaのBlueprint、「cloudwatch-alarm-to-slack」をご紹介しました。簡単に設定できてとても便利ですので、みなさんもぜひ試してみてください!    いや〜、Lambdaって本当にいいものですね。