webの死活監視が必要になったので、lambdaでどう作るか知り合いに相談したらgolangで作ったとのことで調べてやってみました。
通知はslackへ通知するようにします。
web監視
参考
var ( IncomingUrl string = "https://hooks.slack.com/services/xxx" // slack webhook url ) type HttpConfigSlice struct { Http []HttpConfig } type HttpConfig struct { Name string Host string Path string Proto string Domain string } func HttpTargets() []HttpConfig { return []HttpConfig{ HttpConfig{Name: "example", Host: "example.com", Path: "/", Proto: "https", Domain: "example.com"}, } }
func check(target config.HttpConfig) {
errorNum := 0
checkNum := 0
fatalNum := 2
errorMessage := ""
for checkNum < fatalNum {
checkNum += 1
targetPath := target.Proto + "://" + target.Host + target.Path
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Timeout: 5 * time.Second, Transport: tr}
req, err := http.NewRequest("GET", targetPath, nil)
if err != nil {
notification(err.Error())
return
}
req.Header.Add("Host", target.Domain)
resp, err := client.Do(req)
if err != nil {
notification(err.Error())
return
}
if resp.StatusCode != 200 {
errorNum += 1
if (errorNum >= fatalNum) {
errorMessage += targetPath + " [" + target.Name + "] " + "returns " + fmt.Sprint(resp.StatusCode) + "\n"
}
} else {
break
}
defer resp.Body.Close()
}
if errorMessage != "" {
notification(errorMessage)
}
}
通知
func notification( errorMessage string){
attachment := slack.Attachment{
Color: "danger",
Text: "<!channel> " + errorMessage,
Footer: "slack lambda api",
Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)),
}
msg := slack.WebhookMessage{
Attachments: []slack.Attachment{attachment},
}
err := slack.PostWebhook(config.IncomingUrl, &msg)
if err != nil {
fmt.Println(err)
}
}
まとめ
死活監視はサービスに必要ですね。
あとgolangは便利やなー。