CloudWatchでEC2を監視してLambdaでslackに通知する。

こんにちは、久保田です。

今回はAWSのお話です。

先日、違うチームの先輩から「EC2を監視して、Lambdaからslackに通知したい」のような事を言われたので、
AdwaysのAWSマスターになりたい僕としては黙っていられず、さくっと作って見ました。

今回は主にCloudWatchのアラーム機能を活用します。
CloudWatchでは、EC2の状態を監視することができます。
アラームを設定すれば、例えばCPUの使用率が50%を超えたら通知する、なども設定可能です。
しかし直接Lambdaをキックすることはできないので、SNSをイベントフックにする必要があります。

なので、こんなフローになります。

環境

今回必要なものは以下の通りです。

  • EC2
  • CloudWatch
  • SNS
  • Lambda

SNSのトピック作成

まずSNSのトピックを作成します。
このSNSトピックから通知が飛ぶ形になります。

左メニューから、「Topics」を選択し、「Create New Topic」を押し、必要なデータを入力します。

そしてPublishをしておきます。

Lambda

次にLambdaを作成します。
最近pythonを覚えたので、pythonでLambdaを動かそうと思います。
今回はSlackへの通知はincoming webhookを利用しますので、チャンネルと連携してurlを取得しておいてください。

Lambdaを作るときに、TriggerをSNSに設定してください。

ここを設定しておかないと、SNSからLambdaを動かすことができません。

コードはこんな感じです。

import urllib

def lambda_handler(event, context):
url = 'incoming webhookから取得できるURL'
params = urllib.urlencode({"payload": {"text": "alert!!! cpu utilization isn't normal state"}})
f = urllib.urlopen(url, params)
print f.read()
return

slack-apiというモジュールもpythonにはあるそうですが、今回はincoming webhookですし、標準ライブラリで事足りるので、使いません。

SNSのSubscription作成

Lambdaをキックするように設定します。
ProtocolをLambdaにして、
Endpointを先ほど作ったLambdaにしておきます。

これでokです。
SNSがLambdaを動かしてくれます。

CloudWatch

次にCloudWatchのアラームの設定からします。(EC2は既にあるということを前提にします。)

CloudWatchを開くと、こんな感じになっていると思います。

左メニューの「メトリクス」を選択し、「EC2メトリクス」を選択します。
そうすると監視できるEC2のメトリクス一覧が出てくるので、監視したいEC2の監視したい項目を選択します。

今回はCPUの使用率を監視します。

必要なデータを入力します。
名前と閾値とアクションを設定します。
閾値はテストなので、適当に設定します。

重要なところは、左下の「アクション」です。
先ほど作ったSNSを設定してください。

(
※右下の間隔を1分にしてしまうと、アラームがデータが不足していますという状態になります。これはどうやら、デフォルトではEC2がデータを5分単位で送ってくるからのようです。
EC2の設定で、「詳細モニタリングを有効化」を設定すると1分間隔でも設定できるようです。
)

実行

これですべて設定完了です。
実行してみましょう!

EC2のCPUをいじめてみます。Rubyで書きました。
僕はテスト用にt2.microで動かしたので、このくらいでもCPU使用率が100%になります。

def fib(n)
return n if n == 0 || n == 1 || n ==2
return fib(n - 1) + fib(n - 2)
end

p fib(40)

そうすると、CloudWatchのアラームが動くタイミングで、、、(今回は5分に設定)

アラートが来ました。

完成です!

簡単にできるので、ぜひ導入してみてください。
以上です!