こんにちは、久保田です。
今回は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分に設定)
アラートが来ました。
完成です!
簡単にできるので、ぜひ導入してみてください。
以上です!