元パチ屋店員NWエンジニアの技術ブログ

元パチ屋店員NWエンジニアが技術のアウトプット化を目的に、好き勝手な事を書いてるブログです

CloudWatchアラームをLINEに投げてみた

f:id:hayato-ota-rf:20170909200621p:plain

AWS CloudWatchアラームをLINE Notifyを使用して、LINEに通知できる仕組みを構築してみました 

使用ツール

今回活躍してくれるツールはこの二つです

・LINE Notify
AWS Lambda

手順

①LINE Notifyの設定

1.https://notify-bot.line.me/ja/にアクセス、自分のLINEアカウントを使ってログインしてマイベージへGO!

f:id:hayato-ota-rf:20170904065258j:plain

2.トークンを発行するをクリック

f:id:hayato-ota-rf:20170904065301j:plain

3.トークン名、通知を送信するトークルームを指定し、発行するをクリック

グループにだって通知できちゃいます!

f:id:hayato-ota-rf:20170904065354j:plain

4.表示されたトークンを φ(・ω・ )かきかき

f:id:hayato-ota-rf:20170904065438j:plain

5.自分のLINEにトークン発行しましたとかなんとかっていう通知が届くはず

LINE Notifyを友達登録する必要あるかも

この記事を書いたのが一回検証し終えた後だったので、忘れました(笑)

SNSの設定

1.SNSコンソールの左ペインにあるTopicsをクリックし、Create new topicをクリック

f:id:hayato-ota-rf:20170904065457j:plain

2.Topic nameに適当な名前を入力し、Create topicをクリック

f:id:hayato-ota-rf:20170904065602j:plain

③CloudWatchの設定

1.CloudWatchコンソールの左ペインにあるアラームをクリックし、アラームの作成をクリック

f:id:hayato-ota-rf:20170904065616j:plain

2.好きなメトリクスを選択し、次へをクリック

ここではテスト用に作成したカスタムメトリクスを選択します

f:id:hayato-ota-rf:20170904065627j:plain

3.アクションの通知の送信先に②で作成したTopicsを指定

名前や判定条件はお好みで

f:id:hayato-ota-rf:20170904065638j:plain

④Lambdaの設定

Lambda関数作成のときって

・Lambdaのコンソールで直接コードを記述

・コードをローカル端末からアップロード

・コードをS3からアップロード

この三つがあるんですが、コードで外部モジュールを使っている場合はそれごとアップロードする必要があるので、↑の下二つの方法どちらかでする必要があります

今回私はPythonでコード書いているんですが、そのコードの中でHTTP POSTをするのにrequestsという外部モジュールを使っていた為、アップロードの方法を取ってます

④の手順は結構色々やり方あると思うので、私が紹介する手順はその中の一つになると思います

 

1.EC2上のLinuxサーバにログイン

 

2.作業用ディレクトリの作成

mkdir line_alarm

3.作業ディレクトリに移動

cd line_alarm

4.ライブラリのインストール

tオプションをつけることで、ライブラリのインストール場所を指定

今回はカレントディレクトリ(line_alarm)にインストール

pip install requests -t .

5.Lambda関数の作成

ファイル名は lambda_function.py

関数名は lambda_handler

ファイル名と関数名は後で使用するのでφ(・ω・ )かきかき

別にファイル名と関数名が、これでないといけない理由はないけど、Lambadaの設定する際に、ハンドラっていう項目の初期値と一致するから

この方が楽かも

vi lambda_function.py

#coding:UTF-8

import requests

 

def lambda_handler(event, context):

    url = "https://notify-api.line.me/api/notify"

    token = "CH9wwDm7N6zt2WooZoorKccgMT06rkdYbLVbduXCJ2D"

    message = "test"

    stickerPackageId = 2

    stickerId = 144

 

    headers = {"Authorization": "Bearer " + token}

    payload = {"message" : message , "stickerPackageId" : stickerPackageId, "stickerId" :stickerId}

    r = requests.post(url, headers = headers, data = payload)

変数補足

・url

→このままでオネシャス

・token

→①でメモったやつを代入

・message

→LINEで通知したいメッセージを代入

・stickerPackageId&stickerId

→LINEで通知したいスタンプを指定する番号を代入

番号はhttps://devdocs.line.me/files/sticker_list.pdfを参照

ちなみにstickerPackageId = 2 stickerId = 144だと↓のスタンプになる

f:id:hayato-ota-rf:20170904065653j:plain

6.zipで圧縮

zip コマンドを使ってline_alarm内のすべてのファイルを圧縮する

そう麻呂が大好きなzipです

zip -r LINE_Alarm.zip *

 f:id:hayato-ota-rf:20170904065701j:plain

7.zipファイルをS3にアップロード

AWS CLIを使ってアップロードを行うんですが、CLIの設定は省きます(´・ω・`)

aws s3 cp LINE_Alarm.zip s3://hayato-s3/ --acl public-read --profile=hayato

8.Lambdaコンソールの左ペインの関数をクリックし、Lambda関数の作成をクリック

f:id:hayato-ota-rf:20170904065722j:plain

9.Blank Functionを選択 

f:id:hayato-ota-rf:20170904070334j:plain

10.トリガーをSNSSNSトピックを②で作ったやつを指定、トリガーの有効化にチェックを入れ、次へをクリック

f:id:hayato-ota-rf:20170904065805j:plain

11.名前を適当に入力、ランタイムをPython 3.6にし、コードエントリタイプでアップロード方法を指定

なんか今回S3からのアップロードが上手く行かなかったので、ローカルからアップロードしました(笑)

f:id:hayato-ota-rf:20170904065816j:plain

12.ハンドラはデフォルトで、ロールをテンプレートから新しいロールを作成、ロール名を適当に入力し、次へをクリック

ちなみに④-5で作成した関数名とファイル名をハンドラと一致させる必要あります

f:id:hayato-ota-rf:20170904065831j:plain

13.関数の作成をクリック

f:id:hayato-ota-rf:20170904065843j:plain

⑤アラートテスト

1.Lambdaコンソールの左ペインの関数をクリックし、④で作成した関数を選択し、アクション→関数のテストをクリック

f:id:hayato-ota-rf:20170904065855j:plain

2.サンプルイベントテンプレートをSNSにし、保存してテストをクリック

コードが正しければ、自分のLINEに通知が届きます

f:id:hayato-ota-rf:20170904065911j:plain

f:id:hayato-ota-rf:20170904065927p:plain

3.③で作ったアラートが警告状態になった時に正常にLINEに通知されるか確認

このアラートで使っているカスタムメトリクスは既に作ってあったスクリプトを何回か叩くと、警告状態になるようにしてあります

アラートの状態が現在はデータ不足の状態

この状態ではLINEに通知は飛びませんf:id:hayato-ota-rf:20170904065953j:plain

スクリプト実行

f:id:hayato-ota-rf:20170904070019j:plain

アラートの状態が警告に変わったと同時にLINEに通知が届きました

f:id:hayato-ota-rf:20170904070035j:plain

f:id:hayato-ota-rf:20170904070042p:plain

検証結果

LINE Notifyは簡単にLINEに通知を送れるサービスですね

今回はCloudWatchのアラートを飛ばしましたが、いくらでも応用できそうですね

ちなみに私は、AWSの利用料金閾値オーバで通知が飛ぶようにしています

f:id:hayato-ota-rf:20170904070101p:plain

通知の内容に芸がないのは許してください

しかも通知内容に誤字あるし(笑)