低コストで外形監視をサーバレスで構築する

自分のサービス向けに低コストで外形監視をサーバレスで行うためにOSSを開発したので、その紹介を行います。
YAML定義ファイルを使用し、AWSやGCPのサーバレス環境を使用して監視することができます。

機能概要

YAMLを使用して監視対象/通知対象の設定を行います。
コマンドラインからの外形監視やクラウド環境へのデプロイを行う事ができます。
現在(ver:0.3.2)は通知対象にSlack、クラウド環境にGCPのCloud Functionsのみ対応しています。

使用方法

インストール方法

Pythonを使用して作られているので、PyPIからpipコマンド経由でインストールする事ができます。

pip install monitapi

定義ファイルの作成方法

定義ファイルはYAMLを使用して作成します。
監視対象と通知対象を一つのファイルで定義します。
標準出力としてログも出力されるので、Slackへの通知が必要ない場合は notification_targets を記述しない事も可能です。

  • サンプル (targets.yaml)
monitor_targets:
    - github-monitapi
      method: "GET"
      url: https://github.com/fealone/monitapi
      status_code: 200
      timeout: 5
      retry: 3

notification_targets:
    - notification-to-slack:
      type: slack
      endpoint: {Incoming webhooksのエンドポイント}
      payload:
          blocks:
              -
                type: section
                text:
                    type: mrkdwn
                    text: "Target: {{url}}, Status: {{status_code}}, Expect: {{expected_status_code}}, Message: {{message}}"

詳細は公開しているドキュメントに記載しているので、そちらを確認してください。

monitapiの定義ファイル作成方法

コマンドによる実行

コマンドを使用して外形監視を実行する事ができます。
cronを使用したサーバによる監視などを想定しています。

  • 監視の実行
monitapi monitor targets.yaml

APIによる実行

APIを実行し、エンドポイントにリクエストする事で外形監視を実行する事もできます。
外形監視用のサーバを公開し、外部からスケジューラを使用して実行する場合などを想定しています。

  • APIの実行
monitapi serve
  • 監視の実行
curl http://{host}:8000/monitoring

Cloud Functionsへのデプロイ

現在、クラウド環境としてCloud Functionsへデプロイする事が可能です。
Cloud Schedulerを組み合わせて監視する事を想定しています。

monitapi deploy cloud_functions --name monitapi-example --file targets.yaml --options '{"--region": "asia-northeast1"}'
  • 監視の実行(動作確認)
curl http://{host}/monitoring

監視環境の構築

実際に外形監視を実行するための環境を構築する流れを紹介します。

cronによる監視

monitapiをインストールし、crontabを登録して実行します。
今回は環境を汚染しないためにvenvの上で実行します。

  • インストール
python -m venv /opt/monitapi
source /opt/monitapi/bin/activate
pip install monitapi
  • crontabの登録
*/10 * * * *  /opt/monitapi/bin/monitapi monitor {targets.yamlのパス}

Cloud Functionsによる監視

Cloud FunctionsとCloud Schedulerを組み合わせる事で、無料/低コストで監視環境を構築する事ができます。
Cloud Functionsは月200万回、Cloud Schedulerは3個のJobまで無料なので、その範囲であれば無料枠に抑える事ができます。
また、通知先もSlackのIncoming webhooksに対応しているので、これを組み合わせれば完全に無料で外形監視の仕組みを構築する事も可能です。

  • Cloud Functionsへのデプロイ
export GOOGLE_APPLICATION_CREDENTIALS=credentials.json
export GOOGLE_CLOUD_PROJECT={project_id}
monitapi deploy cloud_functions --name monitapi-example --file targets.yaml --options '{"--region": "asia-northeast1"}'
  • Cloud Schedulerの登録
  1. GCPコンソールからCloud Schedulerへアクセスする
  2. CREATE JOB を押下する
  3. Name, Frequency(監視頻度), Timezoneを入力する
  4. Targetを HTTP にし、 URLにCloud Functionsのリクエスト先を入力する
    http://{host}/monitoring
  5. HTTP methodを GET に変更する
  6. CREATE を押下して保存する

おわりに

monitapiはOSSとして公開しているので、何かあれば以下のリポジトリへよろしくお願いします。

fealone/monitapi
monitapi is something to monitor API(URL) by a serverless. - fealone/monitapi