ぽっちゃすぶろぐ

かまってちゃんの繰り広げる壮大で心温まる人生の冒険記

CloudWatchを使ってec2インスタンスの状況に合わせてSlackに通知する

今日も1日がんばるぞい。先日AWS Cloud9を使ってみて、「自動停止便利だなぁ」て思ったところまではよかったんですけど、心配性なんで「あれ、30分すぎたけど本当に止まったのかな」って心配になってしまうわけです。ということでec2インスタンスの起動・停止を検知したらSlackとかメールに通知を出せるようにしてみようというお話。

 やりたいこと

EC2インスタンスのステータスに変化(起動・停止)があったら通知をSlackに通知を出す。

CloudWatchを使ってec2の起動・停止を検知したらlambdaが呼び出されてslackに通知が投稿されるという感じで行きたい。ゆくゆくは、IDE(AWS Cloud9)のインスタンスが停止したら、RDSとか開発に使っているほかのインスタンスも自動で停止できるようにしたいなという思惑。

使ったもの

・CloudWatch
・AWS Lambda
・Slack Incoming-Webhook
・AWS Cloud9

Slackの設定

Slack側でメッセージを受け取る用意をしておく。

Incoming-Webhookの作成

Webhookを使ってメッセージを受け取るので設定しておきます。

左側のメニューからAppディレクトリにいって「incomingwebhook」を検索。僕の環境(日本語だと)だと「着信 Webhook」って名前になってました。

名前、説明などをお好みで設定。画像をコートニーちゃんにしてモチベーションの増加を測ります。

後ほどつかうので「Webhook URL」をメモっておきましょう。

Lambda関数の作成

Lambda関数を作成しておきます。AWS Cloud9でLambda関数も作成できるのでそっちで作ってみます。

右側にあるAWS Resourcesを選択。lambdaマークを選択して新規作成しましょう。

f:id:rokusasu2001:20180301180420p:plain
lambdaではblueprintなるテンプレートから関数を作成することも可能です。Python3.6を選択してempty-pythonを選択して自分で書くこととします。というか「clowdwatch-alarm-to-slack」ってあるから最初からそれ使えよ感。

f:id:rokusasu2001:20180301180521p:plain

triggerfunctionは「none」にしました。

f:id:rokusasu2001:20180301180640p:plain
あとは、実際にlambda関数の中身を書いて行きましょう。
今回は以下のようになりました。(多少ガバガバかもしれません。とりあえず動きました)

import urllib

def lambda_handler(event, context):
    endpoint = "自分のWebhook URLをここにペースト"
    # ec2のステータスを取得する
    ec2state = event['detail']['state']
    # ec2のステータスに合わせてメッセージ内容を変更する
    if ec2state == "stopped":
        parameter = urllib.parse.urlencode({"payload": {"text": "ec2インスタンスが停止されたよ:heart:" }})
    else:
        parameter = urllib.parse.urlencode({"payload": {"text": "ec2インスタンスが起動したよ:heart:" }})
    
    param = parameter.encode("utf-8")    
    function = urllib.request.urlopen(endpoint, param)
    print(function.read())
    
    return

あとはCloud9の方で保存したあとに「↑」マークを押すとlambda関数がデプロイされます。(「↓」はRemoteの関数をダウンロードできます。)

CloudWatchの設定

CloudWatchでルールを作成します。

f:id:rokusasu2001:20180301181707p:plain

あとは、ターゲットで先ほどデプロイしたlambda関数を指定します。これでいけるはず。

無事に動いたら・・・

試したいときはEC2のメニューからAWS Cloud9を配置したインスタンスを起動・停止すると通知がきます。(CloudWatchのログから動作ログやエラーログを確認できます)

f:id:rokusasu2001:20180301192940p:plain

無事にSlackに通知が届きました。(画像はコートニー・イートンちゃんです。画像を好きな女の子にすることで癒しを得ることができます)

まとめ

同じ容量で、インスタンスのCPU使用率が上がったら通知を出すとか色々できそうですね。

続き

pottyasublog.hatenablog.jp

参考にしたもの

お世話になりました。ありがとうございます。

qiita.com

qiita.com