Amazon Lambda の blueprint に「cloudwatch-alarm-to-slack」というのがあったので、
これを少し改良して CloudWatch のアラームを Microsoft Teams に投稿してみました。
SNS のトピックを作成
CloudWatch のアラームを作成
次に、CloudWatch のアラームを作成します。
何でもいいので、今回は EC2 の CPU 使用率のアラームを作成しました。
Microsoft Teams のコネクタを作成
コネクタを追加するには、チャネル名の横にあるその他のオプションのアイコン … を
クリックしてから [コネクタ] をクリックします。
コネクタ名を入力します。
イメージを設定しておくと、メッセージの投稿者がわかりやすくなりますね。
「作成」ボタンを押下すると、以下のように Webhook URL が表示されるので、コピーしておきます。
AWS KMSで Webhook URL を暗号化
Microsoft Teams の Incomming Webhook を作成したときに生成された Webhook URL を
AWS KMS (Key Management Service) で暗号化します。
AWS KMS でマスターキーを作成
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」を選びます。
トリガーは SNS で、トピックは最初に作成したものを選択します。
コードを編集します。
slack channel は不要なので、以下の選択した行は削除します。
後は、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))
確認してみる
どうやったら確認できるのか悩んだのですが、Amazon CloudWatch のドキュメントに載ってました。
AWS CLI でアラームの状態を ALARM に変更してしまいます。
AWSCLI>aws cloudwatch set-alarm-state --alarm-name Jenkins_CPU-70% --state-reason "test" --state-value ALARM
まとめ
今回は blueprint を少しだけいじっただけで、Microsoft Teams へ投稿することができました。
簡単に実現できるので、色々なことに使っていけるんじゃなかと思いました。
slack や Microsoft Teams などに情報を集約すると、とても便利ですよね。