0
0

AWSのlambdaを使って、KubernetesがダウンしたらSlackにアラートを流すようにしてみた

Posted at

はじめに

前回は Alertmanager を使って、Kubernetes で異常が生じた際に、Slack にアラートが流れるようにしました。

しかし、Alertmanager を Kubernetes クラスタ上に立てているため、クラスタごとダウンした際にはそれをアラートで気づくことができないという課題があります。

そこで今回は、Alertmanager のサービスの起動状況を監視する lambda を使用して、Alertmanager がダウンした時に Slack にアラートが送信されるようにしていこうと思います。

完成したコードはこちらから確認できます。

実装

コード自体は、Alertmanager のヘルスチェック用のエンドポイントにリクエストを送って、200 が返ってくるかを確認するだけのものです。

3 回リクエストをして、3 回とも失敗したらアラートを Slack に送るようにしています。

import requests
import os
from slack_sdk import WebClient


def notify_slack():
  slack_token = os.getenv('SLACK_API_TOKEN')
  if slack_token == None:
    print('SLACK_API_TOKEN environment variable is not set')
    exit(1)
  client = WebClient(token=slack_token)

  channel = os.getenv('SLACK_CHANNEL')
  if channel == None:
    print('SLACK_CHANNEL environment variable is not set')
    exit(1)
  client.chat_postMessage(channel=channel, text='Alert Manager is down! :fire:')


def check(path):
  res = requests.get(path)
  if res.status_code == 200:
    return True
  else:
    return False


def handler(*_):
  path = os.getenv('HEALTH_CHECK_URL')
  if path == None:
    print('HEALTH_CHECK_URL environment variable is not set')
    exit(1)

  check_count = int(os.getenv('CHECK_COUNT') or '3')
  ok = False

  print('Checking health of service...')
  for _ in range(check_count):
    ok = check(path)
    if ok:
      break

  if ok:
    print("Service is up and running")
  else:
    notify_slack()
    print('Service is down. Alert sent to slack')

これを lambda で定期実行することで、Alertmanager のサービスの起動状況を監視することができます。

まとめ

今回は、Alertmanager のサービスの起動状況を監視する lambda を作成しました。
これで k8s クラスタ自体がダウンした際にも Slack にアラートが送信されるようになりました。

ここまでで、サービスを監視する仕組みを粗方整えることができました。
そのため、次回はいよいよセトリ検索サイトを Kubernetes に移行していきたいと思います。

0
0
0

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
0
0