2017年2月6日月曜日

【技術メモ】AWS CloudWatch から Hipchat に Alarm を送信する方法

サーバー運用っていいですよね。

AutoScaling でポチポチっとインスタンス増やしておけば Application Load Balancer に組み込まれて ECS Cluster が指示通り Conteiner を動かしてくれる。いやぁ、いい世の中になりました。

さて。

AWS でサーバーを運営していると当然の如く直面するのは、設定でも構築でも CloudFormation の JSON が読みづらいことでもなく、監視なわけですよ。
AWS 関係ないですけど。大体どのサーバーも一緒ですけど。いや、なんていうか CloudFormation あれは別なエクストリームAWSですけど。

で、今回たまたま環境が Hipchat 「も」あったということで CloudWatch の Alarm を Hipchat に送って監視のトリガーにしてみました。

運用としては正直インスタントすぎるのであくまでも例として。

今回やることは
  • SNS Topic に送った CloudWatch の Alarm を
  • Lambda 経由で
  • Hipchat に送る
です。

Outline
  1. AWS CloudWatch の Alarm を受け取る AWS SNS を作る
    1-1. AWS CloudWatch から Alarm を送信する時の流れ
    1-2. AWS SNS で Topic を作る
  2. AWS Lambda から Hipchat にメッセージを送る
    2-1. SNS が Hipchat にメッセージを送信する仕組み
    2-2. Hipchat にメッセージを送る Python の説明
    2-3. Lambda の設定
  3. SNS Topic に Lambda Fuction を 設定
    3-1. SNS Topic の Subscription 先に Lambda を指定
    3-2. Sucscription の設定
  4. AWS Lambda が便利になっていて CI とかやりやすくなった的な小話

1. AWS CloudWatch の Alarm を受け取る AWS SNS を作る

1-1. AWS CloudWatch から Alarm を送信する時の流れ

CloudWatch には各サーバーから送られてきた Metrics (サーバーの状態)を持っています。
CloudWatch の Alarm は、この Metrics に条件を設定してそれが成立した場合に、指定した AWS SNS にメッセージを送信します。

1-2. AWS SNS で Topic を作る

CloudWatch の Alarm に設定する SNS の Topic を作成します。Topic Name は適当かつ適切に名付けます。



この段階ではまだ設定できる Lambda Function が無いので SNS Subscription は作成しません。

命名の制約等は SNS の公式を確認してください。
Amazon Simple Notification Service ドキュメント

2. AWS Lambda から Hipchat にメッセージを送る

2-1. SNS が Hipchat にメッセージを送信する仕組み

SNS から Hipchat にメッセージを送るには SNS が Lambda を起動し、その中から Hipchat に送信します。

2-2. Hipchat にメッセージを送る Python の説明

ソースコードは公開しています。

ビルドの仕方とか使い方は README.md をご覧ください。
AWS SNS で受け取った Topic を AWS Lambda 経由で HipChat に送る例

今回は Python 2.x で作っています。Lambda 側の制約です。

コードの流れとしては
  • 環境変数の読み込み
  • メッセージの作成
  • 送信
という非常にシンプルなものです。

Hipchat の認証は予め取得していた Authentication Key を Header に渡すだけです。
呼び出す Hipchat API の Request Header に格納して Request を Post します。

まずこんな感じの Header と Payload を作る function を作っておいて...
必要な情報とかメッセージ本体の形を整えたら...
こんな感じで送信します。

ここまでのコードの中で os.ennviron で環境変数を引っ張ってきていることに気付いた方はさすがです。

2-3. Lambda の設定

新しい Lambda を作成します。

Build した後の 外部ライブラリを同梱した zip を upload するので Blank とかで問題ないです。
Build 方法は README.md をご覧ください。


トリガーの設定では 1-2. で作った Topic を指定してください。 この段階でトリガーを有効にしてもいいですし、後から有効にしてもいいです。ここはお好みで。


zip の upload 後、環境変数を設定します。

この Function で必要な環境変数は
  • SENDER_NAME --- 送信者の名前。適当にサービス名とか。
  • AUTH_TOKEN --- Hipchat API V2 の Authentication。間違ってソースに公開しないように。
  • ROOM_ID --- 発言したいルームのID。
の3つです。

Handler の設定はデフォルトの lambda_function.lambda_handler から変更しないでください。変更する場合はソースコードの修正が必要です。
Role の設定や何やらはご利用の環境に応じて設定してください。


3. SNS Topic に Lambda Fuction を 設定

3-1. SNS Topic の Subscription 先に Lambda を指定

Lambda Function の作成が完了した後は、その Lambda を Topic から呼び出す設定をします。

1-2. で設定した Topic を開いて Create Subscription します。


3-2. Sucscription の設定

Protocol に AWS Lambda を選択します。

Endpoint には Lambda Function が選べるようになっていると思うので、今回作成した Hipchat に送信する Lambda Function を選びます。


4. AWS Lambda が便利になっていて CI とかやりやすくなった的な小話

今回久々に Lambda を触ったのですが、環境変数を引っ張ってこれるようになったことで git にソースコードを置けるようになったり CI に含められるようになったりと、とても便利になりました。

あと、どうでもいい話ですが、Zip で upload したものも Lambda Function の設定画面からソースコードを編集することができるようになりました。

開発中とかちょっとした調整とかでとても精神に優しい機能追加です。

優しい世界って好きです。

あ、そうそう。

あと、すごく Bad KnowHow ですけど CloudWatch の Alarm にある Description に日本語で状況とか何をして欲しいのか書いておくとそれを Hipchat の本文に貼り付けるようにしてあるので便利です。多分。

で、本文に貼り付ける、ということは !!!
@here 付けておくとそのルームにいる全員にメンション通知するわけですよ !!!
なにそれすごいライフハック !!!
なにその完全な Bad KnowHow !!!

というわけで、本日のソースコード
AWS SNS で受け取った Topic を AWS Lambda 経由で HipChat に送る例



0 件のコメント :

コメントを投稿