Datadog SSL証明書期限監視 Synthetic+Monitor一括登録方法

Datadog

 DatadogでSynthetic監視を大量に追加して、それをMonitor側でチマチマ全部の通知設定をやる。めっちゃ時間かかります!なので、スクリプトでAPI叩いて自動で登録する仕組みを作ってみました。

構成

  • サーバ
    • OS:centOS7
    • ディレクトリ
      • /usr/local/tool/datadog/ssl-cert
      • /usr/local/tool/datadog/ssl-cert/_temp/
      • /usr/local/tool/datadog/ssl-cert/add-history/
    • ファイル
      • sitelist.txt
        • 監視したいURL(1行1URLで記載しておく)
      • group.txt
        • 登録する監視項目に紐づけるタグをあらかじめ指定しておく
        • URL毎に変更したい場合は、ここを編集して、sitelistを別で用意する
      • add-result.txt
        • Syntheticで監視登録した内容を一時保存するファイル
      • add-result2.txt
        • Monitorで登録した内容を一時保存するファイル
        • 今後のために用意しただけなので動作の上では不要
      • id-yyyymmdd
        • public-id(datadog上で管理するための一意のID)とURLを紐づけたものを保存するファイル
        • 今後のために用意しただけなので動作の上では不要
  • 監視設定概要
    • Synthetic
      • 監視間隔:1日
      • 監視内容:証明書期限
      • アラート:期限切れ時
      • 通知:無し
      • 監視リージョン:AWS(tokyo)
    • Monitor
      • アラートタイミング:4320時間未満(3日未満)
      • 通知:watcher@piteki.comへメール送信

事前準備ファイル

sitelist.txt(以下はサンプル)

www.google.com
www.yahoo.co.jp
test.org

group.txt(以下はサンプル)

## group setting
## - 以下のコメント情報を参考にし追加するグループを下記に記入
group=\"env:ssl\",\"env:japan\",\"env:aws\",\"env:wild\"

#  ,\"env:japan\"
#  ,\"env:america\"
#  ,\"env:aws\"
#  ,\"env:gcp\"
#  ,\"env:wild\"

実行スクリプト

/usr/local/tool/datadog/ssl-cert/kanshi-add.sh

#!/bin/sh

## README
## * 利用方法
##   - sitelist.txt に監視したいURLを1行1URLで記載
##   - group.txt に所属させるグループ情報を記載
##   - 本scriptを実行

## デフォルト定義
APIKEY=aaaabbbbccccddddeeeeffffgggghhhh
APPKEY=1111222233334444555566667777888899990000
TEMP_FILE=/usr/local/tool/datadog/ssl-cert/_temp/add-result.txt
TEMP_FILE2=/usr/local/tool/datadog/ssl-cert/_temp/add-result2.txt
ADD_FILE=/usr/local/tool/datadog/ssl-cert/add-history/id-`date +%Y%m%d`
FILE=/usr/local/tool/datadog/ssl-cert/sitelist.txt

## group setting の読み込み
. /usr/local/tool/datadog/ssl-cert/group.txt

## API連携コマンド
cat ${FILE} | while read line;
do

## synthetics tests 登録API
curl -X POST "https://api.datadoghq.com/api/v1/synthetics/tests" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: ${APIKEY}" \
-H "DD-APPLICATION-KEY: ${APPKEY}" \
-d @- << EOF > ${TEMP_FILE}
    {
      "options": {
        "tick_every": 86400,
        "monitor_options": {
          "renotify_interval": 0,
          "notify_no_data": false,
          "new_host_delay": 300,
          "include_tags": true,
          "locked": false,
          "notify_audit": false
        }
      },
      "config": {
        "configVariables": [],
        "assertions": [
          {
            "operator": "isInMoreThan",
            "type": "certificate",
            "target": 0
          }
        ],
        "request": {
          "port": 443,
          "host": "${line}"
        }
      },
      "subtype": "ssl",
      "tags": [
        ${group}
      ],
      "locations": [
        "aws:ap-northeast-1"
      ],
      "message": "",
      "name": "${line}",
      "type": "api"
    }
EOF

## 実行結果からpublic_idを抽出
public_id=`cat ${TEMP_FILE} | awk -F ":" '{print $3}' | awk -F "\"" '{print $2}'`

## host名とpublic_idを紐づけたファイルの生成
echo ${public_id} ${line} >> ${ADD_FILE}

## monitor 登録API
curl -X POST "https://api.datadoghq.com/api/v1/monitor" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: ${APIKEY}" \
-H "DD-APPLICATION-KEY: ${APPKEY}" \
-d @- << EOF > ${TEMP_FILE2}
  {
    "restricted_roles": null,
    "tags": [],
    "deleted": null,
    "query": "min(last_1d):min:synthetics.ssl.time_to_expiry{check_id:${public_id}} < 4320",
    "message": "{{#is_alert}} 証明書期限が残り3日前となりました。 {{/is_alert}}\n{{#is_alert_recovery}}証明書が更新され残り期限が延長されました。{{/is_alert_recovery}}\n\n@watcher@piteki.com",
    "matching_downtimes": [],
    "multi": false,
    "name": "証明書監視 ${line} 有効期限3日前",
    "priority": null,
    "overall_state": "Alert",
    "type": "query alert",
    "options": {
      "notify_audit": false,
      "locked": false,
      "timeout_h": 0,
      "silenced": {},
      "include_tags": false,
      "no_data_timeframe": null,
      "require_full_window": false,
      "new_host_delay": 300,
      "notify_no_data": false,
      "renotify_interval": 0,
      "escalation_message": "",
      "thresholds": {
        "critical": 4320
      }
    }
  }
EOF

done

コメント