API の死活監視と証明書の有効期限切れ(※)のチェックを golang を利用して行い、結果を Line Notify を使って通知します。
※ Let's Encrypt を利用してるけど 3ヶ月で有効期限切れになる
golang は会社で新しいプロダウトに利用する可能性があったので試しに使ってみることにしました。
前準備
- Golang の開発環境の構築(以下のサイト参考にした)
- Line Notify 準備
仕様
引数にチェック対象のエンドポイントの URI と Line Notify 用の Token を設定できるようにする
$ apichecker -endpoint=${エンドポイントURI} -token=${Line Notify 用 Token}
ソースコード
$ go version
go version go1.9 darwin/amd64
apichecker.go
package main
import (
"fmt"
"net/http"
"flag"
"log"
"net/url"
"strings"
"io/ioutil"
)
func main() {
var endpoint = flag.String("endpoint", "", "check target Endpoint URL")
var lineToken = flag.String("token", "", "LINE notify token")
flag.Parse()
var apiResult = getAPI(*endpoint)
var result = postLINE(*lineToken, apiResult)
fmt.Printf("LINE Post result [%t]\n", result)
}
func getAPI(endpoint string) string {
if endpoint == "" {
log.Fatal("not endpoint")
return "not endpoint"
}
var result = ""
resp, err := http.Get(endpoint)
if err != nil {
result = fmt.Sprintf("NG [%s]", err)
} else {
defer resp.Body.Close()
result = fmt.Sprintf("OK [%s]", endpoint)
}
return result
}
func postLINE(token string, message string) bool {
if token == "" {
log.Fatal("not token")
return false
} else if message == "" {
log.Fatal("not text")
return false
}
data := url.Values{"message": {message}}
r, _ := http.NewRequest("POST", "https://notify-api.line.me/api/notify", strings.NewReader(data.Encode()))
r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
resp, err := http.DefaultClient.Do(r)
if err != nil {
log.Fatal(err)
return false
}
defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
return false
}
return true
}
※ LINE NotifyをGoで送る を参考にしました。
実行結果
OK の場合
$ go run apichecker.go -endpoint=https://www.yahoo.co.jp -token=${Line Notify 用 Token}
LINE Post result [true]
NG の場合(証明書エラー)
$ go run apichecker.go -endpoint=https://www.yahoo.jp -token=${Line Notify 用 Token}
LINE Post result [true]