LoginSignup
27

More than 5 years have passed since last update.

Amazon CloudWatch のアラームを Microsoft Teams に投稿してみた

Posted at

Amazon Lambda の blueprint に「cloudwatch-alarm-to-slack」というのがあったので、
これを少し改良して CloudWatch のアラームを Microsoft Teams に投稿してみました。

こんなイメージです。
2016-12-15_15h42_11.png

SNS のトピックを作成

最初に、SNS のトピックを作成します。
2016-12-15_11h43_04.png

CloudWatch のアラームを作成

次に、CloudWatch のアラームを作成します。
何でもいいので、今回は EC2 の CPU 使用率のアラームを作成しました。
2016-12-15_11h56_45.png

Microsoft Teams のコネクタを作成

コネクタを追加するには、チャネル名の横にあるその他のオプションのアイコン … を
クリックしてから [コネクタ] をクリックします。
2016-12-15_12h34_19.png

Incomming Webhook を追加します。
2016-12-15_12h43_50.png

コネクタ名を入力します。
イメージを設定しておくと、メッセージの投稿者がわかりやすくなりますね。
2016-12-15_12h53_05.png

「作成」ボタンを押下すると、以下のように Webhook URL が表示されるので、コピーしておきます。
2016-12-15_12h55_06.png

AWS KMSで Webhook URL を暗号化

Microsoft Teams の Incomming Webhook を作成したときに生成された Webhook URL
AWS KMS (Key Management Service) で暗号化します。

AWS KMS でマスターキーを作成

暗号化するためのマスターキーを作成します。
2016-12-15_15h51_14.png

エイリアスを入力。
2016-12-15_15h56_52.png

作成できました。
2016-12-15_16h02_04.png

AWS CLI で Webhook URL を暗号化

暗号化は、AWS CLI で行います。
インストールしていない場合は、ここから取得できます。

マスターキーの「エイリアス名」を指定して、Webhook URL を暗号化します。

コマンド形式は以下の通り。

aws kms encrypt --key-id alias/<作成したエイリアス名> --plaintext="<WebhookURL>"

<作成したエイリアス名>と <WebhookURL> は置き換えてください。
ただし、<WebhookURL> の先頭の https:// は取り除きます。
そうしないとエラーになります。
私はここでハマりました。

例)

AWSCLI>aws kms encrypt --key-id alias/WebhookURL-MsTeams
--plaintext="outlook.office365.com/webhook/xxxx/IncomingWebhook/xxxxxx"
{
    "KeyId": "arn:aws:kms:us-east-1:xxxx:key/xxxxxxx",
    "CiphertextBlob": "〇〇〇〇〇〇"
}

出力された "CiphertextBlob" の値が「暗号化されたWebhook URL」となりますので、
必ず控えておきましょう。
※ 忘れてしまうと、後で見ることができないので、再度暗号化が必要になります。

Amazon Lambda の作成

Select blueprint 画面で「cloudwatch-alarm-to-slack-python」を選びます。
2016-12-15_17h15_22.png

トリガーは SNS で、トピックは最初に作成したものを選択します。
2016-12-15_17h18_38.png

コードを編集します。
slack channel は不要なので、以下の選択した行は削除します。
2016-12-15_17h35_55.png

後は、slack へのメッセージと Microsoft Teams へのメッセージはフォーマットが違うので、
その部分も変更します。

変更前

    slack_message = {
        'channel': SLACK_CHANNEL,
        'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
    }

    req = Request(HOOK_URL, json.dumps(slack_message))

変更後

    notification_message = {
        'title': "CloudWatchからのお知らせ",
        'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
    }

    req = Request(HOOK_URL, json.dumps(notification_message))

Lambda Function の完成
2016-12-15_17h40_08.png

トリガーを有効にします。
2016-12-15_18h09_36.png

確認してみる

どうやったら確認できるのか悩んだのですが、Amazon CloudWatch のドキュメントに載ってました。

AWS CLI でアラームの状態を ALARM に変更してしまいます。

AWSCLI>aws cloudwatch set-alarm-state --alarm-name Jenkins_CPU-70% --state-reason "test" --state-value ALARM

ちゃんと投稿されました。
2016-12-15_19h06_26.png

まとめ

今回は blueprint を少しだけいじっただけで、Microsoft Teams へ投稿することができました。
簡単に実現できるので、色々なことに使っていけるんじゃなかと思いました。

slack や Microsoft Teams などに情報を集約すると、とても便利ですよね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27